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