changeset 15961:4024dbfd3099 v8.1.0986

patch 8.1.0986: rename() is not propertly tested commit https://github.com/vim/vim/commit/ef8c956172aa967f67c524cb9609a4d390d74b82 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 2 06:42:07 2019 +0100 patch 8.1.0986: rename() is not propertly tested Problem: rename() is not propertly tested. Solution: Add tests. (Dominique Pelle, closes https://github.com/vim/vim/issues/4061)
author Bram Moolenaar <Bram@vim.org>
date Sat, 02 Mar 2019 06:45:06 +0100
parents ee37b47d6a33
children e29f75e1ec72
files src/testdir/Make_all.mak src/testdir/test_alot.vim src/testdir/test_rename.vim src/version.c
diffstat 4 files changed, 122 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -212,6 +212,7 @@ NEW_TESTS = \
 	test_regexp_utf8 \
 	test_registers \
 	test_reltime \
+	test_rename \
 	test_restricted \
 	test_retab \
 	test_ruby \
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -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
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_rename.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -780,6 +780,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    986,
+/**/
     985,
 /**/
     984,