xref: /vim-8.2.3635/src/testdir/test_python2.vim (revision 89a9c159)
1" Test for python 2 commands.
2
3source check.vim
4CheckFeature python
5CheckFeature quickfix
6source shared.vim
7
8" NOTE: This will cause errors when run under valgrind.
9" This would require recompiling Python with:
10"   ./configure --without-pymalloc
11" See http://svn.python.org/view/python/trunk/Misc/README.valgrind?view=markup
12"
13
14" This function should be called first. This sets up python functions used by
15" the other tests.
16func Test_AAA_python_setup()
17  py << trim EOF
18    import vim
19    import sys
20
21    def emsg(ei):
22      return ei[0].__name__ + ':' + repr(ei[1].args)
23
24    def ee(expr, g=globals(), l=locals()):
25      try:
26        exec(expr, g, l)
27      except:
28        ei = sys.exc_info()
29        msg = emsg(ei)
30        msg = msg.replace('TypeError:(\'argument 1 ', 'TypeError:(\'')
31        if expr.find('None') > -1:
32          msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
33                        'TypeError:("\'NoneType\' object is not iterable",)')
34        if expr.find('FailingNumber') > -1:
35          msg = msg.replace(', not \'FailingNumber\'', '').replace('"', '\'')
36          msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
37                    'TypeError:("\'FailingNumber\' object is not iterable",)')
38        if msg.find('(\'\'') > -1 or msg.find('(\'can\'t') > -1:
39          msg = msg.replace('(\'', '("').replace('\',)', '",)')
40        # Some Python versions say can't, others cannot.
41        if msg.find('can\'t') > -1:
42          msg = msg.replace('can\'t', 'cannot')
43        # Some Python versions use single quote, some double quote
44        if msg.find('"cannot ') > -1:
45          msg = msg.replace('"cannot ', '\'cannot ')
46        if msg.find(' attributes"') > -1:
47          msg = msg.replace(' attributes"', ' attributes\'')
48        if expr == 'fd(self=[])':
49          # HACK: PyMapping_Check changed meaning
50          msg = msg.replace('AttributeError:(\'keys\',)',
51                  'TypeError:(\'unable to convert list to vim dictionary\',)')
52        vim.current.buffer.append(expr + ':' + msg)
53      else:
54        vim.current.buffer.append(expr + ':NOT FAILED')
55  EOF
56endfunc
57
58func Test_pydo()
59  " Check deleting lines does not trigger an ml_get error.
60  new
61  call setline(1, ['one', 'two', 'three'])
62  pydo vim.command("%d_")
63  bwipe!
64
65  " Check switching to another buffer does not trigger an ml_get error.
66  new
67  let wincount = winnr('$')
68  call setline(1, ['one', 'two', 'three'])
69  pydo vim.command("new")
70  call assert_equal(wincount + 1, winnr('$'))
71  bwipe!
72  bwipe!
73
74  " Try modifying a buffer with 'nomodifiable' set
75  set nomodifiable
76  call assert_fails('pydo toupper(line)', 'E21:')
77  set modifiable
78
79  " Invalid command
80  call AssertException(['pydo non_existing_cmd'],
81        \ "Vim(pydo):NameError: global name 'non_existing_cmd' is not defined")
82  call AssertException(["pydo raise Exception('test')"],
83        \ 'Vim(pydo):Exception: test')
84  call AssertException(["pydo {lambda}"],
85        \ 'Vim(pydo):SyntaxError: invalid syntax')
86endfunc
87
88func Test_set_cursor()
89  " Check that setting the cursor position works.
90  new
91  call setline(1, ['first line', 'second line'])
92  normal gg
93  pydo vim.current.window.cursor = (1, 5)
94  call assert_equal([1, 6], [line('.'), col('.')])
95
96  " Check that movement after setting cursor position keeps current column.
97  normal j
98  call assert_equal([2, 6], [line('.'), col('.')])
99endfunc
100
101func Test_vim_function()
102  " Check creating vim.Function object
103
104  func s:foo()
105    return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
106  endfunc
107  let name = '<SNR>' . s:foo()
108
109  try
110    py f = vim.bindeval('function("s:foo")')
111    call assert_equal(name, pyeval('f.name'))
112  catch
113    call assert_false(v:exception)
114  endtry
115
116  try
117    py f = vim.Function('\x80\xfdR' + vim.eval('s:foo()'))
118    call assert_equal(name, 'f.name'->pyeval())
119  catch
120    call assert_false(v:exception)
121  endtry
122
123  " Non-existing function attribute
124  call AssertException(["let x = pyeval('f.abc')"],
125        \ 'Vim(let):AttributeError: abc')
126
127  py del f
128  delfunc s:foo
129endfunc
130
131func Test_skipped_python_command_does_not_affect_pyxversion()
132  set pyxversion=0
133  if 0
134    python import vim
135  endif
136  call assert_equal(0, &pyxversion)  " This assertion would have failed with Vim 8.0.0251. (pyxversion was introduced in 8.0.0251.)
137endfunc
138
139func _SetUpHiddenBuffer()
140  new
141  edit hidden
142  setlocal bufhidden=hide
143
144  enew
145  let lnum = 0
146  while lnum < 10
147    call append( 1, string( lnum ) )
148    let lnum = lnum + 1
149  endwhile
150  normal G
151
152  call assert_equal( line( '.' ), 11 )
153endfunc
154
155func _CleanUpHiddenBuffer()
156  bwipe! hidden
157  bwipe!
158endfunc
159
160func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Clear()
161  call _SetUpHiddenBuffer()
162  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = None
163  call assert_equal( line( '.' ), 11 )
164  call _CleanUpHiddenBuffer()
165endfunc
166
167func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_List()
168  call _SetUpHiddenBuffer()
169  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = [ 'test' ]
170  call assert_equal( line( '.' ), 11 )
171  call _CleanUpHiddenBuffer()
172endfunc
173
174func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Str()
175  call _SetUpHiddenBuffer()
176  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = 'test'
177  call assert_equal( line( '.' ), 11 )
178  call _CleanUpHiddenBuffer()
179endfunc
180
181func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_ClearLine()
182  call _SetUpHiddenBuffer()
183  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = None
184  call assert_equal( line( '.' ), 11 )
185  call _CleanUpHiddenBuffer()
186endfunc
187
188func _SetUpVisibleBuffer()
189  new
190  let lnum = 0
191  while lnum < 10
192    call append( 1, string( lnum ) )
193    let lnum = lnum + 1
194  endwhile
195  normal G
196  call assert_equal( line( '.' ), 11 )
197endfunc
198
199func Test_Write_To_Current_Buffer_Fixes_Cursor_Clear()
200  call _SetUpVisibleBuffer()
201
202  py vim.current.buffer[:] = None
203  call assert_equal( line( '.' ), 1 )
204
205  bwipe!
206endfunc
207
208func Test_Write_To_Current_Buffer_Fixes_Cursor_List()
209  call _SetUpVisibleBuffer()
210
211  py vim.current.buffer[:] = [ 'test' ]
212  call assert_equal( line( '.' ), 1 )
213
214  bwipe!
215endfunc
216
217func Test_Write_To_Current_Buffer_Fixes_Cursor_Str()
218  call _SetUpVisibleBuffer()
219
220  py vim.current.buffer[-1] = None
221  call assert_equal( line( '.' ), 10 )
222
223  bwipe!
224endfunc
225
226func Test_Catch_Exception_Message()
227  try
228    py raise RuntimeError( 'TEST' )
229  catch /.*/
230    call assert_match( '^Vim(.*):RuntimeError: TEST$', v:exception )
231  endtry
232endfunc
233
234" Test for various heredoc syntax
235func Test_python_heredoc()
236  python << END
237s='A'
238END
239  python <<
240s+='B'
241.
242  python << trim END
243    s+='C'
244  END
245  python << trim
246    s+='D'
247  .
248  python << trim eof
249    s+='E'
250  eof
251  call assert_equal('ABCDE', pyxeval('s'))
252endfunc
253
254" Test for the buffer range object
255func Test_python_range()
256  new
257  call setline(1, ['one', 'two', 'three'])
258  py b = vim.current.buffer
259  py r = b.range(1, 3)
260  call assert_equal(0, pyeval('r.start'))
261  call assert_equal(2, pyeval('r.end'))
262  call assert_equal('one', pyeval('r[0]'))
263  call assert_equal('one', pyeval('r[-3]'))
264  call assert_equal('three', pyeval('r[-4]'))
265  call assert_equal(['two', 'three'], pyeval('r[1:]'))
266  py r[0] = 'green'
267  call assert_equal(['green', 'two', 'three'], getline(1, '$'))
268  py r[0:2] = ['red', 'blue']
269  call assert_equal(['red', 'blue', 'three'], getline(1, '$'))
270  call assert_equal(['start', 'end', '__members__'], pyeval('r.__members__'))
271
272  " try different invalid start/end index for the range slice
273  %d
274  call setline(1, ['one', 'two', 'three'])
275  py r[-10:1] = ["a"]
276  py r[10:12] = ["b"]
277  py r[-10:-9] = ["c"]
278  py r[1:0] = ["d"]
279  call assert_equal(['c', 'd', 'a', 'two', 'three', 'b'], getline(1, '$'))
280
281  " The following code used to trigger an ml_get error
282  %d
283  let x = pyeval('r[:]')
284
285  " Non-existing range attribute
286  call AssertException(["let x = pyeval('r.abc')"],
287        \ 'Vim(let):AttributeError: abc')
288
289  close!
290endfunc
291
292" Test for the python tabpage object
293func Test_python_tabpage()
294  tabnew
295  py t = vim.tabpages[1]
296  py wl = t.windows
297  tabclose
298  " Accessing a closed tabpage
299  call AssertException(["let n = pyeval('t.number')"],
300        \ 'Vim(let):vim.error: attempt to refer to deleted tab page')
301  call AssertException(["let n = pyeval('len(wl)')"],
302        \ 'Vim(let):vim.error: attempt to refer to deleted tab page')
303  call AssertException(["py w = wl[0]"],
304        \ 'Vim(python):vim.error: attempt to refer to deleted tab page')
305  call AssertException(["py vim.current.tabpage = t"],
306        \ 'Vim(python):vim.error: attempt to refer to deleted tab page')
307  call assert_match('<tabpage object (deleted)', pyeval('repr(t)'))
308  %bw!
309endfunc
310
311" Test for the python window object
312func Test_python_window()
313  " Test for setting the window height
314  10new
315  py vim.current.window.height = 5
316  call assert_equal(5, winheight(0))
317  py vim.current.window.height = 3.2
318  call assert_equal(3, winheight(0))
319
320  " Test for setting the window width
321  10vnew
322  py vim.current.window.width = 6
323  call assert_equal(6, winwidth(0))
324
325  " Try accessing a closed window
326  py w = vim.current.window
327  py wopts = w.options
328  close
329  " Access the attributes of a closed window
330  call AssertException(["let n = pyeval('w.number')"],
331        \ 'Vim(let):vim.error: attempt to refer to deleted window')
332  call AssertException(["py w.height = 5"],
333        \ 'Vim(python):vim.error: attempt to refer to deleted window')
334  call AssertException(["py vim.current.window = w"],
335        \ 'Vim(python):vim.error: attempt to refer to deleted window')
336  " Try to set one of the options of the closed window
337  " The following caused an ASAN failure
338  call AssertException(["py wopts['list'] = False"],
339        \ 'vim.error: attempt to refer to deleted window')
340  call assert_match('<window object (deleted)', pyeval("repr(w)"))
341  %bw!
342endfunc
343
344" Test for the python List object
345func Test_python_list()
346  let l = [1, 2]
347  py pl = vim.bindeval('l')
348  call assert_equal(['locked', '__members__'], pyeval('pl.__members__'))
349
350  " Try to convert a null List
351  call AssertException(["py t = vim.eval('test_null_list()')"],
352        \ 'Vim(python):SystemError: error return without exception set')
353
354  " Try to convert a List with a null List item
355  call AssertException(["py t = vim.eval('[test_null_list()]')"],
356        \ 'Vim(python):SystemError: error return without exception set')
357
358  " Try to bind a null List variable (works because an empty list is used)
359  let cmds =<< trim END
360    let l = test_null_list()
361    py ll = vim.bindeval('l')
362  END
363  call AssertException(cmds, '')
364
365  let l = []
366  py l = vim.bindeval('l')
367  py f = vim.bindeval('function("strlen")')
368  " Extending List directly with different types
369  py l.extend([1, "as'd", [1, 2, f, {'a': 1}]])
370  call assert_equal([1, "as'd", [1, 2, function("strlen"), {'a': 1}]], l)
371  call assert_equal([1, 2, function("strlen"), {'a': 1}], l[-1])
372  call assert_fails('echo l[-4]', 'E684:')
373
374  " List assignment
375  py l[0] = 0
376  call assert_equal([0, "as'd", [1, 2, function("strlen"), {'a': 1}]], l)
377  py l[-2] = f
378  call assert_equal([0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]], l)
379
380  " appending to a list
381  let l = [1, 2]
382  py ll = vim.bindeval('l')
383  py ll[2] = 8
384  call assert_equal([1, 2, 8], l)
385
386  " Using dict as an index
387  call AssertException(['py ll[{}] = 10'],
388        \ 'Vim(python):TypeError: index must be int or slice, not dict')
389endfunc
390
391" Test for the python Dict object
392func Test_python_dict()
393  let d = {}
394  py pd = vim.bindeval('d')
395  call assert_equal(['locked', 'scope', '__members__'],
396        \ pyeval('pd.__members__'))
397
398  " Try to convert a null Dict
399  call AssertException(["py t = vim.eval('test_null_dict()')"],
400        \ 'Vim(python):SystemError: error return without exception set')
401
402  " Try to convert a Dict with a null List value
403  call AssertException(["py t = vim.eval(\"{'a' : test_null_list()}\")"],
404        \ 'Vim(python):SystemError: error return without exception set')
405
406  " Try to convert a Dict with a null string key
407  py t = vim.eval("{test_null_string() : 10}")
408  call assert_fails("let d = pyeval('t')", 'E859:')
409
410  " Dict length
411  let d = {'a' : 10, 'b' : 20}
412  py d = vim.bindeval('d')
413  call assert_equal(2, pyeval('len(d)'))
414
415  " Deleting an non-existing key
416  call AssertException(["py del d['c']"], "Vim(python):KeyError: 'c'")
417endfunc
418
419" Extending Dictionary directly with different types
420func Test_python_dict_extend()
421  let d = {}
422  func d.f()
423    return 1
424  endfunc
425
426  py f = vim.bindeval('function("strlen")')
427  py << trim EOF
428    d = vim.bindeval('d')
429    d['1'] = 'asd'
430    d.update()  # Must not do anything, including throwing errors
431    d.update(b = [1, 2, f])
432    d.update((('-1', {'a': 1}),))
433    d.update({'0': -1})
434    dk = d.keys()
435    dv = d.values()
436    di = d.items()
437    cmpfun = lambda a, b: cmp(repr(a), repr(b))
438    dk.sort(cmpfun)
439    dv.sort(cmpfun)
440    di.sort(cmpfun)
441  EOF
442
443  " Try extending a locked dictionary
444  lockvar d
445  call AssertException(["py d.update({'b' : 20})"],
446        \ 'Vim(python):vim.error: dictionary is locked')
447  unlockvar d
448
449  call assert_equal(1, pyeval("d['f'](self={})"))
450  call assert_equal("['-1', '0', '1', 'b', 'f']", pyeval('repr(dk)'))
451  call assert_equal("['asd', -1L, <vim.Function '1'>, <vim.dictionary object at >, <vim.list object at >]", substitute(pyeval('repr(dv)'),'0x\x\+','','g'))
452  call assert_equal("[('-1', <vim.dictionary object at >), ('0', -1L), ('1', 'asd'), ('b', <vim.list object at >), ('f', <vim.Function '1'>)]", substitute(pyeval('repr(di)'),'0x\x\+','','g'))
453  call assert_equal(['0', '1', 'b', 'f', '-1'], keys(d))
454  call assert_equal("[-1, 'asd', [1, 2, function('strlen')], function('1'), {'a': 1}]", string(values(d)))
455  py del dk
456  py del di
457  py del dv
458endfunc
459
460func Test_python_list_del_items()
461  " removing items with del
462  let l = [0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]]
463  py l = vim.bindeval('l')
464  py del l[2]
465  call assert_equal("[0, function('strlen')]", string(l))
466
467  let l = range(8)
468  py l = vim.bindeval('l')
469  py del l[:3]
470  py del l[1:]
471  call assert_equal([3], l)
472
473  " removing items out of range: silently skip items that don't exist
474
475  " The following two ranges delete nothing as they match empty list:
476  let l = [0, 1, 2, 3]
477  py l = vim.bindeval('l')
478  py del l[2:1]
479  call assert_equal([0, 1, 2, 3], l)
480  py del l[2:2]
481  call assert_equal([0, 1, 2, 3], l)
482  py del l[2:3]
483  call assert_equal([0, 1, 3], l)
484
485  let l = [0, 1, 2, 3]
486  py l = vim.bindeval('l')
487  py del l[2:4]
488  call assert_equal([0, 1], l)
489
490  let l = [0, 1, 2, 3]
491  py l = vim.bindeval('l')
492  py del l[2:5]
493  call assert_equal([0, 1], l)
494
495  let l = [0, 1, 2, 3]
496  py l = vim.bindeval('l')
497  py del l[2:6]
498  call assert_equal([0, 1], l)
499
500  " The following two ranges delete nothing as they match empty list:
501  let l = [0, 1, 2, 3]
502  py l = vim.bindeval('l')
503  py del l[-1:2]
504  call assert_equal([0, 1, 2, 3], l)
505  py del l[-2:2]
506  call assert_equal([0, 1, 2, 3], l)
507  py del l[-3:2]
508  call assert_equal([0, 2, 3], l)
509
510  let l = [0, 1, 2, 3]
511  py l = vim.bindeval('l')
512  py del l[-4:2]
513  call assert_equal([2, 3], l)
514
515  let l = [0, 1, 2, 3]
516  py l = vim.bindeval('l')
517  py del l[-5:2]
518  call assert_equal([2, 3], l)
519
520  let l = [0, 1, 2, 3]
521  py l = vim.bindeval('l')
522  py del l[-6:2]
523  call assert_equal([2, 3], l)
524
525  let l = [0, 1, 2, 3]
526  py l = vim.bindeval('l')
527  py del l[::2]
528  call assert_equal([1, 3], l)
529
530  let l = [0, 1, 2, 3]
531  py l = vim.bindeval('l')
532  py del l[3:0:-2]
533  call assert_equal([0, 2], l)
534
535  let l = [0, 1, 2, 3]
536  py l = vim.bindeval('l')
537  py del l[2:4:-2]
538  let l = [0, 1, 2, 3]
539endfunc
540
541func Test_python_dict_del_items()
542  let d = eval("{'0' : -1, '1' : 'asd', 'b' : [1, 2, function('strlen')], 'f' : function('min'), '-1' : {'a': 1}}")
543  py d = vim.bindeval('d')
544  py del d['-1']
545  py del d['f']
546  call assert_equal([1, 2, function('strlen')], pyeval('d.get(''b'', 1)'))
547  call assert_equal([1, 2, function('strlen')], pyeval('d.pop(''b'')'))
548  call assert_equal(1, pyeval('d.get(''b'', 1)'))
549  call assert_equal('asd', pyeval('d.pop(''1'', 2)'))
550  call assert_equal(2, pyeval('d.pop(''1'', 2)'))
551  call assert_equal('True', pyeval('repr(d.has_key(''0''))'))
552  call assert_equal('False', pyeval('repr(d.has_key(''1''))'))
553  call assert_equal('True', pyeval('repr(''0'' in d)'))
554  call assert_equal('False', pyeval('repr(''1'' in d)'))
555  call assert_equal("['0']", pyeval('repr(list(iter(d)))'))
556  call assert_equal({'0' : -1}, d)
557  call assert_equal("('0', -1L)", pyeval('repr(d.popitem())'))
558  call assert_equal('None', pyeval('repr(d.get(''0''))'))
559  call assert_equal('[]', pyeval('repr(list(iter(d)))'))
560endfunc
561
562" Slice assignment to a list
563func Test_python_slice_assignment()
564  let l = [0, 1, 2, 3]
565  py l = vim.bindeval('l')
566  py l[0:0] = ['a']
567  call assert_equal(['a', 0, 1, 2, 3], l)
568
569  let l = [0, 1, 2, 3]
570  py l = vim.bindeval('l')
571  py l[1:2] = ['b']
572  call assert_equal([0, 'b', 2, 3], l)
573
574  let l = [0, 1, 2, 3]
575  py l = vim.bindeval('l')
576  py l[2:4] = ['c']
577  call assert_equal([0, 1, 'c'], l)
578
579  let l = [0, 1, 2, 3]
580  py l = vim.bindeval('l')
581  py l[4:4] = ['d']
582  call assert_equal([0, 1, 2, 3, 'd'], l)
583
584  let l = [0, 1, 2, 3]
585  py l = vim.bindeval('l')
586  py l[-1:2] = ['e']
587  call assert_equal([0, 1, 2, 'e', 3], l)
588
589  let l = [0, 1, 2, 3]
590  py l = vim.bindeval('l')
591  py l[-10:2] = ['f']
592  call assert_equal(['f', 2, 3], l)
593
594  let l = [0, 1, 2, 3]
595  py l = vim.bindeval('l')
596  py l[2:-10] = ['g']
597  call assert_equal([0, 1, 'g', 2, 3], l)
598
599  let l = []
600  py l = vim.bindeval('l')
601  py l[0:0] = ['h']
602  call assert_equal(['h'], l)
603
604  let l = range(8)
605  py l = vim.bindeval('l')
606  py l[2:6:2] = [10, 20]
607  call assert_equal([0, 1, 10, 3, 20, 5, 6, 7], l)
608
609  let l = range(8)
610  py l = vim.bindeval('l')
611  py l[6:2:-2] = [10, 20]
612  call assert_equal([0, 1, 2, 3, 20, 5, 10, 7], l)
613
614  let l = range(8)
615  py l = vim.bindeval('l')
616  py l[6:2] = ()
617  call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
618
619  let l = range(8)
620  py l = vim.bindeval('l')
621  py l[6:2:1] = ()
622  call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
623
624  let l = range(8)
625  py l = vim.bindeval('l')
626  py l[2:2:1] = ()
627  call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
628
629  call AssertException(["py x = l[10:11:0]"],
630        \ "Vim(python):ValueError: slice step cannot be zero")
631endfunc
632
633" Locked variables
634func Test_python_lockedvar()
635  new
636  py cb = vim.current.buffer
637  let l = [0, 1, 2, 3]
638  py l = vim.bindeval('l')
639  lockvar! l
640  py << trim EOF
641    try:
642        l[2]='i'
643    except vim.error:
644        cb.append('l[2] threw vim.error: ' + emsg(sys.exc_info()))
645  EOF
646  call assert_equal(['', "l[2] threw vim.error: error:('list is locked',)"],
647        \ getline(1, '$'))
648
649  " Try to concatenate a locked list
650  call AssertException(['py l += [4, 5]'],
651        \ 'Vim(python):vim.error: list is locked')
652
653  call assert_equal([0, 1, 2, 3], l)
654  unlockvar! l
655  close!
656endfunc
657
658" Test for calling a function
659func Test_python_function_call()
660  func New(...)
661    return ['NewStart'] + a:000 + ['NewEnd']
662  endfunc
663
664  func DictNew(...) dict
665    return ['DictNewStart'] + a:000 + ['DictNewEnd', self]
666  endfunc
667
668  new
669  let l = [function('New'), function('DictNew')]
670  py l = vim.bindeval('l')
671  py l.extend(list(l[0](1, 2, 3)))
672  call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd'], l)
673  py l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
674  call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}], l)
675  py l.extend([l[0].name])
676  call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}, 'New'], l)
677  py ee('l[1](1, 2, 3)')
678  call assert_equal("l[1](1, 2, 3):error:('Vim:E725: Calling dict function without Dictionary: DictNew',)", getline(2))
679  %d
680  py f = l[0]
681  delfunction New
682  py ee('f(1, 2, 3)')
683  call assert_equal("f(1, 2, 3):error:('Vim:E117: Unknown function: New',)", getline(2))
684  close!
685  delfunction DictNew
686endfunc
687
688func Test_python_float()
689  CheckFeature float
690  let l = [0.0]
691  py l = vim.bindeval('l')
692  py l.extend([0.0])
693  call assert_equal([0.0, 0.0], l)
694endfunc
695
696" Test for Dict key errors
697func Test_python_dict_key_error()
698  let messages = []
699  py << trim EOF
700    d = vim.bindeval('{}')
701    m = vim.bindeval('messages')
702    def em(expr, g=globals(), l=locals()):
703      try:
704        exec(expr, g, l)
705      except:
706        m.extend([sys.exc_type.__name__])
707
708    em('d["abc1"]')
709    em('d["abc1"]="\\0"')
710    em('d["abc1"]=vim')
711    em('d[""]=1')
712    em('d["a\\0b"]=1')
713    em('d[u"a\\0b"]=1')
714    em('d.pop("abc1")')
715    em('d.popitem()')
716    del em
717    del m
718  EOF
719
720  call assert_equal(['KeyError', 'TypeError', 'TypeError', 'ValueError',
721        \ 'TypeError', 'TypeError', 'KeyError', 'KeyError'], messages)
722  unlet messages
723endfunc
724
725" Test for locked and scope attributes
726func Test_python_lock_scope_attr()
727  let d = {} | let dl = {} | lockvar dl
728  let res = []
729  for s in split("d dl v: g:")
730    let name = tr(s, ':', 's')
731    execute 'py ' .. name .. ' = vim.bindeval("' .. s .. '")'
732    call add(res, s .. ' : ' .. join(map(['locked', 'scope'],
733          \ 'v:val .. ":" .. pyeval(name .. "." .. v:val)'), ';'))
734  endfor
735  call assert_equal(['d : locked:0;scope:0', 'dl : locked:1;scope:0',
736        \ 'v: : locked:2;scope:1', 'g: : locked:0;scope:2'], res)
737
738  silent! let d.abc2 = 1
739  silent! let dl.abc3 = 1
740  py d.locked = True
741  py dl.locked = False
742  silent! let d.def = 1
743  silent! let dl.def = 1
744  call assert_equal({'abc2': 1}, d)
745  call assert_equal({'def': 1}, dl)
746  unlet d dl
747
748  let l = [] | let ll = [] | lockvar ll
749  let res = []
750  for s in split("l ll")
751    let name = tr(s, ':', 's')
752    execute 'py ' .. name .. '=vim.bindeval("' .. s .. '")'
753    call add(res, s .. ' : locked:' .. pyeval(name .. '.locked'))
754  endfor
755  call assert_equal(['l : locked:0', 'll : locked:1'], res)
756
757  silent! call extend(l, [0])
758  silent! call extend(ll, [0])
759  py l.locked = True
760  py ll.locked = False
761  silent! call extend(l, [1])
762  silent! call extend(ll, [1])
763  call assert_equal([0], l)
764  call assert_equal([1], ll)
765  unlet l ll
766
767  " Try changing an attribute of a fixed list
768  py a = vim.bindeval('v:argv')
769  call AssertException(['py a.locked = 0'],
770        \ 'Vim(python):TypeError: cannot modify fixed list')
771endfunc
772
773" Test for pyeval()
774func Test_python_pyeval()
775  let l = pyeval('range(3)')
776  call assert_equal([0, 1, 2], l)
777
778  let d = pyeval('{"a": "b", "c": 1, "d": ["e"]}')
779  call assert_equal([['a', 'b'], ['c', 1], ['d', ['e']]], sort(items(d)))
780
781  let v:errmsg = ''
782  call assert_equal(v:none, pyeval('None'))
783  call assert_equal('', v:errmsg)
784
785  py v = vim.eval('test_null_function()')
786  call assert_equal(v:none, pyeval('v'))
787
788  if has('float')
789    call assert_equal(0.0, pyeval('0.0'))
790  endif
791
792  " Evaluate an invalid values
793  call AssertException(['let v = pyeval(''"\0"'')'], 'E859:')
794  call AssertException(['let v = pyeval(''{"\0" : 1}'')'], 'E859:')
795  call AssertException(['let v = pyeval("undefined_name")'],
796        \ "Vim(let):NameError: name 'undefined_name' is not defined")
797  call AssertException(['let v = pyeval("vim")'], 'E859:')
798endfunc
799
800" Test for vim.bindeval()
801func Test_python_vim_bindeval()
802  " Float
803  let f = 3.14
804  py f = vim.bindeval('f')
805  call assert_equal(3.14, pyeval('f'))
806
807  " Blob
808  let b = 0z12
809  py b = vim.bindeval('b')
810  call assert_equal("\x12", pyeval('b'))
811
812  " Bool
813  call assert_equal(1, pyeval("vim.bindeval('v:true')"))
814  call assert_equal(0, pyeval("vim.bindeval('v:false')"))
815  call assert_equal(v:none, pyeval("vim.bindeval('v:null')"))
816  call assert_equal(v:none, pyeval("vim.bindeval('v:none')"))
817
818  " channel/job
819  if has('channel')
820    call assert_equal(v:none, pyeval("vim.bindeval('test_null_channel()')"))
821  endif
822  if has('job')
823    call assert_equal(v:none, pyeval("vim.bindeval('test_null_job()')"))
824  endif
825endfunc
826
827" threading
828" Running pydo command (Test_pydo) before this test, stops the python thread
829" from running. So this test should be run before the pydo test
830func Test_aaa_python_threading()
831  let l = [0]
832  py l = vim.bindeval('l')
833  py << trim EOF
834    import threading
835    import time
836
837    class T(threading.Thread):
838      def __init__(self):
839        threading.Thread.__init__(self)
840        self.t = 0
841        self.running = True
842
843      def run(self):
844        while self.running:
845          self.t += 1
846          time.sleep(0.1)
847
848    t = T()
849    del T
850    t.start()
851  EOF
852
853  sleep 1
854  py t.running = False
855  py t.join()
856
857  " Check if the background thread is working.  Count should be 10, but on a
858  " busy system (AppVeyor) it can be much lower.
859  py l[0] = t.t > 4
860  py del time
861  py del threading
862  py del t
863  call assert_equal([1], l)
864endfunc
865
866" settrace
867func Test_python_settrace()
868  let l = []
869  py l = vim.bindeval('l')
870  py << trim EOF
871    import sys
872
873    def traceit(frame, event, arg):
874      global l
875      if event == "line":
876          l.extend([frame.f_lineno])
877      return traceit
878
879    def trace_main():
880      for i in range(5):
881        pass
882  EOF
883  py sys.settrace(traceit)
884  py trace_main()
885  py sys.settrace(None)
886  py del traceit
887  py del trace_main
888  call assert_equal([1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1], l)
889endfunc
890
891" Slice
892func Test_python_list_slice()
893  py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
894  py l = ll[:4]
895  call assert_equal([0, 1, 2, 3], pyeval('l'))
896  py l = ll[2:]
897  call assert_equal([2, 3, 4, 5], pyeval('l'))
898  py l = ll[:-4]
899  call assert_equal([0, 1], pyeval('l'))
900  py l = ll[-2:]
901  call assert_equal([4, 5], pyeval('l'))
902  py l = ll[2:4]
903  call assert_equal([2, 3], pyeval('l'))
904  py l = ll[4:2]
905  call assert_equal([], pyeval('l'))
906  py l = ll[-4:-2]
907  call assert_equal([2, 3], pyeval('l'))
908  py l = ll[-2:-4]
909  call assert_equal([], pyeval('l'))
910  py l = ll[:]
911  call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
912  py l = ll[0:6]
913  call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
914  py l = ll[-10:10]
915  call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
916  py l = ll[4:2:-1]
917  call assert_equal([4, 3], pyeval('l'))
918  py l = ll[::2]
919  call assert_equal([0, 2, 4], pyeval('l'))
920  py l = ll[4:2:1]
921  call assert_equal([], pyeval('l'))
922
923  " Error case: Use an invalid index
924  call AssertException(['py ll[-10] = 5'], 'Vim(python):vim.error: internal error:')
925
926  " Use a step value of 0
927  call AssertException(['py ll[0:3:0] = [1, 2, 3]'],
928        \ 'Vim(python):ValueError: slice step cannot be zero')
929
930  " Error case: Invalid slice type
931  call AssertException(["py x = ll['abc']"],
932        \ 'Vim(python):TypeError: index must be int or slice, not str')
933  py del l
934
935  " Error case: List with a null list item
936  let l = [test_null_list()]
937  py ll = vim.bindeval('l')
938  call AssertException(["py x = ll[:]"],
939        \ 'Vim(python):SystemError: error return without exception set')
940endfunc
941
942" Vars
943func Test_python_vars()
944  let g:foo = 'bac'
945  let w:abc3 = 'def'
946  let b:baz = 'bar'
947  let t:bar = 'jkl'
948  try
949    throw "Abc"
950  catch /Abc/
951    call assert_equal('Abc', pyeval('vim.vvars[''exception'']'))
952  endtry
953  call assert_equal('bac', pyeval('vim.vars[''foo'']'))
954  call assert_equal('def', pyeval('vim.current.window.vars[''abc3'']'))
955  call assert_equal('bar', pyeval('vim.current.buffer.vars[''baz'']'))
956  call assert_equal('jkl', pyeval('vim.current.tabpage.vars[''bar'']'))
957endfunc
958
959" Options
960" paste:          boolean, global
961" previewheight   number,  global
962" operatorfunc:   string,  global
963" number:         boolean, window-local
964" numberwidth:    number,  window-local
965" colorcolumn:    string,  window-local
966" statusline:     string,  window-local/global
967" autoindent:     boolean, buffer-local
968" shiftwidth:     number,  buffer-local
969" omnifunc:       string,  buffer-local
970" preserveindent: boolean, buffer-local/global
971" path:           string,  buffer-local/global
972func Test_python_opts()
973  let g:res = []
974  let g:bufs = [bufnr('%')]
975  new
976  let g:bufs += [bufnr('%')]
977  vnew
978  let g:bufs += [bufnr('%')]
979  wincmd j
980  vnew
981  let g:bufs += [bufnr('%')]
982  wincmd l
983
984  func RecVars(opt)
985    let gval = string(eval('&g:' .. a:opt))
986    let wvals = join(map(range(1, 4),
987          \ 'v:val .. ":" .. string(getwinvar(v:val, "&" .. a:opt))'))
988    let bvals = join(map(copy(g:bufs),
989          \ 'v:val .. ":" .. string(getbufvar(v:val, "&" .. a:opt))'))
990    call add(g:res, '  G: ' .. gval)
991    call add(g:res, '  W: ' .. wvals)
992    call add(g:res, '  B: ' .. wvals)
993  endfunc
994
995  py << trim EOF
996    def e(s, g=globals(), l=locals()):
997      try:
998        exec(s, g, l)
999      except:
1000        vim.command('return ' + repr(sys.exc_type.__name__))
1001
1002    def ev(s, g=globals(), l=locals()):
1003      try:
1004        return eval(s, g, l)
1005      except:
1006        vim.command('let exc=' + repr(sys.exc_type.__name__))
1007        return 0
1008  EOF
1009
1010  func E(s)
1011    python e(vim.eval('a:s'))
1012  endfunc
1013
1014  func Ev(s)
1015    let r = pyeval('ev(vim.eval("a:s"))')
1016    if exists('exc')
1017      throw exc
1018    endif
1019    return r
1020  endfunc
1021
1022  py gopts1 = vim.options
1023  py wopts1 = vim.windows[2].options
1024  py wopts2 = vim.windows[0].options
1025  py wopts3 = vim.windows[1].options
1026  py bopts1 = vim.buffers[vim.bindeval("g:bufs")[2]].options
1027  py bopts2 = vim.buffers[vim.bindeval("g:bufs")[1]].options
1028  py bopts3 = vim.buffers[vim.bindeval("g:bufs")[0]].options
1029  call add(g:res, 'wopts iters equal: ' ..
1030        \ pyeval('list(wopts1) == list(wopts2)'))
1031  call add(g:res, 'bopts iters equal: ' ..
1032        \ pyeval('list(bopts1) == list(bopts2)'))
1033  py gset = set(iter(gopts1))
1034  py wset = set(iter(wopts1))
1035  py bset = set(iter(bopts1))
1036
1037  set path=.,..,,
1038  let lst = []
1039  let lst += [['paste', 1, 0, 1, 2, 1, 1, 0]]
1040  let lst += [['previewheight', 5, 1, 6, 'a', 0, 1, 0]]
1041  let lst += [['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0]]
1042  let lst += [['number', 0, 1, 1, 0, 1, 0, 1]]
1043  let lst += [['numberwidth', 2, 3, 5, -100, 0, 0, 1]]
1044  let lst += [['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1]]
1045  let lst += [['statusline', '1', '2', '4', 0, 0, 1, 1]]
1046  let lst += [['autoindent', 0, 1, 1, 2, 1, 0, 2]]
1047  let lst += [['shiftwidth', 0, 2, 1, 3, 0, 0, 2]]
1048  let lst += [['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2]]
1049  let lst += [['preserveindent', 0, 1, 1, 2, 1, 1, 2]]
1050  let lst += [['path', '.,,', ',,', '.', 0, 0, 1, 2]]
1051  for  [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
1052    py oname = vim.eval('oname')
1053    py oval1 = vim.bindeval('oval1')
1054    py oval2 = vim.bindeval('oval2')
1055    py oval3 = vim.bindeval('oval3')
1056    if invval is 0 || invval is 1
1057      py invval = bool(vim.bindeval('invval'))
1058    else
1059      py invval = vim.bindeval('invval')
1060    endif
1061    if bool
1062      py oval1 = bool(oval1)
1063      py oval2 = bool(oval2)
1064      py oval3 = bool(oval3)
1065    endif
1066    call add(g:res, '>>> ' .. oname)
1067    call add(g:res, '  g/w/b:' .. pyeval('oname in gset') .. '/' ..
1068          \ pyeval('oname in wset') .. '/' .. pyeval('oname in bset'))
1069    call add(g:res, '  g/w/b (in):' .. pyeval('oname in gopts1') .. '/' ..
1070          \ pyeval('oname in wopts1') .. '/' .. pyeval('oname in bopts1'))
1071    for v in ['gopts1', 'wopts1', 'bopts1']
1072      try
1073        call add(g:res, '  p/' .. v .. ': ' .. Ev('repr(' .. v .. '[''' .. oname .. '''])'))
1074      catch
1075        call add(g:res, '  p/' .. v .. '! ' .. v:exception)
1076      endtry
1077      let r = E(v .. '[''' .. oname .. ''']=invval')
1078      if r isnot 0
1079        call add(g:res, '  inv: ' .. string(invval) .. '! ' .. r)
1080      endif
1081      for vv in (v is# 'gopts1' ? [v] : [v, v[:-2] .. '2', v[:-2] .. '3'])
1082        let val = substitute(vv, '^.opts', 'oval', '')
1083        let r = E(vv .. '[''' .. oname .. ''']=' .. val)
1084        if r isnot 0
1085            call add(g:res, '  ' .. vv .. '! ' .. r)
1086        endif
1087      endfor
1088    endfor
1089    call RecVars(oname)
1090    for v in ['wopts3', 'bopts3']
1091      let r = E('del ' .. v .. '["' .. oname .. '"]')
1092      if r isnot 0
1093        call add(g:res, '  del ' .. v .. '! ' .. r)
1094      endif
1095    endfor
1096    call RecVars(oname)
1097  endfor
1098  delfunction RecVars
1099  delfunction E
1100  delfunction Ev
1101  py del ev
1102  py del e
1103  only
1104  for buf in g:bufs[1:]
1105    execute 'bwipeout!' buf
1106  endfor
1107  py del gopts1
1108  py del wopts1
1109  py del wopts2
1110  py del wopts3
1111  py del bopts1
1112  py del bopts2
1113  py del bopts3
1114  py del oval1
1115  py del oval2
1116  py del oval3
1117  py del oname
1118  py del invval
1119
1120  let expected =<< trim END
1121    wopts iters equal: 1
1122    bopts iters equal: 1
1123    >>> paste
1124      g/w/b:1/0/0
1125      g/w/b (in):1/0/0
1126      p/gopts1: False
1127      p/wopts1! KeyError
1128      inv: 2! KeyError
1129      wopts1! KeyError
1130      wopts2! KeyError
1131      wopts3! KeyError
1132      p/bopts1! KeyError
1133      inv: 2! KeyError
1134      bopts1! KeyError
1135      bopts2! KeyError
1136      bopts3! KeyError
1137      G: 1
1138      W: 1:1 2:1 3:1 4:1
1139      B: 1:1 2:1 3:1 4:1
1140      del wopts3! KeyError
1141      del bopts3! KeyError
1142      G: 1
1143      W: 1:1 2:1 3:1 4:1
1144      B: 1:1 2:1 3:1 4:1
1145    >>> previewheight
1146      g/w/b:1/0/0
1147      g/w/b (in):1/0/0
1148      p/gopts1: 12
1149      inv: 'a'! TypeError
1150      p/wopts1! KeyError
1151      inv: 'a'! KeyError
1152      wopts1! KeyError
1153      wopts2! KeyError
1154      wopts3! KeyError
1155      p/bopts1! KeyError
1156      inv: 'a'! KeyError
1157      bopts1! KeyError
1158      bopts2! KeyError
1159      bopts3! KeyError
1160      G: 5
1161      W: 1:5 2:5 3:5 4:5
1162      B: 1:5 2:5 3:5 4:5
1163      del wopts3! KeyError
1164      del bopts3! KeyError
1165      G: 5
1166      W: 1:5 2:5 3:5 4:5
1167      B: 1:5 2:5 3:5 4:5
1168    >>> operatorfunc
1169      g/w/b:1/0/0
1170      g/w/b (in):1/0/0
1171      p/gopts1: ''
1172      inv: 2! TypeError
1173      p/wopts1! KeyError
1174      inv: 2! KeyError
1175      wopts1! KeyError
1176      wopts2! KeyError
1177      wopts3! KeyError
1178      p/bopts1! KeyError
1179      inv: 2! KeyError
1180      bopts1! KeyError
1181      bopts2! KeyError
1182      bopts3! KeyError
1183      G: 'A'
1184      W: 1:'A' 2:'A' 3:'A' 4:'A'
1185      B: 1:'A' 2:'A' 3:'A' 4:'A'
1186      del wopts3! KeyError
1187      del bopts3! KeyError
1188      G: 'A'
1189      W: 1:'A' 2:'A' 3:'A' 4:'A'
1190      B: 1:'A' 2:'A' 3:'A' 4:'A'
1191    >>> number
1192      g/w/b:0/1/0
1193      g/w/b (in):0/1/0
1194      p/gopts1! KeyError
1195      inv: 0! KeyError
1196      gopts1! KeyError
1197      p/wopts1: False
1198      p/bopts1! KeyError
1199      inv: 0! KeyError
1200      bopts1! KeyError
1201      bopts2! KeyError
1202      bopts3! KeyError
1203      G: 0
1204      W: 1:1 2:1 3:0 4:0
1205      B: 1:1 2:1 3:0 4:0
1206      del wopts3! ValueError
1207      del bopts3! KeyError
1208      G: 0
1209      W: 1:1 2:1 3:0 4:0
1210      B: 1:1 2:1 3:0 4:0
1211    >>> numberwidth
1212      g/w/b:0/1/0
1213      g/w/b (in):0/1/0
1214      p/gopts1! KeyError
1215      inv: -100! KeyError
1216      gopts1! KeyError
1217      p/wopts1: 4
1218      inv: -100! error
1219      p/bopts1! KeyError
1220      inv: -100! KeyError
1221      bopts1! KeyError
1222      bopts2! KeyError
1223      bopts3! KeyError
1224      G: 4
1225      W: 1:3 2:5 3:2 4:4
1226      B: 1:3 2:5 3:2 4:4
1227      del wopts3! ValueError
1228      del bopts3! KeyError
1229      G: 4
1230      W: 1:3 2:5 3:2 4:4
1231      B: 1:3 2:5 3:2 4:4
1232    >>> colorcolumn
1233      g/w/b:0/1/0
1234      g/w/b (in):0/1/0
1235      p/gopts1! KeyError
1236      inv: 'abc4'! KeyError
1237      gopts1! KeyError
1238      p/wopts1: ''
1239      inv: 'abc4'! error
1240      p/bopts1! KeyError
1241      inv: 'abc4'! KeyError
1242      bopts1! KeyError
1243      bopts2! KeyError
1244      bopts3! KeyError
1245      G: ''
1246      W: 1:'+2' 2:'+3' 3:'+1' 4:''
1247      B: 1:'+2' 2:'+3' 3:'+1' 4:''
1248      del wopts3! ValueError
1249      del bopts3! KeyError
1250      G: ''
1251      W: 1:'+2' 2:'+3' 3:'+1' 4:''
1252      B: 1:'+2' 2:'+3' 3:'+1' 4:''
1253    >>> statusline
1254      g/w/b:1/1/0
1255      g/w/b (in):1/1/0
1256      p/gopts1: ''
1257      inv: 0! TypeError
1258      p/wopts1: None
1259      inv: 0! TypeError
1260      p/bopts1! KeyError
1261      inv: 0! KeyError
1262      bopts1! KeyError
1263      bopts2! KeyError
1264      bopts3! KeyError
1265      G: '1'
1266      W: 1:'2' 2:'4' 3:'1' 4:'1'
1267      B: 1:'2' 2:'4' 3:'1' 4:'1'
1268      del bopts3! KeyError
1269      G: '1'
1270      W: 1:'2' 2:'1' 3:'1' 4:'1'
1271      B: 1:'2' 2:'1' 3:'1' 4:'1'
1272    >>> autoindent
1273      g/w/b:0/0/1
1274      g/w/b (in):0/0/1
1275      p/gopts1! KeyError
1276      inv: 2! KeyError
1277      gopts1! KeyError
1278      p/wopts1! KeyError
1279      inv: 2! KeyError
1280      wopts1! KeyError
1281      wopts2! KeyError
1282      wopts3! KeyError
1283      p/bopts1: False
1284      G: 0
1285      W: 1:0 2:1 3:0 4:1
1286      B: 1:0 2:1 3:0 4:1
1287      del wopts3! KeyError
1288      del bopts3! ValueError
1289      G: 0
1290      W: 1:0 2:1 3:0 4:1
1291      B: 1:0 2:1 3:0 4:1
1292    >>> shiftwidth
1293      g/w/b:0/0/1
1294      g/w/b (in):0/0/1
1295      p/gopts1! KeyError
1296      inv: 3! KeyError
1297      gopts1! KeyError
1298      p/wopts1! KeyError
1299      inv: 3! KeyError
1300      wopts1! KeyError
1301      wopts2! KeyError
1302      wopts3! KeyError
1303      p/bopts1: 8
1304      G: 8
1305      W: 1:0 2:2 3:8 4:1
1306      B: 1:0 2:2 3:8 4:1
1307      del wopts3! KeyError
1308      del bopts3! ValueError
1309      G: 8
1310      W: 1:0 2:2 3:8 4:1
1311      B: 1:0 2:2 3:8 4:1
1312    >>> omnifunc
1313      g/w/b:0/0/1
1314      g/w/b (in):0/0/1
1315      p/gopts1! KeyError
1316      inv: 1! KeyError
1317      gopts1! KeyError
1318      p/wopts1! KeyError
1319      inv: 1! KeyError
1320      wopts1! KeyError
1321      wopts2! KeyError
1322      wopts3! KeyError
1323      p/bopts1: ''
1324      inv: 1! TypeError
1325      G: ''
1326      W: 1:'A' 2:'B' 3:'' 4:'C'
1327      B: 1:'A' 2:'B' 3:'' 4:'C'
1328      del wopts3! KeyError
1329      del bopts3! ValueError
1330      G: ''
1331      W: 1:'A' 2:'B' 3:'' 4:'C'
1332      B: 1:'A' 2:'B' 3:'' 4:'C'
1333    >>> preserveindent
1334      g/w/b:0/0/1
1335      g/w/b (in):0/0/1
1336      p/gopts1! KeyError
1337      inv: 2! KeyError
1338      gopts1! KeyError
1339      p/wopts1! KeyError
1340      inv: 2! KeyError
1341      wopts1! KeyError
1342      wopts2! KeyError
1343      wopts3! KeyError
1344      p/bopts1: False
1345      G: 0
1346      W: 1:0 2:1 3:0 4:1
1347      B: 1:0 2:1 3:0 4:1
1348      del wopts3! KeyError
1349      del bopts3! ValueError
1350      G: 0
1351      W: 1:0 2:1 3:0 4:1
1352      B: 1:0 2:1 3:0 4:1
1353    >>> path
1354      g/w/b:1/0/1
1355      g/w/b (in):1/0/1
1356      p/gopts1: '.,..,,'
1357      inv: 0! TypeError
1358      p/wopts1! KeyError
1359      inv: 0! KeyError
1360      wopts1! KeyError
1361      wopts2! KeyError
1362      wopts3! KeyError
1363      p/bopts1: None
1364      inv: 0! TypeError
1365      G: '.,,'
1366      W: 1:'.,,' 2:',,' 3:'.,,' 4:'.'
1367      B: 1:'.,,' 2:',,' 3:'.,,' 4:'.'
1368      del wopts3! KeyError
1369      G: '.,,'
1370      W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,'
1371      B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,'
1372  END
1373
1374  call assert_equal(expected, g:res)
1375  unlet g:res
1376
1377  call assert_equal(0, pyeval("'' in vim.options"))
1378
1379  " use an empty key to index vim.options
1380  call AssertException(["let v = pyeval(\"vim.options['']\")"],
1381        \ 'Vim(let):ValueError: empty keys are not allowed')
1382  call AssertException(["py vim.current.window.options[''] = 0"],
1383        \ 'Vim(python):ValueError: empty keys are not allowed')
1384  call AssertException(["py vim.current.window.options[{}] = 0"],
1385        \ 'Vim(python):TypeError: expected str() or unicode() instance, but got dict')
1386
1387  " set one of the number options to a very large number
1388  let cmd = ["py vim.options['previewheight'] = 9999999999999999"]
1389  call AssertException(cmd, 'OverflowError:')
1390
1391  " unset a global-local string option
1392  call AssertException(["py del vim.options['errorformat']"],
1393        \ 'Vim(python):ValueError: unable to unset global option errorformat')
1394endfunc
1395
1396" Test for vim.buffer object
1397func Test_python_buffer()
1398  new
1399  call setline(1, "Hello\nWorld")
1400  call assert_fails("let x = pyeval('vim.current.buffer[0]')", 'E859:')
1401  %bw!
1402
1403  edit Xfile1
1404  let bnr1 = bufnr()
1405  py cb = vim.current.buffer
1406  vnew Xfile2
1407  let bnr2 = bufnr()
1408  call setline(1, ['First line', 'Second line', 'Third line'])
1409  py b = vim.current.buffer
1410  wincmd w
1411
1412  " Test for getting lines from the buffer using a slice
1413  call assert_equal(['First line'], pyeval('b[-10:1]'))
1414  call assert_equal(['Third line'], pyeval('b[2:10]'))
1415  call assert_equal([], pyeval('b[2:0]'))
1416  call assert_equal([], pyeval('b[10:12]'))
1417  call assert_equal([], pyeval('b[-10:-8]'))
1418  call AssertException(["py x = b[0:3:0]"],
1419        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1420  call AssertException(["py b[0:3:0] = 'abc'"],
1421        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1422  call AssertException(["py x = b[{}]"],
1423        \ "Vim(python):TypeError: sequence index must be integer, not 'dict'")
1424  call AssertException(["py b[{}] = 'abc'"],
1425        \ "Vim(python):TypeError: sequence index must be integer, not 'dict'")
1426
1427  " Test for getting lines using a range
1428  call AssertException(["py x = b.range(0,3)[0:2:0]"],
1429        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1430  call AssertException(["py b.range(0,3)[0:2:0] = 'abc'"],
1431        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1432
1433  " Tests BufferAppend and BufferItem
1434  py cb.append(b[0])
1435  call assert_equal(['First line'], getbufline(bnr1, 2))
1436  %d
1437
1438  " Try to append using out-of-range line number
1439  call AssertException(["py b.append('abc', 10)"],
1440        \ 'Vim(python):IndexError: line number out of range')
1441
1442  " Append a non-string item
1443  call AssertException(["py b.append([22])"],
1444        \ 'Vim(python):TypeError: expected str() or unicode() instance, but got int')
1445
1446  " Tests BufferSlice and BufferAssSlice
1447  py cb.append('abc5') # Will be overwritten
1448  py cb[-1:] = b[:-2]
1449  call assert_equal(['First line'], getbufline(bnr1, 2))
1450  %d
1451
1452  " Test BufferLength and BufferAssSlice
1453  py cb.append('def') # Will not be overwritten
1454  py cb[len(cb):] = b[:]
1455  call assert_equal(['def', 'First line', 'Second line', 'Third line'],
1456        \ getbufline(bnr1, 2, '$'))
1457  %d
1458
1459  " Test BufferAssItem and BufferMark
1460  call setbufline(bnr1, 1, ['one', 'two', 'three'])
1461  call cursor(1, 3)
1462  normal ma
1463  py cb.append('ghi') # Will be overwritten
1464  py cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
1465  call assert_equal(['(3, 2)'], getbufline(bnr1, 4))
1466  %d
1467
1468  " Test BufferRepr
1469  py cb.append(repr(cb) + repr(b))
1470  call assert_equal(['<buffer Xfile1><buffer Xfile2>'], getbufline(bnr1, 2))
1471  %d
1472
1473  " Modify foreign buffer
1474  py << trim EOF
1475    b.append('foo')
1476    b[0]='bar'
1477    b[0:0]=['baz']
1478    vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
1479  EOF
1480  call assert_equal(['baz', 'bar', 'Second line', 'Third line', 'foo'],
1481        \ getbufline(bnr2, 1, '$'))
1482  %d
1483
1484  " Test assigning to name property
1485  augroup BUFS
1486    autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
1487    autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
1488  augroup END
1489  py << trim EOF
1490    import os
1491    old_name = cb.name
1492    cb.name = 'foo'
1493    cb.append(cb.name[-11:].replace(os.path.sep, '/'))
1494    b.name = 'bar'
1495    cb.append(b.name[-11:].replace(os.path.sep, '/'))
1496    cb.name = old_name
1497    cb.append(cb.name[-14:].replace(os.path.sep, '/'))
1498    del old_name
1499  EOF
1500  call assert_equal([bnr1 .. ':BufFilePre:' .. bnr1,
1501        \ bnr1 .. ':BufFilePost:' .. bnr1,
1502        \ 'testdir/foo',
1503        \ bnr2 .. ':BufFilePre:' .. bnr2,
1504        \ bnr2 .. ':BufFilePost:' .. bnr2,
1505        \ 'testdir/bar',
1506        \ bnr1 .. ':BufFilePre:' .. bnr1,
1507        \ bnr1 .. ':BufFilePost:' .. bnr1,
1508        \ 'testdir/Xfile1'], getbufline(bnr1, 2, '$'))
1509  %d
1510
1511  " Test CheckBuffer
1512  py << trim EOF
1513    for _b in vim.buffers:
1514      if _b is not cb:
1515        vim.command('bwipeout! ' + str(_b.number))
1516    del _b
1517    cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
1518  EOF
1519  call assert_equal('valid: b:False, cb:True', getline(2))
1520  %d
1521
1522  py << trim EOF
1523    for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")', 'b.name = "!"'):
1524      try:
1525        exec(expr)
1526      except vim.error:
1527        pass
1528      else:
1529        # Usually a SEGV here
1530        # Should not happen in any case
1531        cb.append('No exception for ' + expr)
1532    vim.command('cd .')
1533    del b
1534  EOF
1535  call assert_equal([''], getline(1, '$'))
1536
1537  " Delete all the lines in a buffer
1538  call setline(1, ['a', 'b', 'c'])
1539  py vim.current.buffer[:] = []
1540  call assert_equal([''], getline(1, '$'))
1541
1542  " Test for buffer marks
1543  call assert_equal(v:none, pyeval("vim.current.buffer.mark('r')"))
1544
1545  " Test for modifying a 'nomodifiable' buffer
1546  setlocal nomodifiable
1547  call AssertException(["py vim.current.buffer[0] = 'abc'"],
1548        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1549  call AssertException(["py vim.current.buffer[0] = None"],
1550        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1551  call AssertException(["py vim.current.buffer[:] = None"],
1552        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1553  call AssertException(["py vim.current.buffer[:] = []"],
1554        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1555  call AssertException(["py vim.current.buffer.append('abc')"],
1556        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1557  call AssertException(["py vim.current.buffer.append([])"],
1558        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1559  setlocal modifiable
1560
1561  augroup BUFS
1562    autocmd!
1563  augroup END
1564  augroup! BUFS
1565  %bw!
1566
1567  " Range object for a deleted buffer
1568  new Xfile
1569  call setline(1, ['one', 'two', 'three'])
1570  py b = vim.current.buffer
1571  py r = vim.current.buffer.range(0, 2)
1572  call assert_equal('<range Xfile (0:2)>', pyeval('repr(r)'))
1573  %bw!
1574  call AssertException(['py r[:] = []'],
1575        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1576  call assert_match('<buffer object (deleted)', pyeval('repr(b)'))
1577  call assert_match('<range object (for deleted buffer)', pyeval('repr(r)'))
1578  call AssertException(["let n = pyeval('len(r)')"],
1579        \ 'Vim(let):vim.error: attempt to refer to deleted buffer')
1580  call AssertException(["py r.append('abc')"],
1581        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1582
1583  " object for a deleted buffer
1584  call AssertException(["py b[0] = 'one'"],
1585        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1586  call AssertException(["py b.append('one')"],
1587        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1588  call AssertException(["let n = pyeval('len(b)')"],
1589        \ 'Vim(let):vim.error: attempt to refer to deleted buffer')
1590  call AssertException(["py pos = b.mark('a')"],
1591        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1592  call AssertException(["py vim.current.buffer = b"],
1593        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1594  call AssertException(["py rn = b.range(0, 2)"],
1595        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1596endfunc
1597
1598" Test vim.buffers object
1599func Test_python_buffers()
1600  %bw!
1601  edit Xfile
1602  py cb = vim.current.buffer
1603  set hidden
1604  edit a
1605  buffer #
1606  edit b
1607  buffer #
1608  edit c
1609  buffer #
1610  py << trim EOF
1611    try:
1612      from __builtin__ import next
1613    except ImportError:
1614      next = lambda o: o.next()
1615    # Check GCing iterator that was not fully exhausted
1616    i = iter(vim.buffers)
1617    cb.append('i:' + str(next(i)))
1618    # and also check creating more than one iterator at a time
1619    i2 = iter(vim.buffers)
1620    cb.append('i2:' + str(next(i2)))
1621    cb.append('i:' + str(next(i)))
1622    # The following should trigger GC and not cause any problems
1623    del i
1624    del i2
1625    i3 = iter(vim.buffers)
1626    cb.append('i3:' + str(next(i3)))
1627    del i3
1628  EOF
1629  call assert_equal(['i:<buffer Xfile>',
1630        \ 'i2:<buffer Xfile>', 'i:<buffer a>', 'i3:<buffer Xfile>'],
1631        \ getline(2, '$'))
1632  %d
1633
1634  py << trim EOF
1635    prevnum = 0
1636    for b in vim.buffers:
1637      # Check buffer order
1638      if prevnum >= b.number:
1639        cb.append('!!! Buffer numbers not in strictly ascending order')
1640      # Check indexing: vim.buffers[number].number == number
1641      cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + \
1642                                                            '=' + repr(b))
1643      prevnum = b.number
1644    del prevnum
1645
1646    cb.append(str(len(vim.buffers)))
1647  EOF
1648  call assert_equal([bufnr('Xfile') .. ':<buffer Xfile>=<buffer Xfile>',
1649        \ bufnr('a') .. ':<buffer a>=<buffer a>',
1650        \ bufnr('b') .. ':<buffer b>=<buffer b>',
1651        \ bufnr('c') .. ':<buffer c>=<buffer c>', '4'], getline(2, '$'))
1652  %d
1653
1654  py << trim EOF
1655    bnums = list(map(lambda b: b.number, vim.buffers))[1:]
1656
1657    # Test wiping out buffer with existing iterator
1658    i4 = iter(vim.buffers)
1659    cb.append('i4:' + str(next(i4)))
1660    vim.command('bwipeout! ' + str(bnums.pop(0)))
1661    try:
1662      next(i4)
1663    except vim.error:
1664      pass
1665    else:
1666      cb.append('!!!! No vim.error')
1667    i4 = iter(vim.buffers)
1668    vim.command('bwipeout! ' + str(bnums.pop(-1)))
1669    vim.command('bwipeout! ' + str(bnums.pop(-1)))
1670    cb.append('i4:' + str(next(i4)))
1671    try:
1672      next(i4)
1673    except StopIteration:
1674      cb.append('StopIteration')
1675    del i4
1676    del bnums
1677  EOF
1678  call assert_equal(['i4:<buffer Xfile>',
1679        \ 'i4:<buffer Xfile>', 'StopIteration'], getline(2, '$'))
1680  %bw!
1681endfunc
1682
1683" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
1684func Test_python_tabpage_window()
1685  %bw
1686  edit Xfile
1687  py cb = vim.current.buffer
1688  tabnew 0
1689  tabnew 1
1690  vnew a.1
1691  tabnew 2
1692  vnew a.2
1693  vnew b.2
1694  vnew c.2
1695
1696  call assert_equal(4, pyeval('vim.current.window.tabpage.number'))
1697
1698  py << trim EOF
1699    cb.append('Number of tabs: ' + str(len(vim.tabpages)))
1700    cb.append('Current tab pages:')
1701    def W(w):
1702      if repr(w).find('(unknown)') != -1:
1703        return '<window object (unknown)>'
1704      else:
1705        return repr(w)
1706
1707    start = len(cb)
1708
1709    def Cursor(w):
1710      if w.buffer is cb:
1711        return repr((start - w.cursor[0], w.cursor[1]))
1712      else:
1713        return repr(w.cursor)
1714
1715    for t in vim.tabpages:
1716      cb.append('  ' + repr(t) + '(' + str(t.number) + ')' + ': ' + \
1717                str(len(t.windows)) + ' windows, current is ' + W(t.window))
1718      cb.append('  Windows:')
1719      for w in t.windows:
1720        cb.append('    ' + W(w) + '(' + str(w.number) + ')' + \
1721                                  ': displays buffer ' + repr(w.buffer) + \
1722                                  '; cursor is at ' + Cursor(w))
1723        # Other values depend on the size of the terminal, so they are checked
1724        # partly:
1725        for attr in ('height', 'row', 'width', 'col'):
1726          try:
1727            aval = getattr(w, attr)
1728            if type(aval) is not long:
1729              raise TypeError
1730            if aval < 0:
1731              raise ValueError
1732          except Exception:
1733            cb.append('!!!!!! Error while getting attribute ' + attr + \
1734                                            ': ' + sys.exc_type.__name__)
1735        del aval
1736        del attr
1737        w.cursor = (len(w.buffer), 0)
1738    del W
1739    del Cursor
1740    cb.append('Number of windows in current tab page: ' + \
1741                                                    str(len(vim.windows)))
1742    if list(vim.windows) != list(vim.current.tabpage.windows):
1743      cb.append('!!!!!! Windows differ')
1744  EOF
1745
1746  let expected =<< trim END
1747    Number of tabs: 4
1748    Current tab pages:
1749      <tabpage 0>(1): 1 windows, current is <window object (unknown)>
1750      Windows:
1751        <window object (unknown)>(1): displays buffer <buffer Xfile>; cursor is at (2, 0)
1752      <tabpage 1>(2): 1 windows, current is <window object (unknown)>
1753      Windows:
1754        <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
1755      <tabpage 2>(3): 2 windows, current is <window object (unknown)>
1756      Windows:
1757        <window object (unknown)>(1): displays buffer <buffer a.1>; cursor is at (1, 0)
1758        <window object (unknown)>(2): displays buffer <buffer 1>; cursor is at (1, 0)
1759      <tabpage 3>(4): 4 windows, current is <window 0>
1760      Windows:
1761        <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
1762        <window 1>(2): displays buffer <buffer b.2>; cursor is at (1, 0)
1763        <window 2>(3): displays buffer <buffer a.2>; cursor is at (1, 0)
1764        <window 3>(4): displays buffer <buffer 2>; cursor is at (1, 0)
1765    Number of windows in current tab page: 4
1766  END
1767  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1768  %bw!
1769endfunc
1770
1771" Test vim.current
1772func Test_python_vim_current()
1773  %bw
1774  edit Xfile
1775  py cb = vim.current.buffer
1776  tabnew 0
1777  tabnew 1
1778  vnew a.1
1779  tabnew 2
1780  vnew a.2
1781  vnew b.2
1782  vnew c.2
1783
1784  py << trim EOF
1785    def H(o):
1786      return repr(o)
1787    cb.append('Current tab page: ' + repr(vim.current.tabpage))
1788    cb.append('Current window: ' + repr(vim.current.window) + ': ' + \
1789               H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
1790    cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + \
1791               H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ \
1792               ' is ' + H(vim.current.tabpage.window.buffer))
1793    del H
1794  EOF
1795  let expected =<< trim END
1796    Current tab page: <tabpage 3>
1797    Current window: <window 0>: <window 0> is <window 0>
1798    Current buffer: <buffer c.2>: <buffer c.2> is <buffer c.2> is <buffer c.2>
1799  END
1800  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1801  call deletebufline(bufnr('Xfile'), 1, '$')
1802
1803  " Assigning: fails
1804  py << trim EOF
1805    try:
1806      vim.current.window = vim.tabpages[0].window
1807    except ValueError:
1808      cb.append('ValueError at assigning foreign tab window')
1809
1810    for attr in ('window', 'tabpage', 'buffer'):
1811      try:
1812        setattr(vim.current, attr, None)
1813      except TypeError:
1814        cb.append('Type error at assigning None to vim.current.' + attr)
1815    del attr
1816  EOF
1817
1818  let expected =<< trim END
1819    ValueError at assigning foreign tab window
1820    Type error at assigning None to vim.current.window
1821    Type error at assigning None to vim.current.tabpage
1822    Type error at assigning None to vim.current.buffer
1823  END
1824  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1825  call deletebufline(bufnr('Xfile'), 1, '$')
1826
1827  call setbufline(bufnr('Xfile'), 1, 'python interface')
1828  py << trim EOF
1829    # Assigning: success
1830    vim.current.tabpage = vim.tabpages[-2]
1831    vim.current.buffer = cb
1832    vim.current.window = vim.windows[0]
1833    vim.current.window.cursor = (len(vim.current.buffer), 0)
1834    cb.append('Current tab page: ' + repr(vim.current.tabpage))
1835    cb.append('Current window: ' + repr(vim.current.window))
1836    cb.append('Current buffer: ' + repr(vim.current.buffer))
1837    cb.append('Current line: ' + repr(vim.current.line))
1838  EOF
1839
1840  let expected =<< trim END
1841    Current tab page: <tabpage 2>
1842    Current window: <window 0>
1843    Current buffer: <buffer Xfile>
1844    Current line: 'python interface'
1845  END
1846  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1847  py vim.current.line = 'one line'
1848  call assert_equal('one line', getline('.'))
1849  call deletebufline(bufnr('Xfile'), 1, '$')
1850
1851  py << trim EOF
1852    ws = list(vim.windows)
1853    ts = list(vim.tabpages)
1854    for b in vim.buffers:
1855      if b is not cb:
1856        vim.command('bwipeout! ' + str(b.number))
1857    del b
1858    cb.append('w.valid: ' + repr([w.valid for w in ws]))
1859    cb.append('t.valid: ' + repr([t.valid for t in ts]))
1860    del w
1861    del t
1862    del ts
1863    del ws
1864  EOF
1865  let expected =<< trim END
1866    w.valid: [True, False]
1867    t.valid: [True, False, True, False]
1868  END
1869  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1870  %bw!
1871endfunc
1872
1873" Test types
1874func Test_python_types()
1875  %d
1876  py cb = vim.current.buffer
1877  py << trim EOF
1878    for expr, attr in (
1879      ('vim.vars',                         'Dictionary'),
1880      ('vim.options',                      'Options'),
1881      ('vim.bindeval("{}")',               'Dictionary'),
1882      ('vim.bindeval("[]")',               'List'),
1883      ('vim.bindeval("function(\'tr\')")', 'Function'),
1884      ('vim.current.buffer',               'Buffer'),
1885      ('vim.current.range',                'Range'),
1886      ('vim.current.window',               'Window'),
1887      ('vim.current.tabpage',              'TabPage'),
1888    ):
1889      cb.append(expr + ':' + attr + ':' + \
1890                                repr(type(eval(expr)) is getattr(vim, attr)))
1891    del expr
1892    del attr
1893  EOF
1894  let expected =<< trim END
1895    vim.vars:Dictionary:True
1896    vim.options:Options:True
1897    vim.bindeval("{}"):Dictionary:True
1898    vim.bindeval("[]"):List:True
1899    vim.bindeval("function('tr')"):Function:True
1900    vim.current.buffer:Buffer:True
1901    vim.current.range:Range:True
1902    vim.current.window:Window:True
1903    vim.current.tabpage:TabPage:True
1904  END
1905  call assert_equal(expected, getline(2, '$'))
1906endfunc
1907
1908" Test __dir__() method
1909func Test_python_dir_method()
1910  %d
1911  py cb = vim.current.buffer
1912  py << trim EOF
1913    for name, o in (
1914            ('current',    vim.current),
1915            ('buffer',     vim.current.buffer),
1916            ('window',     vim.current.window),
1917            ('tabpage',    vim.current.tabpage),
1918            ('range',      vim.current.range),
1919            ('dictionary', vim.bindeval('{}')),
1920            ('list',       vim.bindeval('[]')),
1921            ('function',   vim.bindeval('function("tr")')),
1922            ('output',     sys.stdout),
1923        ):
1924        cb.append(name + ':' + ','.join(dir(o)))
1925    del name
1926    del o
1927  EOF
1928  let expected =<< trim END
1929    current:__dir__,__members__,buffer,line,range,tabpage,window
1930    buffer:__dir__,__members__,append,mark,name,number,options,range,valid,vars
1931    window:__dir__,__members__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width
1932    tabpage:__dir__,__members__,number,valid,vars,window,windows
1933    range:__dir__,__members__,append,end,start
1934    dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
1935    list:__dir__,__members__,extend,locked
1936    function:__dir__,__members__,args,auto_rebind,self,softspace
1937    output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
1938  END
1939  call assert_equal(expected, getline(2, '$'))
1940endfunc
1941
1942" Test vim.*.__new__
1943func Test_python_new()
1944  call assert_equal({}, pyeval('vim.Dictionary({})'))
1945  call assert_equal({'a': 1}, pyeval('vim.Dictionary(a=1)'))
1946  call assert_equal({'a': 1}, pyeval('vim.Dictionary(((''a'', 1),))'))
1947  call assert_equal([], pyeval('vim.List()'))
1948  call assert_equal(['a', 'b', 'c', '7'], pyeval('vim.List(iter(''abc7''))'))
1949  call assert_equal(function('tr'), pyeval('vim.Function(''tr'')'))
1950  call assert_equal(function('tr', [123, 3, 4]),
1951        \ pyeval('vim.Function(''tr'', args=[123, 3, 4])'))
1952  call assert_equal(function('tr'), pyeval('vim.Function(''tr'', args=[])'))
1953  call assert_equal(function('tr', {}),
1954        \ pyeval('vim.Function(''tr'', self={})'))
1955  call assert_equal(function('tr', [123, 3, 4], {}),
1956        \ pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})'))
1957  call assert_equal(function('tr'),
1958        \ pyeval('vim.Function(''tr'', auto_rebind=False)'))
1959  call assert_equal(function('tr', [123, 3, 4]),
1960        \ pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)'))
1961  call assert_equal(function('tr'),
1962        \ pyeval('vim.Function(''tr'', args=[], auto_rebind=False)'))
1963  call assert_equal(function('tr', {}),
1964        \ pyeval('vim.Function(''tr'', self={}, auto_rebind=False)'))
1965  call assert_equal(function('tr', [123, 3, 4], {}),
1966        \ pyeval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)'))
1967endfunc
1968
1969" Test vim.Function
1970func Test_python_vim_func()
1971  func Args(...)
1972    return a:000
1973  endfunc
1974
1975  func SelfArgs(...) dict
1976    return [a:000, self]
1977  endfunc
1978
1979  " The following four lines should not crash
1980  let Pt = function('tr', [[]], {'l': []})
1981  py Pt = vim.bindeval('Pt')
1982  unlet Pt
1983  py del Pt
1984
1985  call assert_equal(3, pyeval('vim.strwidth("a\tb")'))
1986
1987  %bw!
1988  py cb = vim.current.buffer
1989  py << trim EOF
1990    def ecall(out_prefix, func, *args, **kwargs):
1991        line = out_prefix + ': '
1992        try:
1993            ret = func(*args, **kwargs)
1994        except Exception:
1995            line += '!exception: ' + emsg(sys.exc_info())
1996        else:
1997            line += '!result: ' + vim.Function('string')(ret)
1998        cb.append(line)
1999    a = vim.Function('Args')
2000    pa1 = vim.Function('Args', args=['abcArgsPA1'])
2001    pa2 = vim.Function('Args', args=[])
2002    pa3 = vim.Function('Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'})
2003    pa4 = vim.Function('Args', self={'abcSelfPA4': 'abcSelfPA4Val'})
2004    cb.append('a: ' + repr(a))
2005    cb.append('pa1: ' + repr(pa1))
2006    cb.append('pa2: ' + repr(pa2))
2007    cb.append('pa3: ' + repr(pa3))
2008    cb.append('pa4: ' + repr(pa4))
2009    sa = vim.Function('SelfArgs')
2010    psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1'])
2011    psa2 = vim.Function('SelfArgs', args=[])
2012    psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'})
2013    psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'})
2014    psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0)
2015    psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=())
2016    psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[])
2017    psa8 = vim.Function('SelfArgs', auto_rebind=False)
2018    psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True)
2019    psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1)
2020    psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'})
2021    psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC'])
2022    cb.append('sa: ' + repr(sa))
2023    cb.append('psa1: ' + repr(psa1))
2024    cb.append('psa2: ' + repr(psa2))
2025    cb.append('psa3: ' + repr(psa3))
2026    cb.append('psa4: ' + repr(psa4))
2027    cb.append('psa5: ' + repr(psa5))
2028    cb.append('psa6: ' + repr(psa6))
2029    cb.append('psa7: ' + repr(psa7))
2030    cb.append('psa8: ' + repr(psa8))
2031    cb.append('psa9: ' + repr(psa9))
2032    cb.append('psaA: ' + repr(psaA))
2033    cb.append('psaB: ' + repr(psaB))
2034    cb.append('psaC: ' + repr(psaC))
2035
2036    psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'})
2037    psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]]
2038    psar.self['rec'] = psar
2039    psar.self['self'] = psar.self
2040    psar.self['args'] = psar.args
2041
2042    try:
2043        cb.append('psar: ' + repr(psar))
2044    except Exception:
2045        cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
2046  EOF
2047
2048  let expected =<< trim END
2049    a: <vim.Function 'Args'>
2050    pa1: <vim.Function 'Args', args=['abcArgsPA1']>
2051    pa2: <vim.Function 'Args'>
2052    pa3: <vim.Function 'Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'}>
2053    pa4: <vim.Function 'Args', self={'abcSelfPA4': 'abcSelfPA4Val'}>
2054    sa: <vim.Function 'SelfArgs'>
2055    psa1: <vim.Function 'SelfArgs', args=['abcArgsPSA1']>
2056    psa2: <vim.Function 'SelfArgs'>
2057    psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}>
2058    psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}>
2059    psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}>
2060    psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}>
2061    psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']>
2062    psa8: <vim.Function 'SelfArgs'>
2063    psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True>
2064    psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True>
2065    psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']>
2066    psaC: <vim.Function 'SelfArgs'>
2067    psar: <vim.Function 'SelfArgs', args=[{'abcArgsPSAr2': [{'rec': function('SelfArgs', [{...}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], self={'rec': function('SelfArgs', [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}]}>
2068  END
2069  call assert_equal(expected, getline(2, '$'))
2070  %d
2071
2072  call assert_equal(function('Args'), pyeval('a'))
2073  call assert_equal(function('Args', ['abcArgsPA1']), pyeval('pa1'))
2074  call assert_equal(function('Args'), pyeval('pa2'))
2075  call assert_equal(function('Args', ['abcArgsPA3'], {'abcSelfPA3': 'abcSelfPA3Val'}), pyeval('pa3'))
2076  call assert_equal(function('Args', {'abcSelfPA4': 'abcSelfPA4Val'}), pyeval('pa4'))
2077  call assert_equal(function('SelfArgs'), pyeval('sa'))
2078  call assert_equal(function('SelfArgs', ['abcArgsPSA1']), pyeval('psa1'))
2079  call assert_equal(function('SelfArgs'), pyeval('psa2'))
2080  call assert_equal(function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}), pyeval('psa3'))
2081  call assert_equal(function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}), pyeval('psa4'))
2082  call assert_equal(function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}), pyeval('psa5'))
2083  call assert_equal(function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}), pyeval('psa6'))
2084  call assert_equal(function('SelfArgs', ['abcArgsPSA7']), pyeval('psa7'))
2085  call assert_equal(function('SelfArgs'), pyeval('psa8'))
2086  call assert_equal(function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}), pyeval('psa9'))
2087  call assert_equal(function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}), pyeval('psaA'))
2088  call assert_equal(function('SelfArgs', ['abcArgsPSAB']), pyeval('psaB'))
2089  call assert_equal(function('SelfArgs'), pyeval('psaC'))
2090
2091  let res = []
2092  for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7',
2093        \ 'psa8', 'psa9', 'psaA', 'psaB', 'psaC']
2094    let d = {'f': pyeval(v)}
2095    call add(res, 'd.' .. v .. '(): ' .. string(d.f()))
2096  endfor
2097
2098  let expected =<< trim END
2099    d.sa(): [[], {'f': function('SelfArgs')}]
2100    d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}]
2101    d.psa2(): [[], {'f': function('SelfArgs')}]
2102    d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
2103    d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
2104    d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}]
2105    d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}]
2106    d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}]
2107    d.psa8(): [[], {'f': function('SelfArgs')}]
2108    d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}]
2109    d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}]
2110    d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}]
2111    d.psaC(): [[], {'f': function('SelfArgs')}]
2112  END
2113  call assert_equal(expected, res)
2114
2115  py ecall('a()', a, )
2116  py ecall('pa1()', pa1, )
2117  py ecall('pa2()', pa2, )
2118  py ecall('pa3()', pa3, )
2119  py ecall('pa4()', pa4, )
2120  py ecall('sa()', sa, )
2121  py ecall('psa1()', psa1, )
2122  py ecall('psa2()', psa2, )
2123  py ecall('psa3()', psa3, )
2124  py ecall('psa4()', psa4, )
2125
2126  py ecall('a(42, 43)', a, 42, 43)
2127  py ecall('pa1(42, 43)', pa1, 42, 43)
2128  py ecall('pa2(42, 43)', pa2, 42, 43)
2129  py ecall('pa3(42, 43)', pa3, 42, 43)
2130  py ecall('pa4(42, 43)', pa4, 42, 43)
2131  py ecall('sa(42, 43)', sa, 42, 43)
2132  py ecall('psa1(42, 43)', psa1, 42, 43)
2133  py ecall('psa2(42, 43)', psa2, 42, 43)
2134  py ecall('psa3(42, 43)', psa3, 42, 43)
2135  py ecall('psa4(42, 43)', psa4, 42, 43)
2136
2137  py ecall('a(42, self={"20": 1})', a, 42, self={'20': 1})
2138  py ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1})
2139  py ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1})
2140  py ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1})
2141  py ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1})
2142  py ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1})
2143  py ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1})
2144  py ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1})
2145  py ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1})
2146  py ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1})
2147
2148  py ecall('a(self={"20": 1})', a, self={'20': 1})
2149  py ecall('pa1(self={"20": 1})', pa1, self={'20': 1})
2150  py ecall('pa2(self={"20": 1})', pa2, self={'20': 1})
2151  py ecall('pa3(self={"20": 1})', pa3, self={'20': 1})
2152  py ecall('pa4(self={"20": 1})', pa4, self={'20': 1})
2153  py ecall('sa(self={"20": 1})', sa, self={'20': 1})
2154  py ecall('psa1(self={"20": 1})', psa1, self={'20': 1})
2155  py ecall('psa2(self={"20": 1})', psa2, self={'20': 1})
2156  py ecall('psa3(self={"20": 1})', psa3, self={'20': 1})
2157  py ecall('psa4(self={"20": 1})', psa4, self={'20': 1})
2158
2159  py << trim EOF
2160    def s(v):
2161        if v is None:
2162            return repr(v)
2163        else:
2164            return vim.Function('string')(v)
2165
2166    cb.append('a.args: ' + s(a.args))
2167    cb.append('pa1.args: ' + s(pa1.args))
2168    cb.append('pa2.args: ' + s(pa2.args))
2169    cb.append('pa3.args: ' + s(pa3.args))
2170    cb.append('pa4.args: ' + s(pa4.args))
2171    cb.append('sa.args: ' + s(sa.args))
2172    cb.append('psa1.args: ' + s(psa1.args))
2173    cb.append('psa2.args: ' + s(psa2.args))
2174    cb.append('psa3.args: ' + s(psa3.args))
2175    cb.append('psa4.args: ' + s(psa4.args))
2176
2177    cb.append('a.self: ' + s(a.self))
2178    cb.append('pa1.self: ' + s(pa1.self))
2179    cb.append('pa2.self: ' + s(pa2.self))
2180    cb.append('pa3.self: ' + s(pa3.self))
2181    cb.append('pa4.self: ' + s(pa4.self))
2182    cb.append('sa.self: ' + s(sa.self))
2183    cb.append('psa1.self: ' + s(psa1.self))
2184    cb.append('psa2.self: ' + s(psa2.self))
2185    cb.append('psa3.self: ' + s(psa3.self))
2186    cb.append('psa4.self: ' + s(psa4.self))
2187
2188    cb.append('a.name: ' + s(a.name))
2189    cb.append('pa1.name: ' + s(pa1.name))
2190    cb.append('pa2.name: ' + s(pa2.name))
2191    cb.append('pa3.name: ' + s(pa3.name))
2192    cb.append('pa4.name: ' + s(pa4.name))
2193    cb.append('sa.name: ' + s(sa.name))
2194    cb.append('psa1.name: ' + s(psa1.name))
2195    cb.append('psa2.name: ' + s(psa2.name))
2196    cb.append('psa3.name: ' + s(psa3.name))
2197    cb.append('psa4.name: ' + s(psa4.name))
2198
2199    cb.append('a.auto_rebind: ' + s(a.auto_rebind))
2200    cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind))
2201    cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind))
2202    cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind))
2203    cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind))
2204    cb.append('sa.auto_rebind: ' + s(sa.auto_rebind))
2205    cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind))
2206    cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind))
2207    cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind))
2208    cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind))
2209    cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind))
2210    cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind))
2211    cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind))
2212    cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind))
2213    cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind))
2214    cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind))
2215    cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind))
2216    cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind))
2217
2218    del s
2219
2220    del a
2221    del pa1
2222    del pa2
2223    del pa3
2224    del pa4
2225    del sa
2226    del psa1
2227    del psa2
2228    del psa3
2229    del psa4
2230    del psa5
2231    del psa6
2232    del psa7
2233    del psa8
2234    del psa9
2235    del psaA
2236    del psaB
2237    del psaC
2238    del psar
2239
2240    del ecall
2241  EOF
2242
2243  let expected =<< trim END
2244    a(): !result: []
2245    pa1(): !result: ['abcArgsPA1']
2246    pa2(): !result: []
2247    pa3(): !result: ['abcArgsPA3']
2248    pa4(): !result: []
2249    sa(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2250    psa1(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2251    psa2(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2252    psa3(): !result: [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
2253    psa4(): !result: [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
2254    a(42, 43): !result: [42, 43]
2255    pa1(42, 43): !result: ['abcArgsPA1', 42, 43]
2256    pa2(42, 43): !result: [42, 43]
2257    pa3(42, 43): !result: ['abcArgsPA3', 42, 43]
2258    pa4(42, 43): !result: [42, 43]
2259    sa(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2260    psa1(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2261    psa2(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2262    psa3(42, 43): !result: [['abcArgsPSA3', 42, 43], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
2263    psa4(42, 43): !result: [[42, 43], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
2264    a(42, self={"20": 1}): !result: [42]
2265    pa1(42, self={"20": 1}): !result: ['abcArgsPA1', 42]
2266    pa2(42, self={"20": 1}): !result: [42]
2267    pa3(42, self={"20": 1}): !result: ['abcArgsPA3', 42]
2268    pa4(42, self={"20": 1}): !result: [42]
2269    sa(42, self={"20": 1}): !result: [[42], {'20': 1}]
2270    psa1(42, self={"20": 1}): !result: [['abcArgsPSA1', 42], {'20': 1}]
2271    psa2(42, self={"20": 1}): !result: [[42], {'20': 1}]
2272    psa3(42, self={"20": 1}): !result: [['abcArgsPSA3', 42], {'20': 1}]
2273    psa4(42, self={"20": 1}): !result: [[42], {'20': 1}]
2274    a(self={"20": 1}): !result: []
2275    pa1(self={"20": 1}): !result: ['abcArgsPA1']
2276    pa2(self={"20": 1}): !result: []
2277    pa3(self={"20": 1}): !result: ['abcArgsPA3']
2278    pa4(self={"20": 1}): !result: []
2279    sa(self={"20": 1}): !result: [[], {'20': 1}]
2280    psa1(self={"20": 1}): !result: [['abcArgsPSA1'], {'20': 1}]
2281    psa2(self={"20": 1}): !result: [[], {'20': 1}]
2282    psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'20': 1}]
2283    psa4(self={"20": 1}): !result: [[], {'20': 1}]
2284    a.args: None
2285    pa1.args: ['abcArgsPA1']
2286    pa2.args: None
2287    pa3.args: ['abcArgsPA3']
2288    pa4.args: None
2289    sa.args: None
2290    psa1.args: ['abcArgsPSA1']
2291    psa2.args: None
2292    psa3.args: ['abcArgsPSA3']
2293    psa4.args: None
2294    a.self: None
2295    pa1.self: None
2296    pa2.self: None
2297    pa3.self: {'abcSelfPA3': 'abcSelfPA3Val'}
2298    pa4.self: {'abcSelfPA4': 'abcSelfPA4Val'}
2299    sa.self: None
2300    psa1.self: None
2301    psa2.self: None
2302    psa3.self: {'abcSelfPSA3': 'abcSelfPSA3Val'}
2303    psa4.self: {'abcSelfPSA4': 'abcSelfPSA4Val'}
2304    a.name: 'Args'
2305    pa1.name: 'Args'
2306    pa2.name: 'Args'
2307    pa3.name: 'Args'
2308    pa4.name: 'Args'
2309    sa.name: 'SelfArgs'
2310    psa1.name: 'SelfArgs'
2311    psa2.name: 'SelfArgs'
2312    psa3.name: 'SelfArgs'
2313    psa4.name: 'SelfArgs'
2314    a.auto_rebind: 1
2315    pa1.auto_rebind: 1
2316    pa2.auto_rebind: 1
2317    pa3.auto_rebind: 0
2318    pa4.auto_rebind: 0
2319    sa.auto_rebind: 1
2320    psa1.auto_rebind: 1
2321    psa2.auto_rebind: 1
2322    psa3.auto_rebind: 0
2323    psa4.auto_rebind: 0
2324    psa5.auto_rebind: 0
2325    psa6.auto_rebind: 0
2326    psa7.auto_rebind: 1
2327    psa8.auto_rebind: 1
2328    psa9.auto_rebind: 1
2329    psaA.auto_rebind: 1
2330    psaB.auto_rebind: 1
2331    psaC.auto_rebind: 1
2332  END
2333  call assert_equal(expected, getline(2, '$'))
2334  %bw!
2335endfunc
2336
2337" Test stdout/stderr
2338func Test_python_stdin_stderr()
2339  let caught_writeerr = 0
2340  let caught_writelineerr = 0
2341  redir => messages
2342  py sys.stdout.write('abc8') ; sys.stdout.write('def')
2343  try
2344    py sys.stderr.write('abc9') ; sys.stderr.write('def')
2345  catch /abc9def/
2346    let caught_writeerr = 1
2347  endtry
2348  py sys.stdout.writelines(iter('abcA'))
2349  try
2350    py sys.stderr.writelines(iter('abcB'))
2351  catch /abcB/
2352    let caught_writelineerr = 1
2353  endtry
2354  redir END
2355  call assert_equal("\nabc8def\nabcA", messages)
2356  call assert_equal(1, caught_writeerr)
2357  call assert_equal(1, caught_writelineerr)
2358endfunc
2359
2360" Test subclassing
2361func Test_python_subclass()
2362  new
2363  func Put(...)
2364    return a:000
2365  endfunc
2366
2367  py << trim EOF
2368    class DupDict(vim.Dictionary):
2369      def __setitem__(self, key, value):
2370        super(DupDict, self).__setitem__(key, value)
2371        super(DupDict, self).__setitem__('dup_' + key, value)
2372    dd = DupDict()
2373    dd['a'] = 'b'
2374
2375    class DupList(vim.List):
2376      def __getitem__(self, idx):
2377        return [super(DupList, self).__getitem__(idx)] * 2
2378
2379    dl = DupList()
2380    dl2 = DupList(iter('abcC'))
2381    dl.extend(dl2[0])
2382
2383    class DupFun(vim.Function):
2384      def __call__(self, arg):
2385        return super(DupFun, self).__call__(arg, arg)
2386
2387    df = DupFun('Put')
2388  EOF
2389
2390  call assert_equal(['a', 'dup_a'], sort(keys(pyeval('dd'))))
2391  call assert_equal(['a', 'a'], pyeval('dl'))
2392  call assert_equal(['a', 'b', 'c', 'C'], pyeval('dl2'))
2393  call assert_equal([2, 2], pyeval('df(2)'))
2394  call assert_equal(1, pyeval('dl') is# pyeval('dl'))
2395  call assert_equal(1, pyeval('dd') is# pyeval('dd'))
2396  call assert_equal(function('Put'), pyeval('df'))
2397  delfunction Put
2398  py << trim EOF
2399    del DupDict
2400    del DupList
2401    del DupFun
2402    del dd
2403    del dl
2404    del dl2
2405    del df
2406  EOF
2407  close!
2408endfunc
2409
2410" Test chdir
2411func Test_python_chdir()
2412  new Xfile
2413  py cb = vim.current.buffer
2414  py << trim EOF
2415    import os
2416    fnamemodify = vim.Function('fnamemodify')
2417    cb.append(fnamemodify('.', ':p:h:t'))
2418    cb.append(vim.eval('@%'))
2419    os.chdir('..')
2420    path = fnamemodify('.', ':p:h:t')
2421    if path != 'src' and path != 'src2':
2422      # Running tests from a shadow directory, so move up another level
2423      # This will result in @% looking like shadow/testdir/Xfile, hence the
2424      # extra fnamemodify
2425      os.chdir('..')
2426      cb.append(fnamemodify('.', ':p:h:t'))
2427      cb.append(fnamemodify(vim.eval('@%'), ':s?^%s.??' % path).replace(os.path.sep, '/'))
2428      os.chdir(path)
2429      del path
2430    else:
2431      # Also accept running from src2/testdir/ for MS-Windows CI.
2432      cb.append(fnamemodify('.', ':p:h:t').replace('src2', 'src'))
2433      cb.append(vim.eval('@%').replace(os.path.sep, '/'))
2434    os.chdir('testdir')
2435    cb.append(fnamemodify('.', ':p:h:t'))
2436    cb.append(vim.eval('@%'))
2437    del fnamemodify
2438  EOF
2439  call assert_equal(['testdir', 'Xfile', 'src', 'testdir/Xfile', 'testdir',
2440        \ 'Xfile'], getline(2, '$'))
2441  close!
2442  call AssertException(["py vim.chdir(None)"], "Vim(python):TypeError:")
2443endfunc
2444
2445" Test errors
2446func Test_python_errors()
2447  func F() dict
2448  endfunc
2449
2450  func D()
2451  endfunc
2452
2453  new
2454  py cb = vim.current.buffer
2455
2456  py << trim EOF
2457    d = vim.Dictionary()
2458    ned = vim.Dictionary(foo='bar', baz='abcD')
2459    dl = vim.Dictionary(a=1)
2460    dl.locked = True
2461    l = vim.List()
2462    ll = vim.List('abcE')
2463    ll.locked = True
2464    nel = vim.List('abcO')
2465    f = vim.Function('string')
2466    fd = vim.Function('F')
2467    fdel = vim.Function('D')
2468    vim.command('delfunction D')
2469
2470    def subexpr_test(expr, name, subexprs):
2471        cb.append('>>> Testing %s using %s' % (name, expr))
2472        for subexpr in subexprs:
2473            ee(expr % subexpr)
2474        cb.append('<<< Finished')
2475
2476    def stringtochars_test(expr):
2477        return subexpr_test(expr, 'StringToChars', (
2478            '1',       # Fail type checks
2479            'u"\\0"',  # Fail PyString_AsStringAndSize(bytes, , NULL) check
2480            '"\\0"',   # Fail PyString_AsStringAndSize(object, , NULL) check
2481        ))
2482
2483    class Mapping(object):
2484        def __init__(self, d):
2485            self.d = d
2486
2487        def __getitem__(self, key):
2488            return self.d[key]
2489
2490        def keys(self):
2491            return self.d.keys()
2492
2493        def items(self):
2494            return self.d.items()
2495
2496    def convertfrompyobject_test(expr, recurse=True):
2497        # pydict_to_tv
2498        stringtochars_test(expr % '{%s : 1}')
2499        if recurse:
2500            convertfrompyobject_test(expr % '{"abcF" : %s}', False)
2501        # pymap_to_tv
2502        stringtochars_test(expr % 'Mapping({%s : 1})')
2503        if recurse:
2504            convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False)
2505        # pyseq_to_tv
2506        iter_test(expr)
2507        return subexpr_test(expr, 'ConvertFromPyObject', (
2508            'None',                 # Not conversible
2509            '{"": 1}',              # Empty key not allowed
2510            '{u"": 1}',             # Same, but with unicode object
2511            'FailingMapping()',     #
2512            'FailingMappingKey()',  #
2513            'FailingNumber()',      #
2514        ))
2515
2516    def convertfrompymapping_test(expr):
2517        convertfrompyobject_test(expr)
2518        return subexpr_test(expr, 'ConvertFromPyMapping', (
2519            '[]',
2520        ))
2521
2522    def iter_test(expr):
2523        return subexpr_test(expr, '*Iter*', (
2524            'FailingIter()',
2525            'FailingIterNext()',
2526        ))
2527
2528    def number_test(expr, natural=False, unsigned=False):
2529        if natural:
2530            unsigned = True
2531        return subexpr_test(expr, 'NumberToLong', (
2532            '[]',
2533            'None',
2534        ) + (unsigned and ('-1',) or ())
2535        + (natural and ('0',) or ()))
2536
2537    class FailingTrue(object):
2538        def __nonzero__(self):
2539            raise NotImplementedError('bool')
2540
2541    class FailingIter(object):
2542        def __iter__(self):
2543            raise NotImplementedError('iter')
2544
2545    class FailingIterNext(object):
2546        def __iter__(self):
2547            return self
2548
2549        def next(self):
2550            raise NotImplementedError('next')
2551
2552    class FailingIterNextN(object):
2553        def __init__(self, n):
2554            self.n = n
2555
2556        def __iter__(self):
2557            return self
2558
2559        def next(self):
2560            if self.n:
2561                self.n -= 1
2562                return 1
2563            else:
2564                raise NotImplementedError('next N')
2565
2566    class FailingMappingKey(object):
2567        def __getitem__(self, item):
2568            raise NotImplementedError('getitem:mappingkey')
2569
2570        def keys(self):
2571            return list("abcH")
2572
2573    class FailingMapping(object):
2574        def __getitem__(self):
2575            raise NotImplementedError('getitem:mapping')
2576
2577        def keys(self):
2578            raise NotImplementedError('keys')
2579
2580    class FailingList(list):
2581        def __getitem__(self, idx):
2582            if i == 2:
2583                raise NotImplementedError('getitem:list')
2584            else:
2585                return super(FailingList, self).__getitem__(idx)
2586
2587    class NoArgsCall(object):
2588        def __call__(self):
2589            pass
2590
2591    class FailingCall(object):
2592        def __call__(self, path):
2593            raise NotImplementedError('call')
2594
2595    class FailingNumber(object):
2596        def __int__(self):
2597            raise NotImplementedError('int')
2598
2599    cb.append("> Output")
2600    cb.append(">> OutputSetattr")
2601    ee('del sys.stdout.softspace')
2602    number_test('sys.stdout.softspace = %s', unsigned=True)
2603    number_test('sys.stderr.softspace = %s', unsigned=True)
2604    ee('assert sys.stdout.isatty()==False')
2605    ee('assert sys.stdout.seekable()==False')
2606    ee('sys.stdout.close()')
2607    ee('sys.stdout.flush()')
2608    ee('assert sys.stderr.isatty()==False')
2609    ee('assert sys.stderr.seekable()==False')
2610    ee('sys.stderr.close()')
2611    ee('sys.stderr.flush()')
2612    ee('sys.stdout.attr = None')
2613    cb.append(">> OutputWrite")
2614    ee('assert sys.stdout.writable()==True')
2615    ee('assert sys.stdout.readable()==False')
2616    ee('assert sys.stderr.writable()==True')
2617    ee('assert sys.stderr.readable()==False')
2618    ee('assert sys.stdout.closed()==False')
2619    ee('assert sys.stderr.closed()==False')
2620    ee('assert sys.stdout.errors=="strict"')
2621    ee('assert sys.stderr.errors=="strict"')
2622    ee('assert sys.stdout.encoding==sys.stderr.encoding')
2623    ee('sys.stdout.write(None)')
2624    cb.append(">> OutputWriteLines")
2625    ee('sys.stdout.writelines(None)')
2626    ee('sys.stdout.writelines([1])')
2627    iter_test('sys.stdout.writelines(%s)')
2628    cb.append("> VimCommand")
2629    stringtochars_test('vim.command(%s)')
2630    ee('vim.command("", 2)')
2631    #! Not checked: vim->python exceptions translating: checked later
2632    cb.append("> VimToPython")
2633    #! Not checked: everything: needs errors in internal python functions
2634    cb.append("> VimEval")
2635    stringtochars_test('vim.eval(%s)')
2636    ee('vim.eval("", FailingTrue())')
2637    #! Not checked: everything: needs errors in internal python functions
2638    cb.append("> VimEvalPy")
2639    stringtochars_test('vim.bindeval(%s)')
2640    ee('vim.eval("", 2)')
2641    #! Not checked: vim->python exceptions translating: checked later
2642    cb.append("> VimStrwidth")
2643    stringtochars_test('vim.strwidth(%s)')
2644    cb.append("> VimForeachRTP")
2645    ee('vim.foreach_rtp(None)')
2646    ee('vim.foreach_rtp(NoArgsCall())')
2647    ee('vim.foreach_rtp(FailingCall())')
2648    ee('vim.foreach_rtp(int, 2)')
2649    cb.append('> import')
2650    old_rtp = vim.options['rtp']
2651    vim.options['rtp'] = os.getcwd().replace('\\', '\\\\').replace(',', '\\,')
2652    ee('import xxx_no_such_module_xxx')
2653    ee('import failing_import')
2654    ee('import failing')
2655    vim.options['rtp'] = old_rtp
2656    del old_rtp
2657    cb.append("> Options")
2658    cb.append(">> OptionsItem")
2659    ee('vim.options["abcQ"]')
2660    ee('vim.options[""]')
2661    stringtochars_test('vim.options[%s]')
2662    cb.append(">> OptionsContains")
2663    stringtochars_test('%s in vim.options')
2664    cb.append("> Dictionary")
2665    cb.append(">> DictionaryConstructor")
2666    ee('vim.Dictionary("abcI")')
2667    ##! Not checked: py_dict_alloc failure
2668    cb.append(">> DictionarySetattr")
2669    ee('del d.locked')
2670    ee('d.locked = FailingTrue()')
2671    ee('vim.vvars.locked = False')
2672    ee('d.scope = True')
2673    ee('d.xxx = True')
2674    cb.append(">> _DictionaryItem")
2675    ee('d.get("a", 2, 3)')
2676    stringtochars_test('d.get(%s)')
2677    ee('d.pop("a")')
2678    ee('dl.pop("a")')
2679    cb.append(">> DictionaryContains")
2680    ee('"" in d')
2681    ee('0 in d')
2682    cb.append(">> DictionaryIterNext")
2683    ee('for i in ned: ned["a"] = 1')
2684    del i
2685    cb.append(">> DictionaryAssItem")
2686    ee('dl["b"] = 1')
2687    stringtochars_test('d[%s] = 1')
2688    convertfrompyobject_test('d["a"] = %s')
2689    cb.append(">> DictionaryUpdate")
2690    cb.append(">>> kwargs")
2691    cb.append(">>> iter")
2692    ee('d.update(FailingMapping())')
2693    ee('d.update([FailingIterNext()])')
2694    ee('d.update([FailingIterNextN(1)])')
2695    iter_test('d.update(%s)')
2696    convertfrompyobject_test('d.update(%s)')
2697    stringtochars_test('d.update(((%s, 0),))')
2698    convertfrompyobject_test('d.update((("a", %s),))')
2699    cb.append(">> DictionaryPopItem")
2700    ee('d.popitem(1, 2)')
2701    cb.append(">> DictionaryHasKey")
2702    ee('d.has_key()')
2703    cb.append("> List")
2704    cb.append(">> ListConstructor")
2705    ee('vim.List(1, 2)')
2706    ee('vim.List(a=1)')
2707    iter_test('vim.List(%s)')
2708    convertfrompyobject_test('vim.List([%s])')
2709    cb.append(">> ListItem")
2710    ee('l[1000]')
2711    cb.append(">> ListAssItem")
2712    ee('ll[1] = 2')
2713    ee('l[1000] = 3')
2714    cb.append(">> ListAssSlice")
2715    ee('ll[1:100] = "abcJ"')
2716    iter_test('l[:] = %s')
2717    ee('nel[1:10:2]  = "abcK"')
2718    cb.append(repr(tuple(nel)))
2719    ee('nel[1:10:2]  = "a"')
2720    cb.append(repr(tuple(nel)))
2721    ee('nel[1:1:-1]  = "a"')
2722    cb.append(repr(tuple(nel)))
2723    ee('nel[:] = FailingIterNextN(2)')
2724    cb.append(repr(tuple(nel)))
2725    convertfrompyobject_test('l[:] = [%s]')
2726    cb.append(">> ListConcatInPlace")
2727    iter_test('l.extend(%s)')
2728    convertfrompyobject_test('l.extend([%s])')
2729    cb.append(">> ListSetattr")
2730    ee('del l.locked')
2731    ee('l.locked = FailingTrue()')
2732    ee('l.xxx = True')
2733    cb.append("> Function")
2734    cb.append(">> FunctionConstructor")
2735    cb.append(">>> FunctionConstructor")
2736    ee('vim.Function("123")')
2737    ee('vim.Function("xxx_non_existent_function_xxx")')
2738    ee('vim.Function("xxx#non#existent#function#xxx")')
2739    ee('vim.Function("xxx_non_existent_function_xxx2", args=[])')
2740    ee('vim.Function("xxx_non_existent_function_xxx3", self={})')
2741    ee('vim.Function("xxx_non_existent_function_xxx4", args=[], self={})')
2742    cb.append(">>> FunctionNew")
2743    ee('vim.Function("tr", self="abcFuncSelf")')
2744    ee('vim.Function("tr", args=427423)')
2745    ee('vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2")')
2746    ee('vim.Function(self="abcFuncSelf2", args="abcFuncArgs2")')
2747    ee('vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2")')
2748    ee('vim.Function("tr", "")')
2749    cb.append(">> FunctionCall")
2750    convertfrompyobject_test('f(%s)')
2751    convertfrompymapping_test('fd(self=%s)')
2752    cb.append("> TabPage")
2753    cb.append(">> TabPageAttr")
2754    ee('vim.current.tabpage.xxx')
2755    cb.append("> TabList")
2756    cb.append(">> TabListItem")
2757    ee('vim.tabpages[1000]')
2758    cb.append("> Window")
2759    cb.append(">> WindowAttr")
2760    ee('vim.current.window.xxx')
2761    cb.append(">> WindowSetattr")
2762    ee('vim.current.window.buffer = 0')
2763    ee('vim.current.window.cursor = (100000000, 100000000)')
2764    ee('vim.current.window.cursor = True')
2765    number_test('vim.current.window.height = %s', unsigned=True)
2766    number_test('vim.current.window.width = %s', unsigned=True)
2767    ee('vim.current.window.xxxxxx = True')
2768    cb.append("> WinList")
2769    cb.append(">> WinListItem")
2770    ee('vim.windows[1000]')
2771    cb.append("> Buffer")
2772    cb.append(">> StringToLine (indirect)")
2773    ee('vim.current.buffer[0] = "\\na"')
2774    ee('vim.current.buffer[0] = u"\\na"')
2775    cb.append(">> SetBufferLine (indirect)")
2776    ee('vim.current.buffer[0] = True')
2777    cb.append(">> SetBufferLineList (indirect)")
2778    ee('vim.current.buffer[:] = True')
2779    ee('vim.current.buffer[:] = ["\\na", "bc"]')
2780    cb.append(">> InsertBufferLines (indirect)")
2781    ee('vim.current.buffer.append(None)')
2782    ee('vim.current.buffer.append(["\\na", "bc"])')
2783    ee('vim.current.buffer.append("\\nbc")')
2784    cb.append(">> RBItem")
2785    ee('vim.current.buffer[100000000]')
2786    cb.append(">> RBAsItem")
2787    ee('vim.current.buffer[100000000] = ""')
2788    cb.append(">> BufferAttr")
2789    ee('vim.current.buffer.xxx')
2790    cb.append(">> BufferSetattr")
2791    ee('vim.current.buffer.name = True')
2792    ee('vim.current.buffer.xxx = True')
2793    cb.append(">> BufferMark")
2794    ee('vim.current.buffer.mark(0)')
2795    ee('vim.current.buffer.mark("abcM")')
2796    ee('vim.current.buffer.mark("!")')
2797    cb.append(">> BufferRange")
2798    ee('vim.current.buffer.range(1, 2, 3)')
2799    cb.append("> BufMap")
2800    cb.append(">> BufMapItem")
2801    ee('vim.buffers[100000000]')
2802    number_test('vim.buffers[%s]', natural=True)
2803    cb.append("> Current")
2804    cb.append(">> CurrentGetattr")
2805    ee('vim.current.xxx')
2806    cb.append(">> CurrentSetattr")
2807    ee('vim.current.line = True')
2808    ee('vim.current.buffer = True')
2809    ee('vim.current.window = True')
2810    ee('vim.current.tabpage = True')
2811    ee('vim.current.xxx = True')
2812    del d
2813    del ned
2814    del dl
2815    del l
2816    del ll
2817    del nel
2818    del f
2819    del fd
2820    del fdel
2821    del subexpr_test
2822    del stringtochars_test
2823    del Mapping
2824    del convertfrompyobject_test
2825    del convertfrompymapping_test
2826    del iter_test
2827    del number_test
2828    del FailingTrue
2829    del FailingIter
2830    del FailingIterNext
2831    del FailingIterNextN
2832    del FailingMapping
2833    del FailingMappingKey
2834    del FailingList
2835    del NoArgsCall
2836    del FailingCall
2837    del FailingNumber
2838  EOF
2839  delfunction F
2840
2841  let expected =<< trim END
2842    > Output
2843    >> OutputSetattr
2844    del sys.stdout.softspace:AttributeError:('cannot delete OutputObject attributes',)
2845    >>> Testing NumberToLong using sys.stdout.softspace = %s
2846    sys.stdout.softspace = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
2847    sys.stdout.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
2848    sys.stdout.softspace = -1:ValueError:('number must be greater or equal to zero',)
2849    <<< Finished
2850    >>> Testing NumberToLong using sys.stderr.softspace = %s
2851    sys.stderr.softspace = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
2852    sys.stderr.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
2853    sys.stderr.softspace = -1:ValueError:('number must be greater or equal to zero',)
2854    <<< Finished
2855    assert sys.stdout.isatty()==False:NOT FAILED
2856    assert sys.stdout.seekable()==False:NOT FAILED
2857    sys.stdout.close():NOT FAILED
2858    sys.stdout.flush():NOT FAILED
2859    assert sys.stderr.isatty()==False:NOT FAILED
2860    assert sys.stderr.seekable()==False:NOT FAILED
2861    sys.stderr.close():NOT FAILED
2862    sys.stderr.flush():NOT FAILED
2863    sys.stdout.attr = None:AttributeError:('invalid attribute: attr',)
2864    >> OutputWrite
2865    assert sys.stdout.writable()==True:NOT FAILED
2866    assert sys.stdout.readable()==False:NOT FAILED
2867    assert sys.stderr.writable()==True:NOT FAILED
2868    assert sys.stderr.readable()==False:NOT FAILED
2869    assert sys.stdout.closed()==False:NOT FAILED
2870    assert sys.stderr.closed()==False:NOT FAILED
2871    assert sys.stdout.errors=="strict":NOT FAILED
2872    assert sys.stderr.errors=="strict":NOT FAILED
2873    assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED
2874    sys.stdout.write(None):TypeError:('coercing to Unicode: need string or buffer, NoneType found',)
2875    >> OutputWriteLines
2876    sys.stdout.writelines(None):TypeError:("'NoneType' object is not iterable",)
2877    sys.stdout.writelines([1]):TypeError:('coercing to Unicode: need string or buffer, int found',)
2878    >>> Testing *Iter* using sys.stdout.writelines(%s)
2879    sys.stdout.writelines(FailingIter()):NotImplementedError:('iter',)
2880    sys.stdout.writelines(FailingIterNext()):NotImplementedError:('next',)
2881    <<< Finished
2882    > VimCommand
2883    >>> Testing StringToChars using vim.command(%s)
2884    vim.command(1):TypeError:('expected str() or unicode() instance, but got int',)
2885    vim.command(u"\0"):TypeError:('expected string without null bytes',)
2886    vim.command("\0"):TypeError:('expected string without null bytes',)
2887    <<< Finished
2888    vim.command("", 2):TypeError:('command() takes exactly one argument (2 given)',)
2889    > VimToPython
2890    > VimEval
2891    >>> Testing StringToChars using vim.eval(%s)
2892    vim.eval(1):TypeError:('expected str() or unicode() instance, but got int',)
2893    vim.eval(u"\0"):TypeError:('expected string without null bytes',)
2894    vim.eval("\0"):TypeError:('expected string without null bytes',)
2895    <<< Finished
2896    vim.eval("", FailingTrue()):TypeError:('function takes exactly 1 argument (2 given)',)
2897    > VimEvalPy
2898    >>> Testing StringToChars using vim.bindeval(%s)
2899    vim.bindeval(1):TypeError:('expected str() or unicode() instance, but got int',)
2900    vim.bindeval(u"\0"):TypeError:('expected string without null bytes',)
2901    vim.bindeval("\0"):TypeError:('expected string without null bytes',)
2902    <<< Finished
2903    vim.eval("", 2):TypeError:('function takes exactly 1 argument (2 given)',)
2904    > VimStrwidth
2905    >>> Testing StringToChars using vim.strwidth(%s)
2906    vim.strwidth(1):TypeError:('expected str() or unicode() instance, but got int',)
2907    vim.strwidth(u"\0"):TypeError:('expected string without null bytes',)
2908    vim.strwidth("\0"):TypeError:('expected string without null bytes',)
2909    <<< Finished
2910    > VimForeachRTP
2911    vim.foreach_rtp(None):TypeError:("'NoneType' object is not callable",)
2912    vim.foreach_rtp(NoArgsCall()):TypeError:('__call__() takes exactly 1 argument (2 given)',)
2913    vim.foreach_rtp(FailingCall()):NotImplementedError:('call',)
2914    vim.foreach_rtp(int, 2):TypeError:('foreach_rtp() takes exactly one argument (2 given)',)
2915    > import
2916    import xxx_no_such_module_xxx:ImportError:('No module named xxx_no_such_module_xxx',)
2917    import failing_import:ImportError:()
2918    import failing:NotImplementedError:()
2919    > Options
2920    >> OptionsItem
2921    vim.options["abcQ"]:KeyError:('abcQ',)
2922    vim.options[""]:ValueError:('empty keys are not allowed',)
2923    >>> Testing StringToChars using vim.options[%s]
2924    vim.options[1]:TypeError:('expected str() or unicode() instance, but got int',)
2925    vim.options[u"\0"]:TypeError:('expected string without null bytes',)
2926    vim.options["\0"]:TypeError:('expected string without null bytes',)
2927    <<< Finished
2928    >> OptionsContains
2929    >>> Testing StringToChars using %s in vim.options
2930    1 in vim.options:TypeError:('expected str() or unicode() instance, but got int',)
2931    u"\0" in vim.options:TypeError:('expected string without null bytes',)
2932    "\0" in vim.options:TypeError:('expected string without null bytes',)
2933    <<< Finished
2934    > Dictionary
2935    >> DictionaryConstructor
2936    vim.Dictionary("abcI"):ValueError:('expected sequence element of size 2, but got sequence of size 1',)
2937    >> DictionarySetattr
2938    del d.locked:AttributeError:('cannot delete vim.Dictionary attributes',)
2939    d.locked = FailingTrue():NotImplementedError:('bool',)
2940    vim.vvars.locked = False:TypeError:('cannot modify fixed dictionary',)
2941    d.scope = True:AttributeError:('cannot set attribute scope',)
2942    d.xxx = True:AttributeError:('cannot set attribute xxx',)
2943    >> _DictionaryItem
2944    d.get("a", 2, 3):TypeError:('function takes at most 2 arguments (3 given)',)
2945    >>> Testing StringToChars using d.get(%s)
2946    d.get(1):TypeError:('expected str() or unicode() instance, but got int',)
2947    d.get(u"\0"):TypeError:('expected string without null bytes',)
2948    d.get("\0"):TypeError:('expected string without null bytes',)
2949    <<< Finished
2950    d.pop("a"):KeyError:('a',)
2951    dl.pop("a"):error:('dictionary is locked',)
2952    >> DictionaryContains
2953    "" in d:ValueError:('empty keys are not allowed',)
2954    0 in d:TypeError:('expected str() or unicode() instance, but got int',)
2955    >> DictionaryIterNext
2956    for i in ned: ned["a"] = 1:RuntimeError:('hashtab changed during iteration',)
2957    >> DictionaryAssItem
2958    dl["b"] = 1:error:('dictionary is locked',)
2959    >>> Testing StringToChars using d[%s] = 1
2960    d[1] = 1:TypeError:('expected str() or unicode() instance, but got int',)
2961    d[u"\0"] = 1:TypeError:('expected string without null bytes',)
2962    d["\0"] = 1:TypeError:('expected string without null bytes',)
2963    <<< Finished
2964    >>> Testing StringToChars using d["a"] = {%s : 1}
2965    d["a"] = {1 : 1}:TypeError:('expected str() or unicode() instance, but got int',)
2966    d["a"] = {u"\0" : 1}:TypeError:('expected string without null bytes',)
2967    d["a"] = {"\0" : 1}:TypeError:('expected string without null bytes',)
2968    <<< Finished
2969    >>> Testing StringToChars using d["a"] = {"abcF" : {%s : 1}}
2970    d["a"] = {"abcF" : {1 : 1}}:TypeError:('expected str() or unicode() instance, but got int',)
2971    d["a"] = {"abcF" : {u"\0" : 1}}:TypeError:('expected string without null bytes',)
2972    d["a"] = {"abcF" : {"\0" : 1}}:TypeError:('expected string without null bytes',)
2973    <<< Finished
2974    >>> Testing StringToChars using d["a"] = {"abcF" : Mapping({%s : 1})}
2975    d["a"] = {"abcF" : Mapping({1 : 1})}:TypeError:('expected str() or unicode() instance, but got int',)
2976    d["a"] = {"abcF" : Mapping({u"\0" : 1})}:TypeError:('expected string without null bytes',)
2977    d["a"] = {"abcF" : Mapping({"\0" : 1})}:TypeError:('expected string without null bytes',)
2978    <<< Finished
2979    >>> Testing *Iter* using d["a"] = {"abcF" : %s}
2980    d["a"] = {"abcF" : FailingIter()}:TypeError:('unable to convert FailingIter to a Vim structure',)
2981    d["a"] = {"abcF" : FailingIterNext()}:NotImplementedError:('next',)
2982    <<< Finished
2983    >>> Testing ConvertFromPyObject using d["a"] = {"abcF" : %s}
2984    d["a"] = {"abcF" : None}:NOT FAILED
2985    d["a"] = {"abcF" : {"": 1}}:ValueError:('empty keys are not allowed',)
2986    d["a"] = {"abcF" : {u"": 1}}:ValueError:('empty keys are not allowed',)
2987    d["a"] = {"abcF" : FailingMapping()}:NotImplementedError:('keys',)
2988    d["a"] = {"abcF" : FailingMappingKey()}:NotImplementedError:('getitem:mappingkey',)
2989    d["a"] = {"abcF" : FailingNumber()}:TypeError:('long() argument must be a string or a number',)
2990    <<< Finished
2991    >>> Testing StringToChars using d["a"] = Mapping({%s : 1})
2992    d["a"] = Mapping({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
2993    d["a"] = Mapping({u"\0" : 1}):TypeError:('expected string without null bytes',)
2994    d["a"] = Mapping({"\0" : 1}):TypeError:('expected string without null bytes',)
2995    <<< Finished
2996    >>> Testing StringToChars using d["a"] = Mapping({"abcG" : {%s : 1}})
2997    d["a"] = Mapping({"abcG" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
2998    d["a"] = Mapping({"abcG" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
2999    d["a"] = Mapping({"abcG" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3000    <<< Finished
3001    >>> Testing StringToChars using d["a"] = Mapping({"abcG" : Mapping({%s : 1})})
3002    d["a"] = Mapping({"abcG" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3003    d["a"] = Mapping({"abcG" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3004    d["a"] = Mapping({"abcG" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3005    <<< Finished
3006    >>> Testing *Iter* using d["a"] = Mapping({"abcG" : %s})
3007    d["a"] = Mapping({"abcG" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3008    d["a"] = Mapping({"abcG" : FailingIterNext()}):NotImplementedError:('next',)
3009    <<< Finished
3010    >>> Testing ConvertFromPyObject using d["a"] = Mapping({"abcG" : %s})
3011    d["a"] = Mapping({"abcG" : None}):NOT FAILED
3012    d["a"] = Mapping({"abcG" : {"": 1}}):ValueError:('empty keys are not allowed',)
3013    d["a"] = Mapping({"abcG" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3014    d["a"] = Mapping({"abcG" : FailingMapping()}):NotImplementedError:('keys',)
3015    d["a"] = Mapping({"abcG" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3016    d["a"] = Mapping({"abcG" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3017    <<< Finished
3018    >>> Testing *Iter* using d["a"] = %s
3019    d["a"] = FailingIter():TypeError:('unable to convert FailingIter to a Vim structure',)
3020    d["a"] = FailingIterNext():NotImplementedError:('next',)
3021    <<< Finished
3022    >>> Testing ConvertFromPyObject using d["a"] = %s
3023    d["a"] = None:NOT FAILED
3024    d["a"] = {"": 1}:ValueError:('empty keys are not allowed',)
3025    d["a"] = {u"": 1}:ValueError:('empty keys are not allowed',)
3026    d["a"] = FailingMapping():NotImplementedError:('keys',)
3027    d["a"] = FailingMappingKey():NotImplementedError:('getitem:mappingkey',)
3028    d["a"] = FailingNumber():TypeError:('long() argument must be a string or a number',)
3029    <<< Finished
3030    >> DictionaryUpdate
3031    >>> kwargs
3032    >>> iter
3033    d.update(FailingMapping()):NotImplementedError:('keys',)
3034    d.update([FailingIterNext()]):NotImplementedError:('next',)
3035    d.update([FailingIterNextN(1)]):NotImplementedError:('next N',)
3036    >>> Testing *Iter* using d.update(%s)
3037    d.update(FailingIter()):NotImplementedError:('iter',)
3038    d.update(FailingIterNext()):NotImplementedError:('next',)
3039    <<< Finished
3040    >>> Testing StringToChars using d.update({%s : 1})
3041    d.update({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
3042    d.update({u"\0" : 1}):TypeError:('expected string without null bytes',)
3043    d.update({"\0" : 1}):TypeError:('expected string without null bytes',)
3044    <<< Finished
3045    >>> Testing StringToChars using d.update({"abcF" : {%s : 1}})
3046    d.update({"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
3047    d.update({"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
3048    d.update({"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3049    <<< Finished
3050    >>> Testing StringToChars using d.update({"abcF" : Mapping({%s : 1})})
3051    d.update({"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3052    d.update({"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3053    d.update({"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3054    <<< Finished
3055    >>> Testing *Iter* using d.update({"abcF" : %s})
3056    d.update({"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3057    d.update({"abcF" : FailingIterNext()}):NotImplementedError:('next',)
3058    <<< Finished
3059    >>> Testing ConvertFromPyObject using d.update({"abcF" : %s})
3060    d.update({"abcF" : None}):NOT FAILED
3061    d.update({"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
3062    d.update({"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3063    d.update({"abcF" : FailingMapping()}):NotImplementedError:('keys',)
3064    d.update({"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3065    d.update({"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3066    <<< Finished
3067    >>> Testing StringToChars using d.update(Mapping({%s : 1}))
3068    d.update(Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
3069    d.update(Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
3070    d.update(Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
3071    <<< Finished
3072    >>> Testing StringToChars using d.update(Mapping({"abcG" : {%s : 1}}))
3073    d.update(Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
3074    d.update(Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
3075    d.update(Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
3076    <<< Finished
3077    >>> Testing StringToChars using d.update(Mapping({"abcG" : Mapping({%s : 1})}))
3078    d.update(Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
3079    d.update(Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
3080    d.update(Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
3081    <<< Finished
3082    >>> Testing *Iter* using d.update(Mapping({"abcG" : %s}))
3083    d.update(Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
3084    d.update(Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
3085    <<< Finished
3086    >>> Testing ConvertFromPyObject using d.update(Mapping({"abcG" : %s}))
3087    d.update(Mapping({"abcG" : None})):NOT FAILED
3088    d.update(Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
3089    d.update(Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
3090    d.update(Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
3091    d.update(Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
3092    d.update(Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
3093    <<< Finished
3094    >>> Testing *Iter* using d.update(%s)
3095    d.update(FailingIter()):NotImplementedError:('iter',)
3096    d.update(FailingIterNext()):NotImplementedError:('next',)
3097    <<< Finished
3098    >>> Testing ConvertFromPyObject using d.update(%s)
3099    d.update(None):TypeError:("'NoneType' object is not iterable",)
3100    d.update({"": 1}):ValueError:('empty keys are not allowed',)
3101    d.update({u"": 1}):ValueError:('empty keys are not allowed',)
3102    d.update(FailingMapping()):NotImplementedError:('keys',)
3103    d.update(FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
3104    d.update(FailingNumber()):TypeError:("'FailingNumber' object is not iterable",)
3105    <<< Finished
3106    >>> Testing StringToChars using d.update(((%s, 0),))
3107    d.update(((1, 0),)):TypeError:('expected str() or unicode() instance, but got int',)
3108    d.update(((u"\0", 0),)):TypeError:('expected string without null bytes',)
3109    d.update((("\0", 0),)):TypeError:('expected string without null bytes',)
3110    <<< Finished
3111    >>> Testing StringToChars using d.update((("a", {%s : 1}),))
3112    d.update((("a", {1 : 1}),)):TypeError:('expected str() or unicode() instance, but got int',)
3113    d.update((("a", {u"\0" : 1}),)):TypeError:('expected string without null bytes',)
3114    d.update((("a", {"\0" : 1}),)):TypeError:('expected string without null bytes',)
3115    <<< Finished
3116    >>> Testing StringToChars using d.update((("a", {"abcF" : {%s : 1}}),))
3117    d.update((("a", {"abcF" : {1 : 1}}),)):TypeError:('expected str() or unicode() instance, but got int',)
3118    d.update((("a", {"abcF" : {u"\0" : 1}}),)):TypeError:('expected string without null bytes',)
3119    d.update((("a", {"abcF" : {"\0" : 1}}),)):TypeError:('expected string without null bytes',)
3120    <<< Finished
3121    >>> Testing StringToChars using d.update((("a", {"abcF" : Mapping({%s : 1})}),))
3122    d.update((("a", {"abcF" : Mapping({1 : 1})}),)):TypeError:('expected str() or unicode() instance, but got int',)
3123    d.update((("a", {"abcF" : Mapping({u"\0" : 1})}),)):TypeError:('expected string without null bytes',)
3124    d.update((("a", {"abcF" : Mapping({"\0" : 1})}),)):TypeError:('expected string without null bytes',)
3125    <<< Finished
3126    >>> Testing *Iter* using d.update((("a", {"abcF" : %s}),))
3127    d.update((("a", {"abcF" : FailingIter()}),)):TypeError:('unable to convert FailingIter to a Vim structure',)
3128    d.update((("a", {"abcF" : FailingIterNext()}),)):NotImplementedError:('next',)
3129    <<< Finished
3130    >>> Testing ConvertFromPyObject using d.update((("a", {"abcF" : %s}),))
3131    d.update((("a", {"abcF" : None}),)):error:("failed to add key 'a' to dictionary",)
3132    d.update((("a", {"abcF" : {"": 1}}),)):ValueError:('empty keys are not allowed',)
3133    d.update((("a", {"abcF" : {u"": 1}}),)):ValueError:('empty keys are not allowed',)
3134    d.update((("a", {"abcF" : FailingMapping()}),)):NotImplementedError:('keys',)
3135    d.update((("a", {"abcF" : FailingMappingKey()}),)):NotImplementedError:('getitem:mappingkey',)
3136    d.update((("a", {"abcF" : FailingNumber()}),)):TypeError:('long() argument must be a string or a number',)
3137    <<< Finished
3138    >>> Testing StringToChars using d.update((("a", Mapping({%s : 1})),))
3139    d.update((("a", Mapping({1 : 1})),)):TypeError:('expected str() or unicode() instance, but got int',)
3140    d.update((("a", Mapping({u"\0" : 1})),)):TypeError:('expected string without null bytes',)
3141    d.update((("a", Mapping({"\0" : 1})),)):TypeError:('expected string without null bytes',)
3142    <<< Finished
3143    >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : {%s : 1}})),))
3144    d.update((("a", Mapping({"abcG" : {1 : 1}})),)):TypeError:('expected str() or unicode() instance, but got int',)
3145    d.update((("a", Mapping({"abcG" : {u"\0" : 1}})),)):TypeError:('expected string without null bytes',)
3146    d.update((("a", Mapping({"abcG" : {"\0" : 1}})),)):TypeError:('expected string without null bytes',)
3147    <<< Finished
3148    >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : Mapping({%s : 1})})),))
3149    d.update((("a", Mapping({"abcG" : Mapping({1 : 1})})),)):TypeError:('expected str() or unicode() instance, but got int',)
3150    d.update((("a", Mapping({"abcG" : Mapping({u"\0" : 1})})),)):TypeError:('expected string without null bytes',)
3151    d.update((("a", Mapping({"abcG" : Mapping({"\0" : 1})})),)):TypeError:('expected string without null bytes',)
3152    <<< Finished
3153    >>> Testing *Iter* using d.update((("a", Mapping({"abcG" : %s})),))
3154    d.update((("a", Mapping({"abcG" : FailingIter()})),)):TypeError:('unable to convert FailingIter to a Vim structure',)
3155    d.update((("a", Mapping({"abcG" : FailingIterNext()})),)):NotImplementedError:('next',)
3156    <<< Finished
3157    >>> Testing ConvertFromPyObject using d.update((("a", Mapping({"abcG" : %s})),))
3158    d.update((("a", Mapping({"abcG" : None})),)):error:("failed to add key 'a' to dictionary",)
3159    d.update((("a", Mapping({"abcG" : {"": 1}})),)):ValueError:('empty keys are not allowed',)
3160    d.update((("a", Mapping({"abcG" : {u"": 1}})),)):ValueError:('empty keys are not allowed',)
3161    d.update((("a", Mapping({"abcG" : FailingMapping()})),)):NotImplementedError:('keys',)
3162    d.update((("a", Mapping({"abcG" : FailingMappingKey()})),)):NotImplementedError:('getitem:mappingkey',)
3163    d.update((("a", Mapping({"abcG" : FailingNumber()})),)):TypeError:('long() argument must be a string or a number',)
3164    <<< Finished
3165    >>> Testing *Iter* using d.update((("a", %s),))
3166    d.update((("a", FailingIter()),)):TypeError:('unable to convert FailingIter to a Vim structure',)
3167    d.update((("a", FailingIterNext()),)):NotImplementedError:('next',)
3168    <<< Finished
3169    >>> Testing ConvertFromPyObject using d.update((("a", %s),))
3170    d.update((("a", None),)):error:("failed to add key 'a' to dictionary",)
3171    d.update((("a", {"": 1}),)):ValueError:('empty keys are not allowed',)
3172    d.update((("a", {u"": 1}),)):ValueError:('empty keys are not allowed',)
3173    d.update((("a", FailingMapping()),)):NotImplementedError:('keys',)
3174    d.update((("a", FailingMappingKey()),)):NotImplementedError:('getitem:mappingkey',)
3175    d.update((("a", FailingNumber()),)):TypeError:('long() argument must be a string or a number',)
3176    <<< Finished
3177    >> DictionaryPopItem
3178    d.popitem(1, 2):TypeError:('popitem() takes no arguments (2 given)',)
3179    >> DictionaryHasKey
3180    d.has_key():TypeError:('has_key() takes exactly one argument (0 given)',)
3181    > List
3182    >> ListConstructor
3183    vim.List(1, 2):TypeError:('function takes at most 1 argument (2 given)',)
3184    vim.List(a=1):TypeError:('list constructor does not accept keyword arguments',)
3185    >>> Testing *Iter* using vim.List(%s)
3186    vim.List(FailingIter()):NotImplementedError:('iter',)
3187    vim.List(FailingIterNext()):NotImplementedError:('next',)
3188    <<< Finished
3189    >>> Testing StringToChars using vim.List([{%s : 1}])
3190    vim.List([{1 : 1}]):TypeError:('expected str() or unicode() instance, but got int',)
3191    vim.List([{u"\0" : 1}]):TypeError:('expected string without null bytes',)
3192    vim.List([{"\0" : 1}]):TypeError:('expected string without null bytes',)
3193    <<< Finished
3194    >>> Testing StringToChars using vim.List([{"abcF" : {%s : 1}}])
3195    vim.List([{"abcF" : {1 : 1}}]):TypeError:('expected str() or unicode() instance, but got int',)
3196    vim.List([{"abcF" : {u"\0" : 1}}]):TypeError:('expected string without null bytes',)
3197    vim.List([{"abcF" : {"\0" : 1}}]):TypeError:('expected string without null bytes',)
3198    <<< Finished
3199    >>> Testing StringToChars using vim.List([{"abcF" : Mapping({%s : 1})}])
3200    vim.List([{"abcF" : Mapping({1 : 1})}]):TypeError:('expected str() or unicode() instance, but got int',)
3201    vim.List([{"abcF" : Mapping({u"\0" : 1})}]):TypeError:('expected string without null bytes',)
3202    vim.List([{"abcF" : Mapping({"\0" : 1})}]):TypeError:('expected string without null bytes',)
3203    <<< Finished
3204    >>> Testing *Iter* using vim.List([{"abcF" : %s}])
3205    vim.List([{"abcF" : FailingIter()}]):TypeError:('unable to convert FailingIter to a Vim structure',)
3206    vim.List([{"abcF" : FailingIterNext()}]):NotImplementedError:('next',)
3207    <<< Finished
3208    >>> Testing ConvertFromPyObject using vim.List([{"abcF" : %s}])
3209    vim.List([{"abcF" : None}]):NOT FAILED
3210    vim.List([{"abcF" : {"": 1}}]):ValueError:('empty keys are not allowed',)
3211    vim.List([{"abcF" : {u"": 1}}]):ValueError:('empty keys are not allowed',)
3212    vim.List([{"abcF" : FailingMapping()}]):NotImplementedError:('keys',)
3213    vim.List([{"abcF" : FailingMappingKey()}]):NotImplementedError:('getitem:mappingkey',)
3214    vim.List([{"abcF" : FailingNumber()}]):TypeError:('long() argument must be a string or a number',)
3215    <<< Finished
3216    >>> Testing StringToChars using vim.List([Mapping({%s : 1})])
3217    vim.List([Mapping({1 : 1})]):TypeError:('expected str() or unicode() instance, but got int',)
3218    vim.List([Mapping({u"\0" : 1})]):TypeError:('expected string without null bytes',)
3219    vim.List([Mapping({"\0" : 1})]):TypeError:('expected string without null bytes',)
3220    <<< Finished
3221    >>> Testing StringToChars using vim.List([Mapping({"abcG" : {%s : 1}})])
3222    vim.List([Mapping({"abcG" : {1 : 1}})]):TypeError:('expected str() or unicode() instance, but got int',)
3223    vim.List([Mapping({"abcG" : {u"\0" : 1}})]):TypeError:('expected string without null bytes',)
3224    vim.List([Mapping({"abcG" : {"\0" : 1}})]):TypeError:('expected string without null bytes',)
3225    <<< Finished
3226    >>> Testing StringToChars using vim.List([Mapping({"abcG" : Mapping({%s : 1})})])
3227    vim.List([Mapping({"abcG" : Mapping({1 : 1})})]):TypeError:('expected str() or unicode() instance, but got int',)
3228    vim.List([Mapping({"abcG" : Mapping({u"\0" : 1})})]):TypeError:('expected string without null bytes',)
3229    vim.List([Mapping({"abcG" : Mapping({"\0" : 1})})]):TypeError:('expected string without null bytes',)
3230    <<< Finished
3231    >>> Testing *Iter* using vim.List([Mapping({"abcG" : %s})])
3232    vim.List([Mapping({"abcG" : FailingIter()})]):TypeError:('unable to convert FailingIter to a Vim structure',)
3233    vim.List([Mapping({"abcG" : FailingIterNext()})]):NotImplementedError:('next',)
3234    <<< Finished
3235    >>> Testing ConvertFromPyObject using vim.List([Mapping({"abcG" : %s})])
3236    vim.List([Mapping({"abcG" : None})]):NOT FAILED
3237    vim.List([Mapping({"abcG" : {"": 1}})]):ValueError:('empty keys are not allowed',)
3238    vim.List([Mapping({"abcG" : {u"": 1}})]):ValueError:('empty keys are not allowed',)
3239    vim.List([Mapping({"abcG" : FailingMapping()})]):NotImplementedError:('keys',)
3240    vim.List([Mapping({"abcG" : FailingMappingKey()})]):NotImplementedError:('getitem:mappingkey',)
3241    vim.List([Mapping({"abcG" : FailingNumber()})]):TypeError:('long() argument must be a string or a number',)
3242    <<< Finished
3243    >>> Testing *Iter* using vim.List([%s])
3244    vim.List([FailingIter()]):TypeError:('unable to convert FailingIter to a Vim structure',)
3245    vim.List([FailingIterNext()]):NotImplementedError:('next',)
3246    <<< Finished
3247    >>> Testing ConvertFromPyObject using vim.List([%s])
3248    vim.List([None]):NOT FAILED
3249    vim.List([{"": 1}]):ValueError:('empty keys are not allowed',)
3250    vim.List([{u"": 1}]):ValueError:('empty keys are not allowed',)
3251    vim.List([FailingMapping()]):NotImplementedError:('keys',)
3252    vim.List([FailingMappingKey()]):NotImplementedError:('getitem:mappingkey',)
3253    vim.List([FailingNumber()]):TypeError:('long() argument must be a string or a number',)
3254    <<< Finished
3255    >> ListItem
3256    l[1000]:IndexError:('list index out of range',)
3257    >> ListAssItem
3258    ll[1] = 2:error:('list is locked',)
3259    l[1000] = 3:IndexError:('list index out of range',)
3260    >> ListAssSlice
3261    ll[1:100] = "abcJ":error:('list is locked',)
3262    >>> Testing *Iter* using l[:] = %s
3263    l[:] = FailingIter():NotImplementedError:('iter',)
3264    l[:] = FailingIterNext():NotImplementedError:('next',)
3265    <<< Finished
3266    nel[1:10:2]  = "abcK":ValueError:('attempt to assign sequence of size greater than 2 to extended slice',)
3267    ('a', 'b', 'c', 'O')
3268    nel[1:10:2]  = "a":ValueError:('attempt to assign sequence of size 1 to extended slice of size 2',)
3269    ('a', 'b', 'c', 'O')
3270    nel[1:1:-1]  = "a":ValueError:('attempt to assign sequence of size greater than 0 to extended slice',)
3271    ('a', 'b', 'c', 'O')
3272    nel[:] = FailingIterNextN(2):NotImplementedError:('next N',)
3273    ('a', 'b', 'c', 'O')
3274    >>> Testing StringToChars using l[:] = [{%s : 1}]
3275    l[:] = [{1 : 1}]:TypeError:('expected str() or unicode() instance, but got int',)
3276    l[:] = [{u"\0" : 1}]:TypeError:('expected string without null bytes',)
3277    l[:] = [{"\0" : 1}]:TypeError:('expected string without null bytes',)
3278    <<< Finished
3279    >>> Testing StringToChars using l[:] = [{"abcF" : {%s : 1}}]
3280    l[:] = [{"abcF" : {1 : 1}}]:TypeError:('expected str() or unicode() instance, but got int',)
3281    l[:] = [{"abcF" : {u"\0" : 1}}]:TypeError:('expected string without null bytes',)
3282    l[:] = [{"abcF" : {"\0" : 1}}]:TypeError:('expected string without null bytes',)
3283    <<< Finished
3284    >>> Testing StringToChars using l[:] = [{"abcF" : Mapping({%s : 1})}]
3285    l[:] = [{"abcF" : Mapping({1 : 1})}]:TypeError:('expected str() or unicode() instance, but got int',)
3286    l[:] = [{"abcF" : Mapping({u"\0" : 1})}]:TypeError:('expected string without null bytes',)
3287    l[:] = [{"abcF" : Mapping({"\0" : 1})}]:TypeError:('expected string without null bytes',)
3288    <<< Finished
3289    >>> Testing *Iter* using l[:] = [{"abcF" : %s}]
3290    l[:] = [{"abcF" : FailingIter()}]:TypeError:('unable to convert FailingIter to a Vim structure',)
3291    l[:] = [{"abcF" : FailingIterNext()}]:NotImplementedError:('next',)
3292    <<< Finished
3293    >>> Testing ConvertFromPyObject using l[:] = [{"abcF" : %s}]
3294    l[:] = [{"abcF" : None}]:NOT FAILED
3295    l[:] = [{"abcF" : {"": 1}}]:ValueError:('empty keys are not allowed',)
3296    l[:] = [{"abcF" : {u"": 1}}]:ValueError:('empty keys are not allowed',)
3297    l[:] = [{"abcF" : FailingMapping()}]:NotImplementedError:('keys',)
3298    l[:] = [{"abcF" : FailingMappingKey()}]:NotImplementedError:('getitem:mappingkey',)
3299    l[:] = [{"abcF" : FailingNumber()}]:TypeError:('long() argument must be a string or a number',)
3300    <<< Finished
3301    >>> Testing StringToChars using l[:] = [Mapping({%s : 1})]
3302    l[:] = [Mapping({1 : 1})]:TypeError:('expected str() or unicode() instance, but got int',)
3303    l[:] = [Mapping({u"\0" : 1})]:TypeError:('expected string without null bytes',)
3304    l[:] = [Mapping({"\0" : 1})]:TypeError:('expected string without null bytes',)
3305    <<< Finished
3306    >>> Testing StringToChars using l[:] = [Mapping({"abcG" : {%s : 1}})]
3307    l[:] = [Mapping({"abcG" : {1 : 1}})]:TypeError:('expected str() or unicode() instance, but got int',)
3308    l[:] = [Mapping({"abcG" : {u"\0" : 1}})]:TypeError:('expected string without null bytes',)
3309    l[:] = [Mapping({"abcG" : {"\0" : 1}})]:TypeError:('expected string without null bytes',)
3310    <<< Finished
3311    >>> Testing StringToChars using l[:] = [Mapping({"abcG" : Mapping({%s : 1})})]
3312    l[:] = [Mapping({"abcG" : Mapping({1 : 1})})]:TypeError:('expected str() or unicode() instance, but got int',)
3313    l[:] = [Mapping({"abcG" : Mapping({u"\0" : 1})})]:TypeError:('expected string without null bytes',)
3314    l[:] = [Mapping({"abcG" : Mapping({"\0" : 1})})]:TypeError:('expected string without null bytes',)
3315    <<< Finished
3316    >>> Testing *Iter* using l[:] = [Mapping({"abcG" : %s})]
3317    l[:] = [Mapping({"abcG" : FailingIter()})]:TypeError:('unable to convert FailingIter to a Vim structure',)
3318    l[:] = [Mapping({"abcG" : FailingIterNext()})]:NotImplementedError:('next',)
3319    <<< Finished
3320    >>> Testing ConvertFromPyObject using l[:] = [Mapping({"abcG" : %s})]
3321    l[:] = [Mapping({"abcG" : None})]:NOT FAILED
3322    l[:] = [Mapping({"abcG" : {"": 1}})]:ValueError:('empty keys are not allowed',)
3323    l[:] = [Mapping({"abcG" : {u"": 1}})]:ValueError:('empty keys are not allowed',)
3324    l[:] = [Mapping({"abcG" : FailingMapping()})]:NotImplementedError:('keys',)
3325    l[:] = [Mapping({"abcG" : FailingMappingKey()})]:NotImplementedError:('getitem:mappingkey',)
3326    l[:] = [Mapping({"abcG" : FailingNumber()})]:TypeError:('long() argument must be a string or a number',)
3327    <<< Finished
3328    >>> Testing *Iter* using l[:] = [%s]
3329    l[:] = [FailingIter()]:TypeError:('unable to convert FailingIter to a Vim structure',)
3330    l[:] = [FailingIterNext()]:NotImplementedError:('next',)
3331    <<< Finished
3332    >>> Testing ConvertFromPyObject using l[:] = [%s]
3333    l[:] = [None]:NOT FAILED
3334    l[:] = [{"": 1}]:ValueError:('empty keys are not allowed',)
3335    l[:] = [{u"": 1}]:ValueError:('empty keys are not allowed',)
3336    l[:] = [FailingMapping()]:NotImplementedError:('keys',)
3337    l[:] = [FailingMappingKey()]:NotImplementedError:('getitem:mappingkey',)
3338    l[:] = [FailingNumber()]:TypeError:('long() argument must be a string or a number',)
3339    <<< Finished
3340    >> ListConcatInPlace
3341    >>> Testing *Iter* using l.extend(%s)
3342    l.extend(FailingIter()):NotImplementedError:('iter',)
3343    l.extend(FailingIterNext()):NotImplementedError:('next',)
3344    <<< Finished
3345    >>> Testing StringToChars using l.extend([{%s : 1}])
3346    l.extend([{1 : 1}]):TypeError:('expected str() or unicode() instance, but got int',)
3347    l.extend([{u"\0" : 1}]):TypeError:('expected string without null bytes',)
3348    l.extend([{"\0" : 1}]):TypeError:('expected string without null bytes',)
3349    <<< Finished
3350    >>> Testing StringToChars using l.extend([{"abcF" : {%s : 1}}])
3351    l.extend([{"abcF" : {1 : 1}}]):TypeError:('expected str() or unicode() instance, but got int',)
3352    l.extend([{"abcF" : {u"\0" : 1}}]):TypeError:('expected string without null bytes',)
3353    l.extend([{"abcF" : {"\0" : 1}}]):TypeError:('expected string without null bytes',)
3354    <<< Finished
3355    >>> Testing StringToChars using l.extend([{"abcF" : Mapping({%s : 1})}])
3356    l.extend([{"abcF" : Mapping({1 : 1})}]):TypeError:('expected str() or unicode() instance, but got int',)
3357    l.extend([{"abcF" : Mapping({u"\0" : 1})}]):TypeError:('expected string without null bytes',)
3358    l.extend([{"abcF" : Mapping({"\0" : 1})}]):TypeError:('expected string without null bytes',)
3359    <<< Finished
3360    >>> Testing *Iter* using l.extend([{"abcF" : %s}])
3361    l.extend([{"abcF" : FailingIter()}]):TypeError:('unable to convert FailingIter to a Vim structure',)
3362    l.extend([{"abcF" : FailingIterNext()}]):NotImplementedError:('next',)
3363    <<< Finished
3364    >>> Testing ConvertFromPyObject using l.extend([{"abcF" : %s}])
3365    l.extend([{"abcF" : None}]):NOT FAILED
3366    l.extend([{"abcF" : {"": 1}}]):ValueError:('empty keys are not allowed',)
3367    l.extend([{"abcF" : {u"": 1}}]):ValueError:('empty keys are not allowed',)
3368    l.extend([{"abcF" : FailingMapping()}]):NotImplementedError:('keys',)
3369    l.extend([{"abcF" : FailingMappingKey()}]):NotImplementedError:('getitem:mappingkey',)
3370    l.extend([{"abcF" : FailingNumber()}]):TypeError:('long() argument must be a string or a number',)
3371    <<< Finished
3372    >>> Testing StringToChars using l.extend([Mapping({%s : 1})])
3373    l.extend([Mapping({1 : 1})]):TypeError:('expected str() or unicode() instance, but got int',)
3374    l.extend([Mapping({u"\0" : 1})]):TypeError:('expected string without null bytes',)
3375    l.extend([Mapping({"\0" : 1})]):TypeError:('expected string without null bytes',)
3376    <<< Finished
3377    >>> Testing StringToChars using l.extend([Mapping({"abcG" : {%s : 1}})])
3378    l.extend([Mapping({"abcG" : {1 : 1}})]):TypeError:('expected str() or unicode() instance, but got int',)
3379    l.extend([Mapping({"abcG" : {u"\0" : 1}})]):TypeError:('expected string without null bytes',)
3380    l.extend([Mapping({"abcG" : {"\0" : 1}})]):TypeError:('expected string without null bytes',)
3381    <<< Finished
3382    >>> Testing StringToChars using l.extend([Mapping({"abcG" : Mapping({%s : 1})})])
3383    l.extend([Mapping({"abcG" : Mapping({1 : 1})})]):TypeError:('expected str() or unicode() instance, but got int',)
3384    l.extend([Mapping({"abcG" : Mapping({u"\0" : 1})})]):TypeError:('expected string without null bytes',)
3385    l.extend([Mapping({"abcG" : Mapping({"\0" : 1})})]):TypeError:('expected string without null bytes',)
3386    <<< Finished
3387    >>> Testing *Iter* using l.extend([Mapping({"abcG" : %s})])
3388    l.extend([Mapping({"abcG" : FailingIter()})]):TypeError:('unable to convert FailingIter to a Vim structure',)
3389    l.extend([Mapping({"abcG" : FailingIterNext()})]):NotImplementedError:('next',)
3390    <<< Finished
3391    >>> Testing ConvertFromPyObject using l.extend([Mapping({"abcG" : %s})])
3392    l.extend([Mapping({"abcG" : None})]):NOT FAILED
3393    l.extend([Mapping({"abcG" : {"": 1}})]):ValueError:('empty keys are not allowed',)
3394    l.extend([Mapping({"abcG" : {u"": 1}})]):ValueError:('empty keys are not allowed',)
3395    l.extend([Mapping({"abcG" : FailingMapping()})]):NotImplementedError:('keys',)
3396    l.extend([Mapping({"abcG" : FailingMappingKey()})]):NotImplementedError:('getitem:mappingkey',)
3397    l.extend([Mapping({"abcG" : FailingNumber()})]):TypeError:('long() argument must be a string or a number',)
3398    <<< Finished
3399    >>> Testing *Iter* using l.extend([%s])
3400    l.extend([FailingIter()]):TypeError:('unable to convert FailingIter to a Vim structure',)
3401    l.extend([FailingIterNext()]):NotImplementedError:('next',)
3402    <<< Finished
3403    >>> Testing ConvertFromPyObject using l.extend([%s])
3404    l.extend([None]):NOT FAILED
3405    l.extend([{"": 1}]):ValueError:('empty keys are not allowed',)
3406    l.extend([{u"": 1}]):ValueError:('empty keys are not allowed',)
3407    l.extend([FailingMapping()]):NotImplementedError:('keys',)
3408    l.extend([FailingMappingKey()]):NotImplementedError:('getitem:mappingkey',)
3409    l.extend([FailingNumber()]):TypeError:('long() argument must be a string or a number',)
3410    <<< Finished
3411    >> ListSetattr
3412    del l.locked:AttributeError:('cannot delete vim.List attributes',)
3413    l.locked = FailingTrue():NotImplementedError:('bool',)
3414    l.xxx = True:AttributeError:('cannot set attribute xxx',)
3415    > Function
3416    >> FunctionConstructor
3417    >>> FunctionConstructor
3418    vim.Function("123"):ValueError:('unnamed function 123 does not exist',)
3419    vim.Function("xxx_non_existent_function_xxx"):ValueError:('function xxx_non_existent_function_xxx does not exist',)
3420    vim.Function("xxx#non#existent#function#xxx"):NOT FAILED
3421    vim.Function("xxx_non_existent_function_xxx2", args=[]):ValueError:('function xxx_non_existent_function_xxx2 does not exist',)
3422    vim.Function("xxx_non_existent_function_xxx3", self={}):ValueError:('function xxx_non_existent_function_xxx3 does not exist',)
3423    vim.Function("xxx_non_existent_function_xxx4", args=[], self={}):ValueError:('function xxx_non_existent_function_xxx4 does not exist',)
3424    >>> FunctionNew
3425    vim.Function("tr", self="abcFuncSelf"):TypeError:('unable to convert str to a Vim dictionary',)
3426    vim.Function("tr", args=427423):TypeError:('unable to convert int to a Vim list',)
3427    vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
3428    vim.Function(self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
3429    vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
3430    vim.Function("tr", ""):TypeError:('function takes exactly 1 argument (2 given)',)
3431    >> FunctionCall
3432    >>> Testing StringToChars using f({%s : 1})
3433    f({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
3434    f({u"\0" : 1}):TypeError:('expected string without null bytes',)
3435    f({"\0" : 1}):TypeError:('expected string without null bytes',)
3436    <<< Finished
3437    >>> Testing StringToChars using f({"abcF" : {%s : 1}})
3438    f({"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
3439    f({"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
3440    f({"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3441    <<< Finished
3442    >>> Testing StringToChars using f({"abcF" : Mapping({%s : 1})})
3443    f({"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3444    f({"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3445    f({"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3446    <<< Finished
3447    >>> Testing *Iter* using f({"abcF" : %s})
3448    f({"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3449    f({"abcF" : FailingIterNext()}):NotImplementedError:('next',)
3450    <<< Finished
3451    >>> Testing ConvertFromPyObject using f({"abcF" : %s})
3452    f({"abcF" : None}):NOT FAILED
3453    f({"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
3454    f({"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3455    f({"abcF" : FailingMapping()}):NotImplementedError:('keys',)
3456    f({"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3457    f({"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3458    <<< Finished
3459    >>> Testing StringToChars using f(Mapping({%s : 1}))
3460    f(Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
3461    f(Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
3462    f(Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
3463    <<< Finished
3464    >>> Testing StringToChars using f(Mapping({"abcG" : {%s : 1}}))
3465    f(Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
3466    f(Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
3467    f(Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
3468    <<< Finished
3469    >>> Testing StringToChars using f(Mapping({"abcG" : Mapping({%s : 1})}))
3470    f(Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
3471    f(Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
3472    f(Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
3473    <<< Finished
3474    >>> Testing *Iter* using f(Mapping({"abcG" : %s}))
3475    f(Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
3476    f(Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
3477    <<< Finished
3478    >>> Testing ConvertFromPyObject using f(Mapping({"abcG" : %s}))
3479    f(Mapping({"abcG" : None})):NOT FAILED
3480    f(Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
3481    f(Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
3482    f(Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
3483    f(Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
3484    f(Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
3485    <<< Finished
3486    >>> Testing *Iter* using f(%s)
3487    f(FailingIter()):TypeError:('unable to convert FailingIter to a Vim structure',)
3488    f(FailingIterNext()):NotImplementedError:('next',)
3489    <<< Finished
3490    >>> Testing ConvertFromPyObject using f(%s)
3491    f(None):NOT FAILED
3492    f({"": 1}):ValueError:('empty keys are not allowed',)
3493    f({u"": 1}):ValueError:('empty keys are not allowed',)
3494    f(FailingMapping()):NotImplementedError:('keys',)
3495    f(FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
3496    f(FailingNumber()):TypeError:('long() argument must be a string or a number',)
3497    <<< Finished
3498    >>> Testing StringToChars using fd(self={%s : 1})
3499    fd(self={1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
3500    fd(self={u"\0" : 1}):TypeError:('expected string without null bytes',)
3501    fd(self={"\0" : 1}):TypeError:('expected string without null bytes',)
3502    <<< Finished
3503    >>> Testing StringToChars using fd(self={"abcF" : {%s : 1}})
3504    fd(self={"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
3505    fd(self={"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
3506    fd(self={"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3507    <<< Finished
3508    >>> Testing StringToChars using fd(self={"abcF" : Mapping({%s : 1})})
3509    fd(self={"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3510    fd(self={"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3511    fd(self={"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3512    <<< Finished
3513    >>> Testing *Iter* using fd(self={"abcF" : %s})
3514    fd(self={"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3515    fd(self={"abcF" : FailingIterNext()}):NotImplementedError:('next',)
3516    <<< Finished
3517    >>> Testing ConvertFromPyObject using fd(self={"abcF" : %s})
3518    fd(self={"abcF" : None}):NOT FAILED
3519    fd(self={"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
3520    fd(self={"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3521    fd(self={"abcF" : FailingMapping()}):NotImplementedError:('keys',)
3522    fd(self={"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3523    fd(self={"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3524    <<< Finished
3525    >>> Testing StringToChars using fd(self=Mapping({%s : 1}))
3526    fd(self=Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
3527    fd(self=Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
3528    fd(self=Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
3529    <<< Finished
3530    >>> Testing StringToChars using fd(self=Mapping({"abcG" : {%s : 1}}))
3531    fd(self=Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
3532    fd(self=Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
3533    fd(self=Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
3534    <<< Finished
3535    >>> Testing StringToChars using fd(self=Mapping({"abcG" : Mapping({%s : 1})}))
3536    fd(self=Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
3537    fd(self=Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
3538    fd(self=Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
3539    <<< Finished
3540    >>> Testing *Iter* using fd(self=Mapping({"abcG" : %s}))
3541    fd(self=Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
3542    fd(self=Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
3543    <<< Finished
3544    >>> Testing ConvertFromPyObject using fd(self=Mapping({"abcG" : %s}))
3545    fd(self=Mapping({"abcG" : None})):NOT FAILED
3546    fd(self=Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
3547    fd(self=Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
3548    fd(self=Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
3549    fd(self=Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
3550    fd(self=Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
3551    <<< Finished
3552    >>> Testing *Iter* using fd(self=%s)
3553    fd(self=FailingIter()):TypeError:('unable to convert FailingIter to a Vim dictionary',)
3554    fd(self=FailingIterNext()):TypeError:('unable to convert FailingIterNext to a Vim dictionary',)
3555    <<< Finished
3556    >>> Testing ConvertFromPyObject using fd(self=%s)
3557    fd(self=None):TypeError:('unable to convert NoneType to a Vim dictionary',)
3558    fd(self={"": 1}):ValueError:('empty keys are not allowed',)
3559    fd(self={u"": 1}):ValueError:('empty keys are not allowed',)
3560    fd(self=FailingMapping()):NotImplementedError:('keys',)
3561    fd(self=FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
3562    fd(self=FailingNumber()):TypeError:('unable to convert FailingNumber to a Vim dictionary',)
3563    <<< Finished
3564    >>> Testing ConvertFromPyMapping using fd(self=%s)
3565    fd(self=[]):TypeError:('unable to convert list to a Vim dictionary',)
3566    <<< Finished
3567    > TabPage
3568    >> TabPageAttr
3569    vim.current.tabpage.xxx:AttributeError:('xxx',)
3570    > TabList
3571    >> TabListItem
3572    vim.tabpages[1000]:IndexError:('no such tab page',)
3573    > Window
3574    >> WindowAttr
3575    vim.current.window.xxx:AttributeError:('xxx',)
3576    >> WindowSetattr
3577    vim.current.window.buffer = 0:TypeError:('readonly attribute: buffer',)
3578    vim.current.window.cursor = (100000000, 100000000):error:('cursor position outside buffer',)
3579    vim.current.window.cursor = True:TypeError:('argument must be 2-item sequence, not bool',)
3580    >>> Testing NumberToLong using vim.current.window.height = %s
3581    vim.current.window.height = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
3582    vim.current.window.height = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
3583    vim.current.window.height = -1:ValueError:('number must be greater or equal to zero',)
3584    <<< Finished
3585    >>> Testing NumberToLong using vim.current.window.width = %s
3586    vim.current.window.width = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
3587    vim.current.window.width = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
3588    vim.current.window.width = -1:ValueError:('number must be greater or equal to zero',)
3589    <<< Finished
3590    vim.current.window.xxxxxx = True:AttributeError:('xxxxxx',)
3591    > WinList
3592    >> WinListItem
3593    vim.windows[1000]:IndexError:('no such window',)
3594    > Buffer
3595    >> StringToLine (indirect)
3596    vim.current.buffer[0] = "\na":error:('string cannot contain newlines',)
3597    vim.current.buffer[0] = u"\na":error:('string cannot contain newlines',)
3598    >> SetBufferLine (indirect)
3599    vim.current.buffer[0] = True:TypeError:('bad argument type for built-in operation',)
3600    >> SetBufferLineList (indirect)
3601    vim.current.buffer[:] = True:TypeError:('bad argument type for built-in operation',)
3602    vim.current.buffer[:] = ["\na", "bc"]:error:('string cannot contain newlines',)
3603    >> InsertBufferLines (indirect)
3604    vim.current.buffer.append(None):TypeError:('bad argument type for built-in operation',)
3605    vim.current.buffer.append(["\na", "bc"]):error:('string cannot contain newlines',)
3606    vim.current.buffer.append("\nbc"):error:('string cannot contain newlines',)
3607    >> RBItem
3608    vim.current.buffer[100000000]:IndexError:('line number out of range',)
3609    >> RBAsItem
3610    vim.current.buffer[100000000] = "":IndexError:('line number out of range',)
3611    >> BufferAttr
3612    vim.current.buffer.xxx:AttributeError:('xxx',)
3613    >> BufferSetattr
3614    vim.current.buffer.name = True:TypeError:('expected str() or unicode() instance, but got bool',)
3615    vim.current.buffer.xxx = True:AttributeError:('xxx',)
3616    >> BufferMark
3617    vim.current.buffer.mark(0):TypeError:('expected str() or unicode() instance, but got int',)
3618    vim.current.buffer.mark("abcM"):ValueError:('mark name must be a single character',)
3619    vim.current.buffer.mark("!"):error:('invalid mark name',)
3620    >> BufferRange
3621    vim.current.buffer.range(1, 2, 3):TypeError:('function takes exactly 2 arguments (3 given)',)
3622    > BufMap
3623    >> BufMapItem
3624    vim.buffers[100000000]:KeyError:(100000000,)
3625    >>> Testing NumberToLong using vim.buffers[%s]
3626    vim.buffers[[]]:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
3627    vim.buffers[None]:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
3628    vim.buffers[-1]:ValueError:('number must be greater than zero',)
3629    vim.buffers[0]:ValueError:('number must be greater than zero',)
3630    <<< Finished
3631    > Current
3632    >> CurrentGetattr
3633    vim.current.xxx:AttributeError:('xxx',)
3634    >> CurrentSetattr
3635    vim.current.line = True:TypeError:('bad argument type for built-in operation',)
3636    vim.current.buffer = True:TypeError:('expected vim.Buffer object, but got bool',)
3637    vim.current.window = True:TypeError:('expected vim.Window object, but got bool',)
3638    vim.current.tabpage = True:TypeError:('expected vim.TabPage object, but got bool',)
3639    vim.current.xxx = True:AttributeError:('xxx',)
3640  END
3641
3642  call assert_equal(expected, getline(2, '$'))
3643  close!
3644endfunc
3645
3646" Test import
3647func Test_python_import()
3648  new
3649  py cb = vim.current.buffer
3650
3651  py << trim EOF
3652    sys.path.insert(0, os.path.join(os.getcwd(), 'python_before'))
3653    sys.path.append(os.path.join(os.getcwd(), 'python_after'))
3654    vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\')
3655    l = []
3656    def callback(path):
3657        l.append(path[-len('/testdir'):].replace(os.path.sep, '/'))
3658    vim.foreach_rtp(callback)
3659    cb.append(repr(l))
3660    del l
3661    def callback(path):
3662        return path[-len('/testdir'):].replace(os.path.sep, '/')
3663    cb.append(repr(vim.foreach_rtp(callback)))
3664    del callback
3665    from module import dir as d
3666    from modulex import ddir
3667    cb.append(d + ',' + ddir)
3668    import before
3669    cb.append(before.dir)
3670    import after
3671    cb.append(after.dir)
3672    import topmodule as tm
3673    import topmodule.submodule as tms
3674    import topmodule.submodule.subsubmodule.subsubsubmodule as tmsss
3675    cb.append(tm.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/__init__.py'):])
3676    cb.append(tms.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/__init__.py'):])
3677    cb.append(tmsss.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/subsubmodule/subsubsubmodule.py'):])
3678
3679    del before
3680    del after
3681    del d
3682    del ddir
3683    del tm
3684    del tms
3685    del tmsss
3686  EOF
3687
3688  let expected =<< trim END
3689    ['/testdir']
3690    '/testdir'
3691    2,xx
3692    before
3693    after
3694    pythonx/topmodule/__init__.py
3695    pythonx/topmodule/submodule/__init__.py
3696    pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py
3697  END
3698  call assert_equal(expected, getline(2, '$'))
3699  close!
3700
3701  " Try to import a non-existing module with a dot (.)
3702  call AssertException(['py import a.b.c'], 'ImportError:')
3703endfunc
3704
3705" Test exceptions
3706func Test_python_exception()
3707  func Exe(e)
3708    execute a:e
3709  endfunc
3710
3711  new
3712  py cb = vim.current.buffer
3713
3714  py << trim EOF
3715    Exe = vim.bindeval('function("Exe")')
3716    ee('vim.command("throw \'abcN\'")')
3717    ee('Exe("throw \'def\'")')
3718    ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
3719    ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
3720    ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
3721    ee('vim.eval("xxx_unknown_function_xxx()")')
3722    ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
3723    del Exe
3724  EOF
3725  delfunction Exe
3726
3727  let expected =<< trim END
3728    vim.command("throw 'abcN'"):error:('abcN',)
3729    Exe("throw 'def'"):error:('def',)
3730    vim.eval("Exe('throw ''ghi''')"):error:('ghi',)
3731    vim.eval("Exe('echoerr ''jkl''')"):error:('Vim(echoerr):jkl',)
3732    vim.eval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)
3733    vim.eval("xxx_unknown_function_xxx()"):error:('Vim:E117: Unknown function: xxx_unknown_function_xxx',)
3734    vim.bindeval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)
3735  END
3736  call assert_equal(expected, getline(2, '$'))
3737  close!
3738endfunc
3739
3740" Regression: interrupting vim.command propagates to next vim.command
3741func Test_python_keyboard_interrupt()
3742  new
3743  py cb = vim.current.buffer
3744  py << trim EOF
3745    def test_keyboard_interrupt():
3746        try:
3747            vim.command('while 1 | endwhile')
3748        except KeyboardInterrupt:
3749            cb.append('Caught KeyboardInterrupt')
3750        except Exception:
3751            cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
3752        else:
3753            cb.append('!!!!!!!! No exception')
3754        try:
3755            vim.command('$ put =\'Running :put\'')
3756        except KeyboardInterrupt:
3757            cb.append('!!!!!!!! Caught KeyboardInterrupt')
3758        except Exception:
3759            cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
3760        else:
3761            cb.append('No exception')
3762  EOF
3763
3764  debuggreedy
3765  call inputsave()
3766  call feedkeys("s\ns\ns\ns\nq\n")
3767  redir => output
3768  debug silent! py test_keyboard_interrupt()
3769  redir END
3770  0 debuggreedy
3771  call inputrestore()
3772  py del test_keyboard_interrupt
3773
3774  let expected =<< trim END
3775    Caught KeyboardInterrupt
3776    Running :put
3777    No exception
3778  END
3779  call assert_equal(expected, getline(2, '$'))
3780  call assert_equal('', output)
3781  close!
3782endfunc
3783
3784func Test_python_non_utf8_string()
3785  smap <Esc>@ <A-@>
3786  python vim.command('redir => _tmp_smaps | smap | redir END')
3787  python vim.eval('_tmp_smaps').splitlines()
3788  sunmap <Esc>@
3789endfunc
3790
3791" vim: shiftwidth=2 sts=2 expandtab
3792