1" Tests for the 'find' command completion.
2
3" Do all the tests in a separate window to avoid E211 when we recursively
4" delete the Xfind directory during cleanup
5func Test_find_complete()
6  set belloff=all
7
8  " On windows a stale "Xfind" directory may exist, remove it so that
9  " we start from a clean state.
10  call delete("Xfind", "rf")
11  let cwd = getcwd()
12  let test_out = cwd . '/test.out'
13  call mkdir('Xfind')
14  cd Xfind
15
16  new
17  set path=
18  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
19  close
20
21  new
22  set path=.
23  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
24  close
25
26  new
27  set path=.,,
28  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
29  close
30
31  new
32  set path=./**
33  call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
34  close
35
36  " We shouldn't find any file till this point
37
38  call mkdir('in/path', 'p')
39  call chdir(cwd)
40  call writefile(['Holy Grail'], 'Xfind/file.txt')
41  call writefile(['Jimmy Hoffa'], 'Xfind/in/file.txt')
42  call writefile(['Another Holy Grail'], 'Xfind/in/stuff.txt')
43  call writefile(['E.T.'], 'Xfind/in/path/file.txt')
44
45  new
46  set path=Xfind/**
47  call feedkeys(":find file\t\n", "xt")
48  call assert_equal('Holy Grail', getline(1))
49  call feedkeys(":find file\t\t\n", "xt")
50  call assert_equal('Jimmy Hoffa', getline(1))
51  call feedkeys(":find file\t\t\t\n", "xt")
52  call assert_equal('E.T.', getline(1))
53
54  " Rerun the previous three find completions, using fullpath in 'path'
55  exec "set path=" . cwd . "/Xfind/**"
56
57  call feedkeys(":find file\t\n", "xt")
58  call assert_equal('Holy Grail', getline(1))
59  call feedkeys(":find file\t\t\n", "xt")
60  call assert_equal('Jimmy Hoffa', getline(1))
61  call feedkeys(":find file\t\t\t\n", "xt")
62  call assert_equal('E.T.', getline(1))
63
64  " Same steps again, using relative and fullpath items that point to the same
65  " recursive location.
66  " This is to test that there are no duplicates in the completion list.
67  set path+=Xfind/**
68  call feedkeys(":find file\t\n", "xt")
69  call assert_equal('Holy Grail', getline(1))
70  call feedkeys(":find file\t\t\n", "xt")
71  call assert_equal('Jimmy Hoffa', getline(1))
72  call feedkeys(":find file\t\t\t\n", "xt")
73  call assert_equal('E.T.', getline(1))
74  call feedkeys(":find file\t\t\n", "xt")
75
76  " Test find completion for directory of current buffer, which at this point
77  " is Xfind/in/file.txt.
78  set path=.
79  call feedkeys(":find st\t\n", "xt")
80  call assert_equal('Another Holy Grail', getline(1))
81
82  " Test find completion for empty path item ",," which is the current
83  " directory
84  cd Xfind
85  set path=,,
86  call feedkeys(":find f\t\n", "xt")
87  call assert_equal('Holy Grail', getline(1))
88
89  " Test that find completion on directory appends a slash
90  call feedkeys(":find in/pa\tfile.txt\n", "xt")
91  call assert_equal('E.T.', getline(1))
92  call feedkeys(":find ./i\tstuff.txt\n", "xt")
93  call assert_equal('Another Holy Grail', getline(1))
94
95  " Test shortening of
96  "
97  "    foo/x/bar/voyager.txt
98  "    foo/y/bar/voyager.txt
99  "
100  " When current directory is above foo/ they should be shortened to (in order
101  " of appearance):
102  "
103  "    x/bar/voyager.txt
104  "    y/bar/voyager.txt
105  call mkdir('foo/x/bar', 'p')
106  call mkdir('foo/y/bar', 'p')
107  call writefile(['Voyager 1'], 'foo/x/bar/voyager.txt')
108  call writefile(['Voyager 2'], 'foo/y/bar/voyager.txt')
109
110  exec "set path=" . cwd . "/Xfind/**"
111  call feedkeys(":find voyager\t\n", "xt")
112  call assert_equal('Voyager 1', getline(1))
113  call feedkeys(":find voyager\t\t\n", "xt")
114  call assert_equal('Voyager 2', getline(1))
115
116  "
117  " When current directory is .../foo/y/bar they should be shortened to (in
118  " order of appearance):
119  "
120  "    ./voyager.txt
121  "    x/bar/voyager.txt
122  cd foo/y/bar
123  call feedkeys(":find voyager\t\n", "xt")
124  call assert_equal('Voyager 2', getline(1))
125  call feedkeys(":find voyager\t\t\n", "xt")
126  call assert_equal('Voyager 1', getline(1))
127
128  " Check the opposite too:
129  cd ../../x/bar
130  call feedkeys(":find voyager\t\n", "xt")
131  call assert_equal('Voyager 1', getline(1))
132  call feedkeys(":find voyager\t\t\n", "xt")
133  call assert_equal('Voyager 2', getline(1))
134
135  " Check for correct handling of shorten_fname()'s behavior on windows
136  call chdir(cwd .. "/Xfind/in")
137  call feedkeys(":find file\t\n", "xt")
138  call assert_equal('Jimmy Hoffa', getline(1))
139
140  " Test for relative to current buffer 'path' item
141  call chdir(cwd . "/Xfind/")
142  set path=./path
143  " Open the file where Jimmy Hoffa is found
144  e in/file.txt
145  " Find the file containing 'E.T.' in the Xfind/in/path directory
146  call feedkeys(":find file\t\n", "xt")
147  call assert_equal('E.T.', getline(1))
148
149  " Test that completion works when path=.,,
150  set path=.,,
151  " Open Jimmy Hoffa file
152  e in/file.txt
153  call assert_equal('Jimmy Hoffa', getline(1))
154
155  " Search for the file containing Holy Grail in same directory as in/path.txt
156  call feedkeys(":find stu\t\n", "xt")
157  call assert_equal('Another Holy Grail', getline(1))
158
159  enew | only
160  call chdir(cwd)
161  call delete('Xfind', 'rf')
162  set path&
163endfunc
164
165" vim: shiftwidth=2 sts=2 expandtab
166