updated for version 7.3.943
Problem:    Python: Negative indices were failing.
Solution:   Fix negative indices. Add tests. (ZyX)
diff --git a/src/testdir/test86.in b/src/testdir/test86.in
index ca44807..555a5fd 100644
--- a/src/testdir/test86.in
+++ b/src/testdir/test86.in
@@ -475,9 +475,50 @@
 :       endtry
 :   endfor
 :   call RecVars(oname)
-endtry
 :endfor
 :only
+:"
+:" Test buffer object
+:vnew
+:put ='First line'
+:put ='Second line'
+:put ='Third line'
+:1 delete _
+:py b=vim.current.buffer
+:wincmd w
+:mark a
+py << EOF
+cb = vim.current.buffer
+# Tests BufferAppend and BufferItem
+cb.append(b[0])
+# Tests BufferSlice and BufferAssSlice
+cb.append('abc') # Will be overwritten
+cb[-1:] = b[:-2]
+# Test BufferLength and BufferAssSlice
+cb.append('def') # Will not be overwritten
+cb[len(cb):] = b[:]
+# Test BufferAssItem and BufferMark
+cb.append('ghi') # Will be overwritten
+cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
+# Test BufferRepr
+cb.append(repr(cb) + repr(b))
+# Modify foreign buffer
+b.append('foo')
+b[0]='bar'
+b[0:0]=['baz']
+vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
+# Test CheckBuffer
+vim.command('bwipeout! ' + str(b.number))
+for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
+    try:
+        exec(expr)
+    except vim.error:
+        pass
+    else:
+        # Usually a SEGV here
+        # Should not happen in any case
+        cb.append('No exception for ' + expr)
+EOF
 :endfun
 :"
 :call Test()
diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok
index 2acfb98..cada813 100644
--- a/src/testdir/test86.ok
+++ b/src/testdir/test86.ok
@@ -306,3 +306,16 @@
   G: '.,,'
   W: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
   B: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
+First line
+First line
+def
+First line
+Second line
+Third line
+(7, 2)
+<buffer test86.in><buffer >
+baz
+bar
+Second line
+Third line
+foo
diff --git a/src/testdir/test87.in b/src/testdir/test87.in
index c2bcb6a..6f3cce0 100644
--- a/src/testdir/test87.in
+++ b/src/testdir/test87.in
@@ -444,9 +444,50 @@
 :       endtry
 :   endfor
 :   call RecVars(oname)
-endtry
 :endfor
 :only
+:"
+:" Test buffer object
+:vnew
+:put ='First line'
+:put ='Second line'
+:put ='Third line'
+:1 delete _
+:py3 b=vim.current.buffer
+:wincmd w
+:mark a
+py3 << EOF
+cb = vim.current.buffer
+# Tests BufferAppend and BufferItem
+cb.append(b[0])
+# Tests BufferSlice and BufferAssSlice
+cb.append('abc') # Will be overwritten
+cb[-1:] = b[:-2]
+# Test BufferLength and BufferAssSlice
+cb.append('def') # Will not be overwritten
+cb[len(cb):] = b[:]
+# Test BufferAssItem and BufferMark
+cb.append('ghi') # Will be overwritten
+cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
+# Test BufferRepr
+cb.append(repr(cb) + repr(b))
+# Modify foreign buffer
+b.append('foo')
+b[0]='bar'
+b[0:0]=['baz']
+vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
+# Test CheckBuffer
+vim.command('bwipeout! ' + str(b.number))
+for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
+    try:
+        exec(expr)
+    except vim.error:
+        pass
+    else:
+        # Usually a SEGV here
+        # Should not happen in any case
+        cb.append('No exception for ' + expr)
+EOF
 :endfun
 :"
 :call Test()
diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok
index 72e7b05..a43698d 100644
--- a/src/testdir/test87.ok
+++ b/src/testdir/test87.ok
@@ -295,3 +295,16 @@
   G: '.,,'
   W: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
   B: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
+First line
+First line
+def
+First line
+Second line
+Third line
+(7, 2)
+<buffer test87.in><buffer >
+baz
+bar
+Second line
+Third line
+foo