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