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