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