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