blob: 2311caf790adbc2b0fe73f45595249e5904e35e1 [file] [log] [blame]
Bram Moolenaaref8c9562019-03-02 06:42:07 +01001" Test rename()
2
3func Test_rename_file_to_file()
4 call writefile(['foo'], 'Xrename1')
5
6 call assert_equal(0, rename('Xrename1', 'Xrename2'))
7
8 call assert_equal('', glob('Xrename1'))
9 call assert_equal(['foo'], readfile('Xrename2'))
10
11 " When the destination file already exists, it should be overwritten.
12 call writefile(['foo'], 'Xrename1')
13 call writefile(['bar'], 'Xrename2')
14
15 call assert_equal(0, rename('Xrename1', 'Xrename2'))
16 call assert_equal('', glob('Xrename1'))
17 call assert_equal(['foo'], readfile('Xrename2'))
18
19 call delete('Xrename2')
20endfunc
21
22func Test_rename_file_ignore_case()
23 " With 'fileignorecase', renaming file will go through a temp file
24 " when the source and destination file only differ by case.
25 set fileignorecase
26 call writefile(['foo'], 'Xrename')
27
28 call assert_equal(0, rename('Xrename', 'XRENAME'))
29
30 call assert_equal(['foo'], readfile('XRENAME'))
31
32 set fileignorecase&
33 call delete('XRENAME')
34endfunc
35
36func Test_rename_same_file()
37 call writefile(['foo'], 'Xrename')
38
39 " When the source and destination are the same file, nothing
40 " should be done. The source file should not be deleted.
41 call assert_equal(0, rename('Xrename', 'Xrename'))
42 call assert_equal(['foo'], readfile('Xrename'))
43
44 call assert_equal(0, rename('./Xrename', 'Xrename'))
45 call assert_equal(['foo'], readfile('Xrename'))
46
47 call delete('Xrename')
48endfunc
49
50func Test_rename_dir_to_dir()
51 call mkdir('Xrenamedir1')
52 call writefile(['foo'], 'Xrenamedir1/Xrenamefile')
53
54 call assert_equal(0, rename('Xrenamedir1', 'Xrenamedir2'))
55
56 call assert_equal('', glob('Xrenamedir1'))
57 call assert_equal(['foo'], readfile('Xrenamedir2/Xrenamefile'))
58
59 call delete('Xrenamedir2/Xrenamefile')
60 call delete('Xrenamedir2', 'd')
61endfunc
62
63func Test_rename_same_dir()
64 call mkdir('Xrenamedir')
65 call writefile(['foo'], 'Xrenamedir/Xrenamefile')
66
67 call assert_equal(0, rename('Xrenamedir', 'Xrenamedir'))
68
69 call assert_equal(['foo'], readfile('Xrenamedir/Xrenamefile'))
70
71 call delete('Xrenamedir/Xrenamefile')
72 call delete('Xrenamedir', 'd')
73endfunc
74
75func Test_rename_copy()
76 " Check that when original file can't be deleted, rename()
77 " still succeeds but copies the file.
78 call mkdir('Xrenamedir')
79 call writefile(['foo'], 'Xrenamedir/Xrenamefile')
80 call setfperm('Xrenamedir', 'r-xr-xr-x')
81
82 call assert_equal(0, rename('Xrenamedir/Xrenamefile', 'Xrenamefile'))
83
84 if !has('win32')
85 " On Windows, the source file is removed despite
86 " its directory being made not writable.
87 call assert_equal(['foo'], readfile('Xrenamedir/Xrenamefile'))
88 endif
89 call assert_equal(['foo'], readfile('Xrenamefile'))
90
91 call setfperm('Xrenamedir', 'rwxrwxrwx')
92 call delete('Xrenamedir/Xrenamefile')
93 call delete('Xrenamedir', 'd')
94 call delete('Xrenamefile')
95endfunc
96
97func Test_rename_fails()
98 call writefile(['foo'], 'Xrenamefile')
99
100 " Can't rename into a non-existing directory.
101 call assert_notequal(0, rename('Xrenamefile', 'Xdoesnotexist/Xrenamefile'))
102
103 " Can't rename a non-existing file.
104 call assert_notequal(0, rename('Xdoesnotexist', 'Xrenamefile2'))
105 call assert_equal('', glob('Xrenamefile2'))
106
107 " When rename() fails, the destination file should not be deleted.
108 call assert_notequal(0, rename('Xdoesnotexist', 'Xrenamefile'))
109 call assert_equal(['foo'], readfile('Xrenamefile'))
110
111 " Can't rename to en empty file name.
112 call assert_notequal(0, rename('Xrenamefile', ''))
113
114 call assert_fails('call rename("Xrenamefile", [])', 'E730')
115 call assert_fails('call rename(0z, "Xrenamefile")', 'E976')
116
117 call delete('Xrenamefile')
118endfunc