blob: a5e18b9570619adb6baaaa0b0ea36c6ba739d495 [file] [log] [blame]
Bram Moolenaared71ed32019-01-30 22:13:35 +01001" Test findfile() and finddir()
2
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003let s:files = [ 'Xfinddir1/foo',
4 \ 'Xfinddir1/bar',
5 \ 'Xfinddir1/Xdir2/foo',
6 \ 'Xfinddir1/Xdir2/foobar',
7 \ 'Xfinddir1/Xdir2/Xdir3/bar',
8 \ 'Xfinddir1/Xdir2/Xdir3/barfoo' ]
Bram Moolenaared71ed32019-01-30 22:13:35 +01009
10func CreateFiles()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010011 call mkdir('Xfinddir1/Xdir2/Xdir3/Xdir2', 'p')
Bram Moolenaared71ed32019-01-30 22:13:35 +010012 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
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010019 " than doing a recursive delete('Xfinddir1', 'rf').
Bram Moolenaared71ed32019-01-30 22:13:35 +010020 for f in s:files
21 call delete(f)
22 endfor
23
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010024 call delete('Xfinddir1/Xdir2/Xdir3/Xdir2', 'd')
25 call delete('Xfinddir1/Xdir2/Xdir3', 'd')
26 call delete('Xfinddir1/Xdir2', 'd')
27 call delete('Xfinddir1', 'd')
Bram Moolenaared71ed32019-01-30 22:13:35 +010028endfunc
29
30" Test findfile({name} [, {path} [, {count}]])
Bram Moolenaardc9a0812017-02-23 18:46:50 +010031func Test_findfile()
Bram Moolenaared71ed32019-01-30 22:13:35 +010032 let save_path = &path
33 let save_shellslash = &shellslash
34 let save_dir = getcwd()
35 set shellslash
36 call CreateFiles()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010037 cd Xfinddir1
Bram Moolenaared71ed32019-01-30 22:13:35 +010038 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'))
Bram Moolenaara4208962019-08-24 20:50:19 +020053 call assert_equal('Xdir2/foobar', 'foobar'->findfile())
Bram Moolenaared71ed32019-01-30 22:13:35 +010054
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', ';'))
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010086 call assert_match('.*/Xfinddir1/Xdir2/foo', findfile('foo', ';'))
87 call assert_match('.*/Xfinddir1/Xdir2/foo', findfile('foo', ';', 1))
88 call assert_match('.*/Xfinddir1/foo', findfile('foo', ';', 2))
89 call assert_match('.*/Xfinddir1/foo', findfile('foo', ';', 2))
90 call assert_match('.*/Xfinddir1/Xdir2/foo', findfile('foo', 'Xdir2;', 1))
Bram Moolenaared71ed32019-01-30 22:13:35 +010091 call assert_equal('', findfile('foo', 'Xdir2;', 2))
92
93 " List l should have at least 2 values (possibly more if foo file
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010094 " happens to be found upwards above Xfinddir1).
Bram Moolenaared71ed32019-01-30 22:13:35 +010095 let l = findfile('foo', ';', -1)
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +010096 call assert_match('.*/Xfinddir1/Xdir2/foo', l[0])
97 call assert_match('.*/Xfinddir1/foo', l[1])
Bram Moolenaared71ed32019-01-30 22:13:35 +010098
99 " Test upwards search with stop-directory.
100 cd Xdir2
zeertzjq764526e2024-07-11 22:24:15 +0200101 let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/Xdir3/', -1)
102 call assert_equal(1, len(l))
103 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
104 let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/Xdir3', -1)
105 call assert_equal(1, len(l))
106 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
107 let l = findfile('bar', ';../', -1)
108 call assert_equal(1, len(l))
109 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
zeertzjq1ee74202024-07-12 07:29:14 +0200110 let l = findfile('bar', ';..', -1)
111 call assert_equal(1, len(l))
112 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
zeertzjq764526e2024-07-11 22:24:15 +0200113
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100114 let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/', -1)
Bram Moolenaared71ed32019-01-30 22:13:35 +0100115 call assert_equal(1, len(l))
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100116 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
zeertzjqe6ab23b2024-07-11 22:22:26 +0200117 let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2', -1)
118 call assert_equal(1, len(l))
119 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
zeertzjq764526e2024-07-11 22:24:15 +0200120 let l = findfile('bar', ';../../', -1)
121 call assert_equal(1, len(l))
122 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
zeertzjq1ee74202024-07-12 07:29:14 +0200123 let l = findfile('bar', ';../..', -1)
124 call assert_equal(1, len(l))
125 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
Bram Moolenaared71ed32019-01-30 22:13:35 +0100126
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100127 let l = findfile('bar', ';' . save_dir . '/Xfinddir1/', -1)
Bram Moolenaared71ed32019-01-30 22:13:35 +0100128 call assert_equal(2, len(l))
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100129 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
130 call assert_match('.*/Xfinddir1/bar', l[1])
zeertzjqe6ab23b2024-07-11 22:22:26 +0200131 let l = findfile('bar', ';' . save_dir . '/Xfinddir1', -1)
132 call assert_equal(2, len(l))
133 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
134 call assert_match('.*/Xfinddir1/bar', l[1])
zeertzjq764526e2024-07-11 22:24:15 +0200135 let l = findfile('bar', ';../../../', -1)
136 call assert_equal(2, len(l))
137 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
138 call assert_match('.*/Xfinddir1/bar', l[1])
zeertzjq1ee74202024-07-12 07:29:14 +0200139 let l = findfile('bar', ';../../..', -1)
140 call assert_equal(2, len(l))
141 call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
142 call assert_match('.*/Xfinddir1/bar', l[1])
Bram Moolenaared71ed32019-01-30 22:13:35 +0100143
144 " Test combined downwards and upwards search from Xdir2/.
145 cd ../..
146 call assert_equal('Xdir3/bar', findfile('bar', '**;', 1))
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100147 call assert_match('.*/Xfinddir1/bar', findfile('bar', '**;', 2))
Bram Moolenaared71ed32019-01-30 22:13:35 +0100148
149 bwipe!
Bram Moolenaar3503d7c2019-11-09 20:10:17 +0100150 call chdir(save_dir)
Bram Moolenaared71ed32019-01-30 22:13:35 +0100151 call CleanFiles()
152 let &path = save_path
153 let &shellslash = save_shellslash
154endfunc
155
Bram Moolenaar71b13e92019-02-04 21:14:45 +0100156func Test_findfile_error()
157 call assert_fails('call findfile([])', 'E730:')
158 call assert_fails('call findfile("x", [])', 'E730:')
159 call assert_fails('call findfile("x", "", [])', 'E745:')
160 call assert_fails('call findfile("x", "**x")', 'E343:')
161 call assert_fails('call findfile("x", repeat("x", 5000))', 'E854:')
162endfunc
163
Bram Moolenaared71ed32019-01-30 22:13:35 +0100164" Test finddir({name} [, {path} [, {count}]])
165func Test_finddir()
166 let save_path = &path
167 let save_shellslash = &shellslash
168 let save_dir = getcwd()
169 set path=,,
zeertzjqe7b98ab2024-07-11 21:48:09 +0200170 set shellslash
Bram Moolenaared71ed32019-01-30 22:13:35 +0100171 call CreateFiles()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100172 cd Xfinddir1
Bram Moolenaared71ed32019-01-30 22:13:35 +0100173
174 call assert_equal('Xdir2', finddir('Xdir2'))
Bram Moolenaara4208962019-08-24 20:50:19 +0200175 call assert_equal('', 'Xdir3'->finddir())
Bram Moolenaared71ed32019-01-30 22:13:35 +0100176
177 " Files should not be found (findfile() finds them).
178 call assert_equal('', finddir('foo'))
179
180 call assert_equal('Xdir2', finddir('Xdir2', '**'))
181 call assert_equal('Xdir2/Xdir3', finddir('Xdir3', '**'))
182
183 call assert_equal('Xdir2', finddir('Xdir2', '**', 1))
184 call assert_equal('Xdir2/Xdir3/Xdir2', finddir('Xdir2', '**', 2))
185 call assert_equal(['Xdir2',
186 \ 'Xdir2/Xdir3/Xdir2'], finddir('Xdir2', '**', -1))
187
188 call assert_equal('Xdir2', finddir('Xdir2', '**1'))
189 call assert_equal('Xdir2', finddir('Xdir2', '**0'))
190 call assert_equal('Xdir2/Xdir3', finddir('Xdir3', '**1'))
191 call assert_equal('', finddir('Xdir3', '**0'))
192
193 " Test upwards dir search.
194 cd Xdir2/Xdir3
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100195 call assert_match('.*/Xfinddir1', finddir('Xfinddir1', ';'))
Bram Moolenaared71ed32019-01-30 22:13:35 +0100196
197 " Test upwards search with stop-directory.
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100198 call assert_match('.*/Xfinddir1', finddir('Xfinddir1', ';' . save_dir . '/'))
199 call assert_equal('', finddir('Xfinddir1', ';' . save_dir . '/Xfinddir1/'))
Bram Moolenaared71ed32019-01-30 22:13:35 +0100200
201 " Test combined downwards and upwards dir search from Xdir2/.
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100202 cd ..
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100203 call assert_match('.*/Xfinddir1', finddir('Xfinddir1', '**;', 1))
Bram Moolenaared71ed32019-01-30 22:13:35 +0100204 call assert_equal('Xdir3/Xdir2', finddir('Xdir2', '**;', 1))
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100205 call assert_match('.*/Xfinddir1/Xdir2', finddir('Xdir2', '**;', 2))
Bram Moolenaared71ed32019-01-30 22:13:35 +0100206 call assert_equal('Xdir3', finddir('Xdir3', '**;', 1))
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100207
Bram Moolenaar3503d7c2019-11-09 20:10:17 +0100208 call chdir(save_dir)
Bram Moolenaared71ed32019-01-30 22:13:35 +0100209 call CleanFiles()
210 let &path = save_path
211 let &shellslash = save_shellslash
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100212endfunc
Bram Moolenaar71b13e92019-02-04 21:14:45 +0100213
214func Test_finddir_error()
215 call assert_fails('call finddir([])', 'E730:')
216 call assert_fails('call finddir("x", [])', 'E730:')
217 call assert_fails('call finddir("x", "", [])', 'E745:')
218 call assert_fails('call finddir("x", "**x")', 'E343:')
219 call assert_fails('call finddir("x", repeat("x", 5000))', 'E854:')
220endfunc
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +0100221
222" Test for the :find, :sfind and :tabfind commands
223func Test_find_cmd()
224 new
225 let save_path = &path
226 let save_dir = getcwd()
227 set path=.,./**/*
228 call CreateFiles()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100229 cd Xfinddir1
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +0100230
231 " Test for :find
232 find foo
233 call assert_equal('foo', expand('%:.'))
234 2find foo
235 call assert_equal('Xdir2/foo', expand('%:.'))
236 call assert_fails('3find foo', 'E347:')
237
238 " Test for :sfind
239 enew
240 sfind barfoo
241 call assert_equal('Xdir2/Xdir3/barfoo', expand('%:.'))
242 call assert_equal(3, winnr('$'))
243 close
244 call assert_fails('sfind baz', 'E345:')
245 call assert_equal(2, winnr('$'))
246
247 " Test for :tabfind
248 enew
249 tabfind foobar
250 call assert_equal('Xdir2/foobar', expand('%:.'))
251 call assert_equal(2, tabpagenr('$'))
252 tabclose
253 call assert_fails('tabfind baz', 'E345:')
254 call assert_equal(1, tabpagenr('$'))
255
256 call chdir(save_dir)
257 call CleanFiles()
258 let &path = save_path
259 close
Bram Moolenaar2d10cd42020-03-19 14:37:30 +0100260
261 call assert_fails('find', 'E471:')
262 call assert_fails('sfind', 'E471:')
263 call assert_fails('tabfind', 'E471:')
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +0100264endfunc
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200265
Christian Brabandt7a4ca322021-07-25 15:08:05 +0200266func Test_find_non_existing_path()
267 new
268 let save_path = &path
269 let save_dir = getcwd()
Bram Moolenaar70e67252022-09-27 19:34:35 +0100270 call mkdir('dir1/dir2', 'pR')
Christian Brabandt7a4ca322021-07-25 15:08:05 +0200271 call writefile([], 'dir1/file.txt')
272 call writefile([], 'dir1/dir2/base.txt')
273 call chdir('dir1/dir2')
274 e base.txt
275 set path=../include
276
277 call assert_fails(':find file.txt', 'E345:')
278
279 call chdir(save_dir)
280 bw!
Christian Brabandt7a4ca322021-07-25 15:08:05 +0200281 let &path = save_path
282endfunc
283
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200284" vim: shiftwidth=2 sts=2 expandtab