]> granicus.if.org Git - vim/commitdiff
patch 8.1.0986: rename() is not propertly tested v8.1.0986
authorBram Moolenaar <Bram@vim.org>
Sat, 2 Mar 2019 05:42:07 +0000 (06:42 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 2 Mar 2019 05:42:07 +0000 (06:42 +0100)
Problem:    rename() is not propertly tested.
Solution:   Add tests. (Dominique Pelle, closes #4061)

src/testdir/Make_all.mak
src/testdir/test_alot.vim
src/testdir/test_rename.vim [new file with mode: 0644]
src/version.c

index 7cc5e7eae6b553fec56f42abba215c83104b63b9..774c96b7a415bdb51ff4bc278e2ffc5921dba461 100644 (file)
@@ -212,6 +212,7 @@ NEW_TESTS = \
        test_regexp_utf8 \
        test_registers \
        test_reltime \
+       test_rename \
        test_restricted \
        test_retab \
        test_ruby \
index 204796a971a6c6a885d9a3dc6f2d1155de2b5ddb..47fe5be8a21a697b9a1f7821a877effae06ad5fb 100644 (file)
@@ -48,6 +48,7 @@ source test_popup.vim
 source test_put.vim
 source test_recover.vim
 source test_reltime.vim
+source test_rename.vim
 source test_scroll_opt.vim
 source test_searchpos.vim
 source test_set.vim
diff --git a/src/testdir/test_rename.vim b/src/testdir/test_rename.vim
new file mode 100644 (file)
index 0000000..2311caf
--- /dev/null
@@ -0,0 +1,118 @@
+" Test rename()
+
+func Test_rename_file_to_file()
+  call writefile(['foo'], 'Xrename1')
+
+  call assert_equal(0, rename('Xrename1', 'Xrename2'))
+
+  call assert_equal('', glob('Xrename1'))
+  call assert_equal(['foo'], readfile('Xrename2'))
+
+  " When the destination file already exists, it should be overwritten.
+  call writefile(['foo'], 'Xrename1')
+  call writefile(['bar'], 'Xrename2')
+
+  call assert_equal(0, rename('Xrename1', 'Xrename2'))
+  call assert_equal('', glob('Xrename1'))
+  call assert_equal(['foo'], readfile('Xrename2'))
+
+  call delete('Xrename2')
+endfunc
+
+func Test_rename_file_ignore_case()
+  " With 'fileignorecase', renaming file will go through a temp file
+  " when the source and destination file only differ by case.
+  set fileignorecase
+  call writefile(['foo'], 'Xrename')
+
+  call assert_equal(0, rename('Xrename', 'XRENAME'))
+
+  call assert_equal(['foo'], readfile('XRENAME'))
+
+  set fileignorecase&
+  call delete('XRENAME')
+endfunc
+
+func Test_rename_same_file()
+  call writefile(['foo'], 'Xrename')
+
+  " When the source and destination are the same file, nothing
+  " should be done. The source file should not be deleted.
+  call assert_equal(0, rename('Xrename', 'Xrename'))
+  call assert_equal(['foo'], readfile('Xrename'))
+
+  call assert_equal(0, rename('./Xrename', 'Xrename'))
+  call assert_equal(['foo'], readfile('Xrename'))
+
+  call delete('Xrename')
+endfunc
+
+func Test_rename_dir_to_dir()
+  call mkdir('Xrenamedir1')
+  call writefile(['foo'], 'Xrenamedir1/Xrenamefile')
+
+  call assert_equal(0, rename('Xrenamedir1', 'Xrenamedir2'))
+
+  call assert_equal('', glob('Xrenamedir1'))
+  call assert_equal(['foo'], readfile('Xrenamedir2/Xrenamefile'))
+
+  call delete('Xrenamedir2/Xrenamefile')
+  call delete('Xrenamedir2', 'd')
+endfunc
+
+func Test_rename_same_dir()
+  call mkdir('Xrenamedir')
+  call writefile(['foo'], 'Xrenamedir/Xrenamefile')
+
+  call assert_equal(0, rename('Xrenamedir', 'Xrenamedir'))
+
+  call assert_equal(['foo'], readfile('Xrenamedir/Xrenamefile'))
+
+  call delete('Xrenamedir/Xrenamefile')
+  call delete('Xrenamedir', 'd')
+endfunc
+
+func Test_rename_copy()
+  " Check that when original file can't be deleted, rename()
+  " still succeeds but copies the file.
+  call mkdir('Xrenamedir')
+  call writefile(['foo'], 'Xrenamedir/Xrenamefile')
+  call setfperm('Xrenamedir', 'r-xr-xr-x')
+
+  call assert_equal(0, rename('Xrenamedir/Xrenamefile', 'Xrenamefile'))
+
+  if !has('win32')
+    " On Windows, the source file is removed despite
+    " its directory being made not writable.
+    call assert_equal(['foo'], readfile('Xrenamedir/Xrenamefile'))
+  endif
+  call assert_equal(['foo'], readfile('Xrenamefile'))
+
+  call setfperm('Xrenamedir', 'rwxrwxrwx')
+  call delete('Xrenamedir/Xrenamefile')
+  call delete('Xrenamedir', 'd')
+  call delete('Xrenamefile')
+endfunc
+
+func Test_rename_fails()
+  call writefile(['foo'], 'Xrenamefile')
+
+  " Can't rename into a non-existing directory.
+  call assert_notequal(0, rename('Xrenamefile', 'Xdoesnotexist/Xrenamefile'))
+
+  " Can't rename a non-existing file.
+  call assert_notequal(0, rename('Xdoesnotexist', 'Xrenamefile2'))
+  call assert_equal('', glob('Xrenamefile2'))
+
+  " When rename() fails, the destination file should not be deleted.
+  call assert_notequal(0, rename('Xdoesnotexist', 'Xrenamefile'))
+  call assert_equal(['foo'], readfile('Xrenamefile'))
+
+  " Can't rename to en empty file name.
+  call assert_notequal(0, rename('Xrenamefile', ''))
+
+  call assert_fails('call rename("Xrenamefile", [])', 'E730')
+  call assert_fails('call rename(0z, "Xrenamefile")', 'E976')
+
+  call delete('Xrenamefile')
+endfunc
index 9b87302cc8c7dabfb966024258bbcbd193346ad8..3132a1d44809f68aeed952056ac900e63b4dd696 100644 (file)
@@ -779,6 +779,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    986,
 /**/
     985,
 /**/