diff src/testdir/test_winfixbuf.vim @ 34647:6b2efa2b2386 v9.1.0208

patch 9.1.0208: winfixbuf does not allow to re-edit current buffer Commit: https://github.com/vim/vim/commit/65e580bd5610465bb6b9c1a546b7a8d00c76aa47 Author: Colin Kennedy <colinvfx@gmail.com> Date: Tue Mar 26 18:29:30 2024 +0100 patch 9.1.0208: winfixbuf does not allow to re-edit current buffer Problem: winfixbuf does not allow to re-edit current buffer (Tim Pope, after v9.1.0147) Solution: Explicitly allow :e even when 'winfixbuf' is set, since it just re-loads the current buffer (Colin Kennedy) fixes: #14237 closes: #14286 Signed-off-by: Colin Kennedy <colinvfx@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 26 Mar 2024 18:45:03 +0100
parents 495218030237
children 3b29a2cdbf74
line wrap: on
line diff
--- a/src/testdir/test_winfixbuf.vim
+++ b/src/testdir/test_winfixbuf.vim
@@ -1125,6 +1125,146 @@ func Test_edit()
   call assert_equal(l:other, bufnr())
 endfunc
 
+" Fail :e when selecting a buffer from a relative path if in a different folder
+"
+" In this tests there's 2 buffers
+"
+" foo - lives on disk, in some folder. e.g. /tmp/foo
+" foo - an in-memory buffer that has not been saved to disk. If saved, it
+"       would live in a different folder, /other/foo.
+"
+" The 'winfixbuf' is looking at the in-memory buffer and trying to switch to
+" the buffer on-disk (and fails, because it's a different buffer)
+func Test_edit_different_buffer_on_disk_and_relative_path_to_disk()
+  call s:reset_all_buffers()
+
+  let l:file_on_disk = tempname()
+  let l:directory_on_disk1 = fnamemodify(l:file_on_disk, ":p:h")
+  let l:name = fnamemodify(l:file_on_disk, ":t")
+  execute "edit " . l:file_on_disk
+  write!
+
+  let l:directory_on_disk2 = l:directory_on_disk1 . "_something_else"
+
+  if !isdirectory(l:directory_on_disk2)
+    call mkdir(l:directory_on_disk2)
+  endif
+
+  execute "cd " . l:directory_on_disk2
+  execute "edit " l:name
+
+  let l:current = bufnr()
+
+  call assert_equal(l:current, bufnr())
+  set winfixbuf
+  call assert_fails("edit " . l:file_on_disk, "E1513:")
+  call assert_equal(l:current, bufnr())
+
+  call delete(l:directory_on_disk1)
+  call delete(l:directory_on_disk2)
+endfunc
+
+" Fail :e when selecting a buffer from a relative path if in a different folder
+"
+" In this tests there's 2 buffers
+"
+" foo - lives on disk, in some folder. e.g. /tmp/foo
+" foo - an in-memory buffer that has not been saved to disk. If saved, it
+"       would live in a different folder, /other/foo.
+"
+" The 'winfixbuf' is looking at the on-disk buffer and trying to switch to
+" the in-memory buffer (and fails, because it's a different buffer)
+func Test_edit_different_buffer_on_disk_and_relative_path_to_memory()
+  call s:reset_all_buffers()
+
+  let l:file_on_disk = tempname()
+  let l:directory_on_disk1 = fnamemodify(l:file_on_disk, ":p:h")
+  let l:name = fnamemodify(l:file_on_disk, ":t")
+  execute "edit " . l:file_on_disk
+  write!
+
+  let l:directory_on_disk2 = l:directory_on_disk1 . "_something_else"
+
+  if !isdirectory(l:directory_on_disk2)
+    call mkdir(l:directory_on_disk2)
+  endif
+
+  execute "cd " . l:directory_on_disk2
+  execute "edit " l:name
+  execute "cd " . l:directory_on_disk1
+  execute "edit " l:file_on_disk
+  execute "cd " . l:directory_on_disk2
+
+  let l:current = bufnr()
+
+  call assert_equal(l:current, bufnr())
+  set winfixbuf
+  call assert_fails("edit " . l:name, "E1513:")
+  call assert_equal(l:current, bufnr())
+
+  call delete(l:directory_on_disk1)
+  call delete(l:directory_on_disk2)
+endfunc
+
+" Fail to call `:e first` if called from a starting, in-memory buffer
+func Test_edit_first_buffer()
+  call s:reset_all_buffers()
+
+  set winfixbuf
+  let l:current = bufnr()
+
+  call assert_fails("edit first", "E1513:")
+  call assert_equal(l:current, bufnr())
+
+  edit! first
+  call assert_equal(l:current, bufnr())
+  edit! somewhere_else
+  call assert_notequal(l:current, bufnr())
+endfunc
+
+" Allow reloading a buffer using :e
+func Test_edit_no_arguments()
+  call s:reset_all_buffers()
+
+  let l:current = bufnr()
+  file some_buffer
+
+  call assert_equal(l:current, bufnr())
+  set winfixbuf
+  edit
+  call assert_equal(l:current, bufnr())
+endfunc
+
+" Allow :e selecting the current buffer
+func Test_edit_same_buffer_in_memory()
+  call s:reset_all_buffers()
+
+  let l:current = bufnr()
+  file same_buffer
+
+  call assert_equal(l:current, bufnr())
+  set winfixbuf
+  edit same_buffer
+  call assert_equal(l:current, bufnr())
+endfunc
+
+" Allow :e selecting the current buffer as a full path
+func Test_edit_same_buffer_on_disk_absolute_path()
+  call s:reset_all_buffers()
+
+  let l:file = tempname()
+  let l:current = bufnr()
+  execute "edit " . l:file
+  write!
+
+  call assert_equal(l:current, bufnr())
+  set winfixbuf
+  execute "edit " l:file
+  call assert_equal(l:current, bufnr())
+
+  call delete(l:file)
+endfunc
+
 " Fail :enew but :enew! is allowed
 func Test_enew()
   call s:reset_all_buffers()