patch 8.1.1045: E315 ml_get error when using Python and hidden buffer

Problem:    E315 ml_get error when using Python and hidden buffer.
Solution:   Make sure the cursor position is valid. (Ben Jackson,
            closes #4153, closes #4154)
diff --git a/src/testdir/test_python2.vim b/src/testdir/test_python2.vim
index 43c89c9..97b44f2 100644
--- a/src/testdir/test_python2.vim
+++ b/src/testdir/test_python2.vim
@@ -71,3 +71,87 @@
   endif
   call assert_equal(0, &pyxversion)  " This assertion would have failed with Vim 8.0.0251. (pyxversion was introduced in 8.0.0251.)
 endfunc
+
+func _SetUpHiddenBuffer()
+  py import vim
+  new
+  edit hidden
+  setlocal bufhidden=hide
+
+  enew
+  let lnum = 0
+  while lnum < 10
+    call append( 1, string( lnum ) )
+    let lnum = lnum + 1
+  endwhile
+  normal G
+
+  call assert_equal( line( '.' ), 11 )
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Clear()
+  call _SetUpHiddenBuffer()
+  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = None
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_List()
+  call _SetUpHiddenBuffer()
+  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = [ 'test' ]
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Str()
+  call _SetUpHiddenBuffer()
+  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = 'test'
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_ClearLine()
+  call _SetUpHiddenBuffer()
+  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = None
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func _SetUpVisibleBuffer()
+  py import vim
+  new
+  let lnum = 0
+  while lnum < 10
+    call append( 1, string( lnum ) )
+    let lnum = lnum + 1
+  endwhile
+  normal G
+  call assert_equal( line( '.' ), 11 )
+endfunc
+
+func Test_Write_To_Current_Buffer_Fixes_Cursor_Clear()
+  call _SetUpVisibleBuffer()
+
+  py vim.current.buffer[:] = None
+  call assert_equal( line( '.' ), 1 )
+
+  bwipe!
+endfunc
+
+func Test_Write_To_Current_Buffer_Fixes_Cursor_List()
+  call _SetUpVisibleBuffer()
+
+  py vim.current.buffer[:] = [ 'test' ]
+  call assert_equal( line( '.' ), 1 )
+
+  bwipe!
+endfunction
+
+func Test_Write_To_Current_Buffer_Fixes_Cursor_Str()
+  call _SetUpVisibleBuffer()
+
+  py vim.current.buffer[-1] = None
+  call assert_equal( line( '.' ), 10 )
+
+  bwipe!
+endfunction
diff --git a/src/testdir/test_python3.vim b/src/testdir/test_python3.vim
index 272ff9e..bc05f68 100644
--- a/src/testdir/test_python3.vim
+++ b/src/testdir/test_python3.vim
@@ -71,3 +71,87 @@
   endif
   call assert_equal(0, &pyxversion)  " This assertion would have failed with Vim 8.0.0251. (pyxversion was introduced in 8.0.0251.)
 endfunc
+
+func _SetUpHiddenBuffer()
+  py3 import vim
+  new
+  edit hidden
+  setlocal bufhidden=hide
+
+  enew
+  let lnum = 0
+  while lnum < 10
+    call append( 1, string( lnum ) )
+    let lnum = lnum + 1
+  endwhile
+  normal G
+
+  call assert_equal( line( '.' ), 11 )
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Clear()
+  call _SetUpHiddenBuffer()
+  py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = None
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_List()
+  call _SetUpHiddenBuffer()
+  py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = [ 'test' ]
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Str()
+  call _SetUpHiddenBuffer()
+  py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = 'test'
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_ClearLine()
+  call _SetUpHiddenBuffer()
+  py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = None
+  call assert_equal( line( '.' ), 11 )
+  bwipe!
+endfunc
+
+func _SetUpVisibleBuffer()
+  py3 import vim
+  new
+  let lnum = 0
+  while lnum < 10
+    call append( 1, string( lnum ) )
+    let lnum = lnum + 1
+  endwhile
+  normal G
+  call assert_equal( line( '.' ), 11 )
+endfunc
+
+func Test_Write_To_Current_Buffer_Fixes_Cursor_Clear()
+  call _SetUpVisibleBuffer()
+
+  py3 vim.current.buffer[:] = None
+  call assert_equal( line( '.' ), 1 )
+
+  bwipe!
+endfunc
+
+func Test_Write_To_Current_Buffer_Fixes_Cursor_List()
+  call _SetUpVisibleBuffer()
+
+  py3 vim.current.buffer[:] = [ 'test' ]
+  call assert_equal( line( '.' ), 1 )
+
+  bwipe!
+endfunction
+
+func Test_Write_To_Current_Buffer_Fixes_Cursor_Str()
+  call _SetUpVisibleBuffer()
+
+  py3 vim.current.buffer[-1] = None
+  call assert_equal( line( '.' ), 10 )
+
+  bwipe!
+endfunction