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