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