1209d3874SBram Moolenaar" Tests for the 'find' command completion.
2209d3874SBram Moolenaar
3209d3874SBram Moolenaar" Do all the tests in a separate window to avoid E211 when we recursively
4209d3874SBram Moolenaar" delete the Xfind directory during cleanup
5209d3874SBram Moolenaarfunc Test_find_complete()
6209d3874SBram Moolenaar  set belloff=all
7209d3874SBram Moolenaar
8209d3874SBram Moolenaar  " On windows a stale "Xfind" directory may exist, remove it so that
9209d3874SBram Moolenaar  " we start from a clean state.
10209d3874SBram Moolenaar  call delete("Xfind", "rf")
11209d3874SBram Moolenaar  let cwd = getcwd()
12209d3874SBram Moolenaar  let test_out = cwd . '/test.out'
13209d3874SBram Moolenaar  call mkdir('Xfind')
14209d3874SBram Moolenaar  cd Xfind
15209d3874SBram Moolenaar
16209d3874SBram Moolenaar  new
17209d3874SBram Moolenaar  set path=
182d10cd47SBram Moolenaar  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
19209d3874SBram Moolenaar  close
20209d3874SBram Moolenaar
21209d3874SBram Moolenaar  new
22209d3874SBram Moolenaar  set path=.
232d10cd47SBram Moolenaar  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
24209d3874SBram Moolenaar  close
25209d3874SBram Moolenaar
26209d3874SBram Moolenaar  new
27209d3874SBram Moolenaar  set path=.,,
282d10cd47SBram Moolenaar  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
29209d3874SBram Moolenaar  close
30209d3874SBram Moolenaar
31209d3874SBram Moolenaar  new
32209d3874SBram Moolenaar  set path=./**
332d10cd47SBram Moolenaar  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
34209d3874SBram Moolenaar  close
35209d3874SBram Moolenaar
36209d3874SBram Moolenaar  " We shouldn't find any file till this point
37209d3874SBram Moolenaar
38209d3874SBram Moolenaar  call mkdir('in/path', 'p')
393503d7c9SBram Moolenaar  call chdir(cwd)
40209d3874SBram Moolenaar  call writefile(['Holy Grail'], 'Xfind/file.txt')
41209d3874SBram Moolenaar  call writefile(['Jimmy Hoffa'], 'Xfind/in/file.txt')
42209d3874SBram Moolenaar  call writefile(['Another Holy Grail'], 'Xfind/in/stuff.txt')
43209d3874SBram Moolenaar  call writefile(['E.T.'], 'Xfind/in/path/file.txt')
44209d3874SBram Moolenaar
45209d3874SBram Moolenaar  new
46209d3874SBram Moolenaar  set path=Xfind/**
47209d3874SBram Moolenaar  call feedkeys(":find file\t\n", "xt")
48209d3874SBram Moolenaar  call assert_equal('Holy Grail', getline(1))
49209d3874SBram Moolenaar  call feedkeys(":find file\t\t\n", "xt")
50209d3874SBram Moolenaar  call assert_equal('Jimmy Hoffa', getline(1))
51209d3874SBram Moolenaar  call feedkeys(":find file\t\t\t\n", "xt")
52209d3874SBram Moolenaar  call assert_equal('E.T.', getline(1))
53209d3874SBram Moolenaar
54209d3874SBram Moolenaar  " Rerun the previous three find completions, using fullpath in 'path'
55209d3874SBram Moolenaar  exec "set path=" . cwd . "/Xfind/**"
56209d3874SBram Moolenaar
57209d3874SBram Moolenaar  call feedkeys(":find file\t\n", "xt")
58209d3874SBram Moolenaar  call assert_equal('Holy Grail', getline(1))
59209d3874SBram Moolenaar  call feedkeys(":find file\t\t\n", "xt")
60209d3874SBram Moolenaar  call assert_equal('Jimmy Hoffa', getline(1))
61209d3874SBram Moolenaar  call feedkeys(":find file\t\t\t\n", "xt")
62209d3874SBram Moolenaar  call assert_equal('E.T.', getline(1))
63209d3874SBram Moolenaar
64209d3874SBram Moolenaar  " Same steps again, using relative and fullpath items that point to the same
65209d3874SBram Moolenaar  " recursive location.
66209d3874SBram Moolenaar  " This is to test that there are no duplicates in the completion list.
67209d3874SBram Moolenaar  set path+=Xfind/**
68209d3874SBram Moolenaar  call feedkeys(":find file\t\n", "xt")
69209d3874SBram Moolenaar  call assert_equal('Holy Grail', getline(1))
70209d3874SBram Moolenaar  call feedkeys(":find file\t\t\n", "xt")
71209d3874SBram Moolenaar  call assert_equal('Jimmy Hoffa', getline(1))
72209d3874SBram Moolenaar  call feedkeys(":find file\t\t\t\n", "xt")
73209d3874SBram Moolenaar  call assert_equal('E.T.', getline(1))
74209d3874SBram Moolenaar  call feedkeys(":find file\t\t\n", "xt")
75209d3874SBram Moolenaar
76209d3874SBram Moolenaar  " Test find completion for directory of current buffer, which at this point
77209d3874SBram Moolenaar  " is Xfind/in/file.txt.
78209d3874SBram Moolenaar  set path=.
79209d3874SBram Moolenaar  call feedkeys(":find st\t\n", "xt")
80209d3874SBram Moolenaar  call assert_equal('Another Holy Grail', getline(1))
81209d3874SBram Moolenaar
82209d3874SBram Moolenaar  " Test find completion for empty path item ",," which is the current
83209d3874SBram Moolenaar  " directory
84209d3874SBram Moolenaar  cd Xfind
85209d3874SBram Moolenaar  set path=,,
86209d3874SBram Moolenaar  call feedkeys(":find f\t\n", "xt")
87209d3874SBram Moolenaar  call assert_equal('Holy Grail', getline(1))
88209d3874SBram Moolenaar
898a37b032SBram Moolenaar  " Test that find completion on directory appends a slash
908a37b032SBram Moolenaar  call feedkeys(":find in/pa\tfile.txt\n", "xt")
918a37b032SBram Moolenaar  call assert_equal('E.T.', getline(1))
928a37b032SBram Moolenaar  call feedkeys(":find ./i\tstuff.txt\n", "xt")
938a37b032SBram Moolenaar  call assert_equal('Another Holy Grail', getline(1))
948a37b032SBram Moolenaar
95209d3874SBram Moolenaar  " Test shortening of
96209d3874SBram Moolenaar  "
97209d3874SBram Moolenaar  "    foo/x/bar/voyager.txt
98209d3874SBram Moolenaar  "    foo/y/bar/voyager.txt
99209d3874SBram Moolenaar  "
100209d3874SBram Moolenaar  " When current directory is above foo/ they should be shortened to (in order
101209d3874SBram Moolenaar  " of appearance):
102209d3874SBram Moolenaar  "
103209d3874SBram Moolenaar  "    x/bar/voyager.txt
104209d3874SBram Moolenaar  "    y/bar/voyager.txt
105209d3874SBram Moolenaar  call mkdir('foo/x/bar', 'p')
106209d3874SBram Moolenaar  call mkdir('foo/y/bar', 'p')
107209d3874SBram Moolenaar  call writefile(['Voyager 1'], 'foo/x/bar/voyager.txt')
108209d3874SBram Moolenaar  call writefile(['Voyager 2'], 'foo/y/bar/voyager.txt')
109209d3874SBram Moolenaar
110209d3874SBram Moolenaar  exec "set path=" . cwd . "/Xfind/**"
111209d3874SBram Moolenaar  call feedkeys(":find voyager\t\n", "xt")
112209d3874SBram Moolenaar  call assert_equal('Voyager 1', getline(1))
113209d3874SBram Moolenaar  call feedkeys(":find voyager\t\t\n", "xt")
114209d3874SBram Moolenaar  call assert_equal('Voyager 2', getline(1))
115209d3874SBram Moolenaar
116209d3874SBram Moolenaar  "
117209d3874SBram Moolenaar  " When current directory is .../foo/y/bar they should be shortened to (in
118209d3874SBram Moolenaar  " order of appearance):
119209d3874SBram Moolenaar  "
120209d3874SBram Moolenaar  "    ./voyager.txt
121209d3874SBram Moolenaar  "    x/bar/voyager.txt
122209d3874SBram Moolenaar  cd foo/y/bar
123209d3874SBram Moolenaar  call feedkeys(":find voyager\t\n", "xt")
124209d3874SBram Moolenaar  call assert_equal('Voyager 2', getline(1))
125209d3874SBram Moolenaar  call feedkeys(":find voyager\t\t\n", "xt")
126209d3874SBram Moolenaar  call assert_equal('Voyager 1', getline(1))
127209d3874SBram Moolenaar
128209d3874SBram Moolenaar  " Check the opposite too:
129209d3874SBram Moolenaar  cd ../../x/bar
130209d3874SBram Moolenaar  call feedkeys(":find voyager\t\n", "xt")
131209d3874SBram Moolenaar  call assert_equal('Voyager 1', getline(1))
132209d3874SBram Moolenaar  call feedkeys(":find voyager\t\t\n", "xt")
133209d3874SBram Moolenaar  call assert_equal('Voyager 2', getline(1))
134209d3874SBram Moolenaar
135209d3874SBram Moolenaar  " Check for correct handling of shorten_fname()'s behavior on windows
1363503d7c9SBram Moolenaar  call chdir(cwd .. "/Xfind/in")
137209d3874SBram Moolenaar  call feedkeys(":find file\t\n", "xt")
138209d3874SBram Moolenaar  call assert_equal('Jimmy Hoffa', getline(1))
139209d3874SBram Moolenaar
140209d3874SBram Moolenaar  " Test for relative to current buffer 'path' item
1413503d7c9SBram Moolenaar  call chdir(cwd . "/Xfind/")
142209d3874SBram Moolenaar  set path=./path
143209d3874SBram Moolenaar  " Open the file where Jimmy Hoffa is found
144209d3874SBram Moolenaar  e in/file.txt
145209d3874SBram Moolenaar  " Find the file containing 'E.T.' in the Xfind/in/path directory
146209d3874SBram Moolenaar  call feedkeys(":find file\t\n", "xt")
147209d3874SBram Moolenaar  call assert_equal('E.T.', getline(1))
148209d3874SBram Moolenaar
149209d3874SBram Moolenaar  " Test that completion works when path=.,,
150209d3874SBram Moolenaar  set path=.,,
151209d3874SBram Moolenaar  " Open Jimmy Hoffa file
152209d3874SBram Moolenaar  e in/file.txt
153209d3874SBram Moolenaar  call assert_equal('Jimmy Hoffa', getline(1))
154209d3874SBram Moolenaar
155209d3874SBram Moolenaar  " Search for the file containing Holy Grail in same directory as in/path.txt
156209d3874SBram Moolenaar  call feedkeys(":find stu\t\n", "xt")
157209d3874SBram Moolenaar  call assert_equal('Another Holy Grail', getline(1))
158209d3874SBram Moolenaar
159209d3874SBram Moolenaar  enew | only
1603503d7c9SBram Moolenaar  call chdir(cwd)
161209d3874SBram Moolenaar  call delete('Xfind', 'rf')
162209d3874SBram Moolenaar  set path&
163209d3874SBram Moolenaarendfunc
164*6d91bcb4SBram Moolenaar
165*6d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
166