blob: f43f27c048c5768b5b7fcfdda14834bde5fecfc6 [file] [log] [blame]
Bram Moolenaar1063f3d2019-05-07 22:06:52 +02001" Test for :cd and chdir()
Bram Moolenaar15618fa2017-03-19 21:37:13 +01002
Bram Moolenaar9f6277b2020-02-11 22:04:02 +01003source shared.vim
4
Bram Moolenaar15618fa2017-03-19 21:37:13 +01005func 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 ..
Bram Moolenaarb2e0c942018-07-03 18:36:27 +020013 call assert_notequal(path, getcwd())
Bram Moolenaar3503d7c2019-11-09 20:10:17 +010014 exe 'cd ' .. fnameescape(path)
Bram Moolenaar15618fa2017-03-19 21:37:13 +010015 call assert_equal(path, getcwd())
16endfunc
Bram Moolenaarb2e0c942018-07-03 18:36:27 +020017
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())
Bram Moolenaar3503d7c2019-11-09 20:10:17 +010025 exe 'cd ' .. fnameescape(path)
Bram Moolenaarb2e0c942018-07-03 18:36:27 +020026 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())
Bram Moolenaar9f6277b2020-02-11 22:04:02 +010045
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')
Bram Moolenaarb2e0c942018-07-03 18:36:27 +020059endfunc
60
Bram Moolenaar1063f3d2019-05-07 22:06:52 +020061" Test for chdir()
62func Test_chdir_func()
63 let topdir = getcwd()
64 call mkdir('Xdir/y/z', 'p')
65
66 " Create a few tabpages and windows with different directories
67 new
68 cd Xdir
69 tabnew
70 tcd y
71 below new
72 below new
73 lcd z
74
75 tabfirst
Bram Moolenaar95058722020-06-01 16:26:19 +020076 call assert_match('^\[global\] .*/Xdir$', trim(execute('verbose pwd')))
Bram Moolenaar1063f3d2019-05-07 22:06:52 +020077 call chdir('..')
78 call assert_equal('y', fnamemodify(getcwd(1, 2), ':t'))
Bram Moolenaar4c313b12019-08-24 22:58:31 +020079 call assert_equal('z', fnamemodify(3->getcwd(2), ':t'))
Bram Moolenaar1063f3d2019-05-07 22:06:52 +020080 tabnext | wincmd t
Bram Moolenaar95058722020-06-01 16:26:19 +020081 call assert_match('^\[tabpage\] .*/y$', trim(execute('verbose pwd')))
Bram Moolenaar1a3a8912019-08-23 22:31:37 +020082 eval '..'->chdir()
Bram Moolenaar1063f3d2019-05-07 22:06:52 +020083 call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
84 call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
85 call assert_equal('z', fnamemodify(getcwd(3, 2), ':t'))
86 call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
87 3wincmd w
Bram Moolenaar95058722020-06-01 16:26:19 +020088 call assert_match('^\[window\] .*/z$', trim(execute('verbose pwd')))
Bram Moolenaar1063f3d2019-05-07 22:06:52 +020089 call chdir('..')
90 call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
91 call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
92 call assert_equal('y', fnamemodify(getcwd(3, 2), ':t'))
93 call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
94
95 " Error case
96 call assert_fails("call chdir('dir-abcd')", 'E472:')
97 silent! let d = chdir("dir_abcd")
98 call assert_equal("", d)
Bram Moolenaar7cc96922020-01-31 22:41:38 +010099 " Should not crash
100 call chdir(d)
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200101 call assert_equal('', chdir([]))
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200102
103 only | tabonly
Bram Moolenaar3503d7c2019-11-09 20:10:17 +0100104 call chdir(topdir)
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200105 call delete('Xdir', 'rf')
106endfunc
Bram Moolenaar297610b2019-12-27 17:20:55 +0100107
Bram Moolenaar002bc792020-06-05 22:33:42 +0200108" Test for changing to the previous directory '-'
109func Test_prev_dir()
110 let topdir = getcwd()
111 call mkdir('Xdir/a/b/c', 'p')
112
113 " Create a few tabpages and windows with different directories
114 new | only
115 tabnew | new
116 tabnew
117 tabfirst
118 cd Xdir
119 tabnext | wincmd t
120 tcd a
121 wincmd w
122 lcd b
123 tabnext
124 tcd a/b/c
125
126 " Change to the previous directory twice in all the windows.
127 tabfirst
128 cd - | cd -
129 tabnext | wincmd t
130 tcd - | tcd -
131 wincmd w
132 lcd - | lcd -
133 tabnext
134 tcd - | tcd -
135
136 " Check the directory of all the windows
137 tabfirst
138 call assert_equal('Xdir', fnamemodify(getcwd(), ':t'))
139 tabnext | wincmd t
140 call assert_equal('a', fnamemodify(getcwd(), ':t'))
141 wincmd w
142 call assert_equal('b', fnamemodify(getcwd(), ':t'))
143 tabnext
144 call assert_equal('c', fnamemodify(getcwd(), ':t'))
145
146 " Change to the previous directory using chdir()
147 tabfirst
148 call chdir("-") | call chdir("-")
149 tabnext | wincmd t
150 call chdir("-") | call chdir("-")
151 wincmd w
152 call chdir("-") | call chdir("-")
153 tabnext
154 call chdir("-") | call chdir("-")
155
156 " Check the directory of all the windows
157 tabfirst
158 call assert_equal('Xdir', fnamemodify(getcwd(), ':t'))
159 tabnext | wincmd t
160 call assert_equal('a', fnamemodify(getcwd(), ':t'))
161 wincmd w
162 call assert_equal('b', fnamemodify(getcwd(), ':t'))
163 tabnext
164 call assert_equal('c', fnamemodify(getcwd(), ':t'))
165
166 only | tabonly
167 call chdir(topdir)
168 call delete('Xdir', 'rf')
169endfunc
170
Bram Moolenaar297610b2019-12-27 17:20:55 +0100171func Test_cd_completion()
172 call mkdir('XComplDir1', 'p')
173 call mkdir('XComplDir2', 'p')
174 call writefile([], 'XComplFile')
175
176 for cmd in ['cd', 'chdir', 'lcd', 'lchdir', 'tcd', 'tchdir']
177 call feedkeys(':' .. cmd .. " XCompl\<C-A>\<C-B>\"\<CR>", 'tx')
178 call assert_equal('"' .. cmd .. ' XComplDir1/ XComplDir2/', @:)
179 endfor
180
181 call delete('XComplDir1', 'd')
182 call delete('XComplDir2', 'd')
183 call delete('XComplFile')
184endfunc