xref: /vim-8.2.3635/src/testdir/test_getcwd.vim (revision fcfe1a9b)
1func GetCwdInfo(win, tab)
2  let tab_changed = 0
3  let mod = ":t"
4  if a:tab > 0 && a:tab != tabpagenr()
5    let tab_changed = 1
6    exec "tabnext " . a:tab
7  endif
8  let bufname = fnamemodify(bufname(winbufnr(a:win)), mod)
9  if tab_changed
10    tabprevious
11  endif
12  if a:win == 0 && a:tab == 0
13    let dirname = fnamemodify(getcwd(), mod)
14    let lflag = haslocaldir()
15  elseif a:tab == 0
16    let dirname = fnamemodify(getcwd(a:win), mod)
17    let lflag = haslocaldir(a:win)
18  else
19    let dirname = fnamemodify(getcwd(a:win, a:tab), mod)
20    let lflag = haslocaldir(a:win, a:tab)
21  endif
22  return bufname . ' ' . dirname . ' ' . lflag
23endfunc
24
25" Do all test in a separate window to avoid E211 when we recursively
26" delete the Xtopdir directory during cleanup
27function SetUp()
28  set visualbell
29  set nocp viminfo+=nviminfo
30
31  " On windows a swapfile in Xtopdir prevents it from being cleaned up.
32  set noswapfile
33
34  " On windows a stale "Xtopdir" directory may exist, remove it so that
35  " we start from a clean state.
36  call delete("Xtopdir", "rf")
37  new
38  call mkdir('Xtopdir')
39  cd Xtopdir
40  let g:topdir = getcwd()
41  call mkdir('Xdir1')
42  call mkdir('Xdir2')
43  call mkdir('Xdir3')
44endfunction
45
46let g:cwd=getcwd()
47function TearDown()
48  q
49  exec "cd " . g:cwd
50  call delete("Xtopdir", "rf")
51endfunction
52
53function Test_GetCwd()
54  new a
55  new b
56  new c
57  3wincmd w
58  lcd Xdir1
59  call assert_equal("a Xdir1 1", GetCwdInfo(0, 0))
60  call assert_equal(g:topdir, getcwd(-1))
61  wincmd W
62  call assert_equal("b Xtopdir 0", GetCwdInfo(0, 0))
63  call assert_equal(g:topdir, getcwd(-1))
64  wincmd W
65  lcd Xdir3
66  call assert_equal("c Xdir3 1", GetCwdInfo(0, 0))
67  call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), 0))
68  call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), 0))
69  call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), 0))
70  call assert_equal(g:topdir, getcwd(-1))
71  wincmd W
72  call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), tabpagenr()))
73  call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), tabpagenr()))
74  call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), tabpagenr()))
75  call assert_equal(g:topdir, getcwd(-1))
76
77  tabnew x
78  new y
79  new z
80  3wincmd w
81  call assert_equal("x Xtopdir 0", GetCwdInfo(0, 0))
82  call assert_equal(g:topdir, getcwd(-1))
83  wincmd W
84  lcd Xdir2
85  call assert_equal("y Xdir2 1", GetCwdInfo(0, 0))
86  call assert_equal(g:topdir, getcwd(-1))
87  wincmd W
88  lcd Xdir3
89  call assert_equal("z Xdir3 1", GetCwdInfo(0, 0))
90  call assert_equal("x Xtopdir 0", GetCwdInfo(bufwinnr("x"), 0))
91  call assert_equal("y Xdir2 1", GetCwdInfo(bufwinnr("y"), 0))
92  call assert_equal("z Xdir3 1", GetCwdInfo(bufwinnr("z"), 0))
93  call assert_equal(g:topdir, getcwd(-1))
94  let tp_nr = tabpagenr()
95  tabrewind
96  call assert_equal("x Xtopdir 0", GetCwdInfo(3, tp_nr))
97  call assert_equal("y Xdir2 1", GetCwdInfo(2, tp_nr))
98  call assert_equal("z Xdir3 1", GetCwdInfo(1, tp_nr))
99  call assert_equal(g:topdir, getcwd(-1))
100  " Non existing windows and tab pages
101  call assert_equal('', getcwd(100))
102  call assert_equal(0, haslocaldir(100))
103  call assert_equal('', getcwd(10, 1))
104  call assert_equal(0, haslocaldir(10, 1))
105  call assert_equal('', getcwd(1, 5))
106  call assert_equal(0, haslocaldir(1, 5))
107  call assert_fails('call getcwd([])', 'E745:')
108  call assert_fails('call getcwd(1, [])', 'E745:')
109  call assert_fails('call haslocaldir([])', 'E745:')
110  call assert_fails('call haslocaldir(1, [])', 'E745:')
111endfunc
112
113function Test_GetCwd_lcd_shellslash()
114  new
115  let root = fnamemodify('/', ':p')
116  exe 'lcd '.root
117  let cwd = getcwd()
118  if !exists('+shellslash') || &shellslash
119    call assert_equal(cwd[-1:], '/')
120  else
121    call assert_equal(cwd[-1:], '\')
122  endif
123endfunc
124
125" Test for :tcd
126function Test_Tab_Local_Cwd()
127  enew | only | tabonly
128
129  call mkdir('Xtabdir1')
130  call mkdir('Xtabdir2')
131  call mkdir('Xwindir1')
132  call mkdir('Xwindir2')
133  call mkdir('Xwindir3')
134
135  " Create three tabpages with three windows each
136  edit a
137  botright new b
138  botright new c
139  tabnew m
140  botright new n
141  botright new o
142  tabnew x
143  botright new y
144  botright new z
145
146  " Setup different directories for the tab pages and windows
147  tabrewind
148  1wincmd w
149  lcd Xwindir1
150  tabnext
151  tcd Xtabdir1
152  2wincmd w
153  lcd ../Xwindir2
154  tabnext
155  tcd Xtabdir2
156  3wincmd w
157  lcd ../Xwindir3
158
159  " Check the directories of various windows
160  call assert_equal("a Xwindir1 1", GetCwdInfo(1, 1))
161  call assert_equal("b Xtopdir 0", GetCwdInfo(2, 1))
162  call assert_equal("c Xtopdir 0", GetCwdInfo(3, 1))
163  call assert_equal("m Xtabdir1 2", GetCwdInfo(1, 2))
164  call assert_equal("n Xwindir2 1", GetCwdInfo(2, 2))
165  call assert_equal("o Xtabdir1 2", GetCwdInfo(3, 2))
166  call assert_equal("x Xtabdir2 2", GetCwdInfo(1, 3))
167  call assert_equal("y Xtabdir2 2", GetCwdInfo(2, 3))
168  call assert_equal("z Xwindir3 1", GetCwdInfo(3, 3))
169
170  " Check the tabpage directories
171  call assert_equal('Xtopdir', fnamemodify(getcwd(-1, 1), ':t'))
172  call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 2), ':t'))
173  call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 3), ':t'))
174  call assert_equal('', fnamemodify(getcwd(-1, 4), ':t'))
175
176  " Jump to different windows in the tab pages and check the current directory
177  tabrewind | 1wincmd w
178  call assert_equal('Xwindir1', fnamemodify(getcwd(), ':t'))
179  call assert_equal('Xwindir1', fnamemodify(getcwd(0), ':t'))
180  call assert_equal('Xwindir1', fnamemodify(getcwd(0, 0), ':t'))
181  call assert_true(haslocaldir(0))
182  call assert_equal(0, haslocaldir(-1, 0))
183  call assert_equal('Xtopdir', fnamemodify(getcwd(-1, 0), ':t'))
184  call assert_equal(g:topdir, getcwd(-1))
185  2wincmd w
186  call assert_equal('Xtopdir', fnamemodify(getcwd(), ':t'))
187  call assert_equal('Xtopdir', fnamemodify(getcwd(0), ':t'))
188  call assert_equal('Xtopdir', fnamemodify(getcwd(0, 0), ':t'))
189  call assert_false(haslocaldir(0))
190  call assert_equal(0, haslocaldir(-1, 0))
191  call assert_equal('Xtopdir', fnamemodify(getcwd(-1, 0), ':t'))
192  call assert_equal(g:topdir, getcwd(-1))
193  tabnext | 1wincmd w
194  call assert_equal('Xtabdir1', fnamemodify(getcwd(), ':t'))
195  call assert_equal('Xtabdir1', fnamemodify(getcwd(0), ':t'))
196  call assert_equal('Xtabdir1', fnamemodify(getcwd(0, 0), ':t'))
197  call assert_true(haslocaldir(0))
198  call assert_equal(2, haslocaldir(-1, 0))
199  call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 0), ':t'))
200  call assert_equal(g:topdir, getcwd(-1))
201  2wincmd w
202  call assert_equal('Xwindir2', fnamemodify(getcwd(), ':t'))
203  call assert_equal('Xwindir2', fnamemodify(getcwd(0), ':t'))
204  call assert_equal('Xwindir2', fnamemodify(getcwd(0, 0), ':t'))
205  call assert_true(haslocaldir(0))
206  call assert_equal(2, haslocaldir(-1, 0))
207  call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 0), ':t'))
208  call assert_equal(g:topdir, getcwd(-1))
209  tabnext | 1wincmd w
210  call assert_equal('Xtabdir2', fnamemodify(getcwd(), ':t'))
211  call assert_equal('Xtabdir2', fnamemodify(getcwd(0), ':t'))
212  call assert_equal('Xtabdir2', fnamemodify(getcwd(0, 0), ':t'))
213  call assert_true(haslocaldir(0))
214  call assert_equal(2, haslocaldir(-1, 0))
215  call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 0), ':t'))
216  call assert_equal(g:topdir, getcwd(-1))
217  3wincmd w
218  call assert_equal('Xwindir3', fnamemodify(getcwd(), ':t'))
219  call assert_equal('Xwindir3', fnamemodify(getcwd(0), ':t'))
220  call assert_equal('Xwindir3', fnamemodify(getcwd(0, 0), ':t'))
221  call assert_true(haslocaldir(0))
222  call assert_equal(2, haslocaldir(-1, 0))
223  call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 0), ':t'))
224  call assert_equal(g:topdir, getcwd(-1))
225
226  " A new tab page should inherit the directory of the current tab page
227  tabrewind | 1wincmd w
228  tabnew g
229  call assert_equal("g Xwindir1 1", GetCwdInfo(0, 0))
230  tabclose | tabrewind
231  2wincmd w
232  tabnew h
233  call assert_equal("h Xtopdir 0", GetCwdInfo(0, 0))
234  tabclose
235  tabnext 2 | 1wincmd w
236  tabnew j
237  call assert_equal("j Xtabdir1 2", GetCwdInfo(0, 0))
238  tabclose
239
240  " Change the global directory for the first tab page
241  tabrewind | 1wincmd w
242  cd ../Xdir1
243  call assert_equal("a Xdir1 0", GetCwdInfo(1, 1))
244  call assert_equal("b Xdir1 0", GetCwdInfo(2, 1))
245  call assert_equal("m Xtabdir1 2", GetCwdInfo(1, 2))
246  call assert_equal("n Xwindir2 1", GetCwdInfo(2, 2))
247
248  " Change the global directory for the second tab page
249  tabnext | 1wincmd w
250  cd ../Xdir3
251  call assert_equal("m Xdir3 0", GetCwdInfo(1, 2))
252  call assert_equal("n Xwindir2 1", GetCwdInfo(2, 2))
253  call assert_equal("o Xdir3 0", GetCwdInfo(3, 2))
254
255  " Change the tab-local directory for the third tab page
256  tabnext | 1wincmd w
257  cd ../Xdir1
258  call assert_equal("x Xdir1 0", GetCwdInfo(1, 3))
259  call assert_equal("y Xdir1 0", GetCwdInfo(2, 3))
260  call assert_equal("z Xwindir3 1", GetCwdInfo(3, 3))
261
262  enew | only | tabonly
263  new
264endfunc
265