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