updated for version 7.3.955
Problem:    Python: Not enough tests.
Solution:   Add tests for vim.{current,window*,tabpage*}. (ZyX)
diff --git a/src/testdir/test87.in b/src/testdir/test87.in
index f9b8a65..7d8ba3c 100644
--- a/src/testdir/test87.in
+++ b/src/testdir/test87.in
@@ -320,6 +320,7 @@
 :let g:foo = 'bac'
 :let w:abc = 'def'
 :let b:baz = 'bar'
+:let t:bar = 'jkl'
 :try
 :  throw "Abc"
 :catch
@@ -328,6 +329,7 @@
 :put =py3eval('vim.vars[''foo'']')
 :put =py3eval('vim.current.window.vars[''abc'']')
 :put =py3eval('vim.current.buffer.vars[''baz'']')
+:put =py3eval('vim.current.tabpage.vars[''bar'']')
 :"
 :" Options
 :" paste:          boolean, global
@@ -547,6 +549,78 @@
 except StopIteration:
     cb.append('StopIteration')
 EOF
+:"
+:" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
+:tabnew 0
+:tabnew 1
+:vnew a.1
+:tabnew 2
+:vnew a.2
+:vnew b.2
+:vnew c.2
+py3 << EOF
+def W(w):
+    if '(unknown)' in repr(w):
+        return '<window object (unknown)>'
+    else:
+        return repr(w)
+cb.append('Number of tabs: ' + str(len(vim.tabpages)))
+cb.append('Current tab pages:')
+for t in vim.tabpages:
+    cb.append('  ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window))
+    cb.append('  Windows:')
+    for w in t.windows:
+        cb.append('    ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + repr(w.cursor))
+        # Other values depend on the size of the terminal, so they are checked partly:
+        for attr in ('height', 'row', 'width', 'col'):
+            try:
+                aval = getattr(w, attr)
+                if type(aval) is not int:
+                    raise TypeError
+                if aval < 0:
+                    raise ValueError
+            except Exception as e:
+                cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + e.__class__.__name__)
+        w.cursor = (len(w.buffer), 0)
+cb.append('Number of windows in current tab page: ' + str(len(vim.windows)))
+if list(vim.windows) != list(vim.current.tabpage.windows):
+    cb.append('!!!!!! Windows differ')
+EOF
+:"
+:" Test vim.current
+py3 << EOF
+def H(o):
+    return repr(o)
+cb.append('Current tab page: ' + repr(vim.current.tabpage))
+cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
+cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer))
+# Assigning: fails
+try:
+    vim.current.window = vim.tabpages[0].window
+except ValueError:
+    cb.append('ValueError at assigning foreign tab window')
+
+for attr in ('window', 'tabpage', 'buffer'):
+    try:
+        setattr(vim.current, attr, None)
+    except TypeError:
+        cb.append('Type error at assigning None to vim.current.' + attr)
+
+# Assigning: success
+vim.current.tabpage = vim.tabpages[-2]
+vim.current.buffer = cb
+vim.current.window = vim.windows[0]
+vim.current.window.cursor = (len(vim.current.buffer), 0)
+cb.append('Current tab page: ' + repr(vim.current.tabpage))
+cb.append('Current window: ' + repr(vim.current.window))
+cb.append('Current buffer: ' + repr(vim.current.buffer))
+cb.append('Current line: ' + repr(vim.current.line))
+for b in vim.buffers:
+    if b is not cb:
+        vim.command('bwipeout! ' + str(b.number))
+EOF
+:tabonly!
+:only!
 :endfun
 :"
 :call Test()