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