blob: da9ef0830fb223188f3bc634fb2baee29fd7b140 [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
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!
Bram Moolenaar3503d7c2019-11-09 20:10:17 +010077 exe 'cd ' .. fnameescape(path)
Bram Moolenaarb2e0c942018-07-03 18:36:27 +020078 call assert_equal(path, getcwd())
79
80 call delete('Xfoo')
81 set cpo&
82 bw!
83endfunc
Bram Moolenaar1063f3d2019-05-07 22:06:52 +020084
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 chdir('..')
101 call assert_equal('y', fnamemodify(getcwd(1, 2), ':t'))
Bram Moolenaar4c313b12019-08-24 22:58:31 +0200102 call assert_equal('z', fnamemodify(3->getcwd(2), ':t'))
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200103 tabnext | wincmd t
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200104 eval '..'->chdir()
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200105 call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
106 call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
107 call assert_equal('z', fnamemodify(getcwd(3, 2), ':t'))
108 call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
109 3wincmd w
110 call chdir('..')
111 call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
112 call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
113 call assert_equal('y', fnamemodify(getcwd(3, 2), ':t'))
114 call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
115
116 " Error case
117 call assert_fails("call chdir('dir-abcd')", 'E472:')
118 silent! let d = chdir("dir_abcd")
119 call assert_equal("", d)
Bram Moolenaar7cc96922020-01-31 22:41:38 +0100120 " Should not crash
121 call chdir(d)
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200122 call assert_equal('', chdir([]))
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200123
124 only | tabonly
Bram Moolenaar3503d7c2019-11-09 20:10:17 +0100125 call chdir(topdir)
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200126 call delete('Xdir', 'rf')
127endfunc
Bram Moolenaar297610b2019-12-27 17:20:55 +0100128
129func Test_cd_completion()
130 call mkdir('XComplDir1', 'p')
131 call mkdir('XComplDir2', 'p')
132 call writefile([], 'XComplFile')
133
134 for cmd in ['cd', 'chdir', 'lcd', 'lchdir', 'tcd', 'tchdir']
135 call feedkeys(':' .. cmd .. " XCompl\<C-A>\<C-B>\"\<CR>", 'tx')
136 call assert_equal('"' .. cmd .. ' XComplDir1/ XComplDir2/', @:)
137 endfor
138
139 call delete('XComplDir1', 'd')
140 call delete('XComplDir2', 'd')
141 call delete('XComplFile')
142endfunc