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