xref: /vim-8.2.3635/src/testdir/test_cd.vim (revision 6938e27a)
1" Test for :cd and chdir()
2
3source shared.vim
4
5func Test_cd_large_path()
6  " This used to crash with a heap write overflow.
7  call assert_fails('cd ' . repeat('x', 5000), 'E472:')
8endfunc
9
10func Test_cd_up_and_down()
11  let path = getcwd()
12  cd ..
13  call assert_notequal(path, getcwd())
14  exe 'cd ' .. fnameescape(path)
15  call assert_equal(path, getcwd())
16endfunc
17
18func Test_cd_no_arg()
19  if has('unix')
20    " Test that cd without argument goes to $HOME directory on Unix systems.
21    let path = getcwd()
22    cd
23    call assert_equal($HOME, getcwd())
24    call assert_notequal(path, getcwd())
25    exe 'cd ' .. fnameescape(path)
26    call assert_equal(path, getcwd())
27  else
28    " Test that cd without argument echoes cwd on non-Unix systems.
29    call assert_match(getcwd(), execute('cd'))
30  endif
31endfunc
32
33func Test_cd_minus()
34  " Test the  :cd -  goes back to the previous directory.
35  let path = getcwd()
36  cd ..
37  let path_dotdot = getcwd()
38  call assert_notequal(path, path_dotdot)
39  cd -
40  call assert_equal(path, getcwd())
41  cd -
42  call assert_equal(path_dotdot, getcwd())
43  cd -
44  call assert_equal(path, getcwd())
45
46  " Test for :cd - without a previous directory
47  let lines =<< trim [SCRIPT]
48    call assert_fails('cd -', 'E186:')
49    call assert_fails('call chdir("-")', 'E186:')
50    call writefile(v:errors, 'Xresult')
51    qall!
52  [SCRIPT]
53  call writefile(lines, 'Xscript')
54  if RunVim([], [], '--clean -S Xscript')
55    call assert_equal([], readfile('Xresult'))
56  endif
57  call delete('Xscript')
58  call delete('Xresult')
59endfunc
60
61func Test_cd_with_cpo_chdir()
62  e Xfoo
63  call setline(1, 'foo')
64  let path = getcwd()
65  set cpo+=.
66
67  " :cd should fail when buffer is modified and 'cpo' contains dot.
68  call assert_fails('cd ..', 'E747:')
69  call assert_equal(path, getcwd())
70
71  " :cd with exclamation mark should succeed.
72  cd! ..
73  call assert_notequal(path, getcwd())
74
75  " :cd should succeed when buffer has been written.
76  w!
77  exe 'cd ' .. fnameescape(path)
78  call assert_equal(path, getcwd())
79
80  call delete('Xfoo')
81  set cpo&
82  bw!
83endfunc
84
85" Test for chdir()
86func Test_chdir_func()
87  let topdir = getcwd()
88  call mkdir('Xdir/y/z', 'p')
89
90  " Create a few tabpages and windows with different directories
91  new
92  cd Xdir
93  tabnew
94  tcd y
95  below new
96  below new
97  lcd z
98
99  tabfirst
100  call assert_match('^\[global\] .*/Xdir$', trim(execute('verbose pwd')))
101  call chdir('..')
102  call assert_equal('y', fnamemodify(getcwd(1, 2), ':t'))
103  call assert_equal('z', fnamemodify(3->getcwd(2), ':t'))
104  tabnext | wincmd t
105  call assert_match('^\[tabpage\] .*/y$', trim(execute('verbose pwd')))
106  eval '..'->chdir()
107  call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
108  call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
109  call assert_equal('z', fnamemodify(getcwd(3, 2), ':t'))
110  call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
111  3wincmd w
112  call assert_match('^\[window\] .*/z$', trim(execute('verbose pwd')))
113  call chdir('..')
114  call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
115  call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
116  call assert_equal('y', fnamemodify(getcwd(3, 2), ':t'))
117  call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
118
119  " Error case
120  call assert_fails("call chdir('dir-abcd')", 'E472:')
121  silent! let d = chdir("dir_abcd")
122  call assert_equal("", d)
123  " Should not crash
124  call chdir(d)
125  call assert_equal('', chdir([]))
126
127  only | tabonly
128  call chdir(topdir)
129  call delete('Xdir', 'rf')
130endfunc
131
132" Test for changing to the previous directory '-'
133func Test_prev_dir()
134  let topdir = getcwd()
135  call mkdir('Xdir/a/b/c', 'p')
136
137  " Create a few tabpages and windows with different directories
138  new | only
139  tabnew | new
140  tabnew
141  tabfirst
142  cd Xdir
143  tabnext | wincmd t
144  tcd a
145  wincmd w
146  lcd b
147  tabnext
148  tcd a/b/c
149
150  " Change to the previous directory twice in all the windows.
151  tabfirst
152  cd - | cd -
153  tabnext | wincmd t
154  tcd - | tcd -
155  wincmd w
156  lcd - | lcd -
157  tabnext
158  tcd - | tcd -
159
160  " Check the directory of all the windows
161  tabfirst
162  call assert_equal('Xdir', fnamemodify(getcwd(), ':t'))
163  tabnext | wincmd t
164  call assert_equal('a', fnamemodify(getcwd(), ':t'))
165  wincmd w
166  call assert_equal('b', fnamemodify(getcwd(), ':t'))
167  tabnext
168  call assert_equal('c', fnamemodify(getcwd(), ':t'))
169
170  " Change to the previous directory using chdir()
171  tabfirst
172  call chdir("-") | call chdir("-")
173  tabnext | wincmd t
174  call chdir("-") | call chdir("-")
175  wincmd w
176  call chdir("-") | call chdir("-")
177  tabnext
178  call chdir("-") | call chdir("-")
179
180  " Check the directory of all the windows
181  tabfirst
182  call assert_equal('Xdir', fnamemodify(getcwd(), ':t'))
183  tabnext | wincmd t
184  call assert_equal('a', fnamemodify(getcwd(), ':t'))
185  wincmd w
186  call assert_equal('b', fnamemodify(getcwd(), ':t'))
187  tabnext
188  call assert_equal('c', fnamemodify(getcwd(), ':t'))
189
190  only | tabonly
191  call chdir(topdir)
192  call delete('Xdir', 'rf')
193endfunc
194
195func Test_cd_completion()
196  call mkdir('XComplDir1', 'p')
197  call mkdir('XComplDir2', 'p')
198  call writefile([], 'XComplFile')
199
200  for cmd in ['cd', 'chdir', 'lcd', 'lchdir', 'tcd', 'tchdir']
201    call feedkeys(':' .. cmd .. " XCompl\<C-A>\<C-B>\"\<CR>", 'tx')
202    call assert_equal('"' .. cmd .. ' XComplDir1/ XComplDir2/', @:)
203  endfor
204
205  call delete('XComplDir1', 'd')
206  call delete('XComplDir2', 'd')
207  call delete('XComplFile')
208endfunc
209