xref: /vim-8.2.3635/src/testdir/test_python2.vim (revision 611728f8)
1a58883b4SBram Moolenaar" Test for python 2 commands.
2a58883b4SBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4b46fecd3SBram MoolenaarCheckFeature python
592fdd1e7SBram MoolenaarCheckFeature quickfix
6ab589463SBram Moolenaarsource shared.vim
792fdd1e7SBram Moolenaar
892fdd1e7SBram Moolenaar" NOTE: This will cause errors when run under valgrind.
992fdd1e7SBram Moolenaar" This would require recompiling Python with:
1092fdd1e7SBram Moolenaar"   ./configure --without-pymalloc
1192fdd1e7SBram Moolenaar" See http://svn.python.org/view/python/trunk/Misc/README.valgrind?view=markup
1292fdd1e7SBram Moolenaar"
1392fdd1e7SBram Moolenaar
1492fdd1e7SBram Moolenaar" This function should be called first. This sets up python functions used by
1592fdd1e7SBram Moolenaar" the other tests.
1692fdd1e7SBram Moolenaarfunc Test_AAA_python_setup()
1792fdd1e7SBram Moolenaar  py << trim EOF
1892fdd1e7SBram Moolenaar    import vim
1992fdd1e7SBram Moolenaar    import sys
2092fdd1e7SBram Moolenaar
2192fdd1e7SBram Moolenaar    def emsg(ei):
2292fdd1e7SBram Moolenaar      return ei[0].__name__ + ':' + repr(ei[1].args)
2392fdd1e7SBram Moolenaar
2492fdd1e7SBram Moolenaar    def ee(expr, g=globals(), l=locals()):
2592fdd1e7SBram Moolenaar      try:
2692fdd1e7SBram Moolenaar        exec(expr, g, l)
2792fdd1e7SBram Moolenaar      except:
2892fdd1e7SBram Moolenaar        ei = sys.exc_info()
2992fdd1e7SBram Moolenaar        msg = emsg(ei)
3092fdd1e7SBram Moolenaar        msg = msg.replace('TypeError:(\'argument 1 ', 'TypeError:(\'')
3192fdd1e7SBram Moolenaar        if expr.find('None') > -1:
3292fdd1e7SBram Moolenaar          msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
3392fdd1e7SBram Moolenaar                        'TypeError:("\'NoneType\' object is not iterable",)')
3492fdd1e7SBram Moolenaar        if expr.find('FailingNumber') > -1:
3592fdd1e7SBram Moolenaar          msg = msg.replace(', not \'FailingNumber\'', '').replace('"', '\'')
3692fdd1e7SBram Moolenaar          msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
3792fdd1e7SBram Moolenaar                    'TypeError:("\'FailingNumber\' object is not iterable",)')
3892fdd1e7SBram Moolenaar        if msg.find('(\'\'') > -1 or msg.find('(\'can\'t') > -1:
3992fdd1e7SBram Moolenaar          msg = msg.replace('(\'', '("').replace('\',)', '",)')
4092fdd1e7SBram Moolenaar        # Some Python versions say can't, others cannot.
4192fdd1e7SBram Moolenaar        if msg.find('can\'t') > -1:
4292fdd1e7SBram Moolenaar          msg = msg.replace('can\'t', 'cannot')
4392fdd1e7SBram Moolenaar        # Some Python versions use single quote, some double quote
4492fdd1e7SBram Moolenaar        if msg.find('"cannot ') > -1:
4592fdd1e7SBram Moolenaar          msg = msg.replace('"cannot ', '\'cannot ')
4692fdd1e7SBram Moolenaar        if msg.find(' attributes"') > -1:
4792fdd1e7SBram Moolenaar          msg = msg.replace(' attributes"', ' attributes\'')
4892fdd1e7SBram Moolenaar        if expr == 'fd(self=[])':
4992fdd1e7SBram Moolenaar          # HACK: PyMapping_Check changed meaning
5092fdd1e7SBram Moolenaar          msg = msg.replace('AttributeError:(\'keys\',)',
5192fdd1e7SBram Moolenaar                  'TypeError:(\'unable to convert list to vim dictionary\',)')
5292fdd1e7SBram Moolenaar        vim.current.buffer.append(expr + ':' + msg)
5392fdd1e7SBram Moolenaar      else:
5492fdd1e7SBram Moolenaar        vim.current.buffer.append(expr + ':NOT FAILED')
5592fdd1e7SBram Moolenaar  EOF
5692fdd1e7SBram Moolenaarendfunc
57a58883b4SBram Moolenaar
58a58883b4SBram Moolenaarfunc Test_pydo()
59ab589463SBram Moolenaar  " Check deleting lines does not trigger an ml_get error.
60a58883b4SBram Moolenaar  new
61a58883b4SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
62a58883b4SBram Moolenaar  pydo vim.command("%d_")
63a58883b4SBram Moolenaar  bwipe!
64a58883b4SBram Moolenaar
65ab589463SBram Moolenaar  " Check switching to another buffer does not trigger an ml_get error.
66a58883b4SBram Moolenaar  new
67a58883b4SBram Moolenaar  let wincount = winnr('$')
68a58883b4SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
69a58883b4SBram Moolenaar  pydo vim.command("new")
70a58883b4SBram Moolenaar  call assert_equal(wincount + 1, winnr('$'))
71a58883b4SBram Moolenaar  bwipe!
72a58883b4SBram Moolenaar  bwipe!
73ab589463SBram Moolenaar
74ab589463SBram Moolenaar  " Try modifying a buffer with 'nomodifiable' set
75ab589463SBram Moolenaar  set nomodifiable
769b7bf9e9SBram Moolenaar  call assert_fails('pydo toupper(line)', 'E21:')
77ab589463SBram Moolenaar  set modifiable
78ab589463SBram Moolenaar
79ab589463SBram Moolenaar  " Invalid command
80ab589463SBram Moolenaar  call AssertException(['pydo non_existing_cmd'],
81ab589463SBram Moolenaar        \ "Vim(pydo):NameError: global name 'non_existing_cmd' is not defined")
82ab589463SBram Moolenaar  call AssertException(["pydo raise Exception('test')"],
83ab589463SBram Moolenaar        \ 'Vim(pydo):Exception: test')
84ab589463SBram Moolenaar  call AssertException(["pydo {lambda}"],
85ab589463SBram Moolenaar        \ 'Vim(pydo):SyntaxError: invalid syntax')
86a58883b4SBram Moolenaarendfunc
8753901442SBram Moolenaar
8853901442SBram Moolenaarfunc Test_set_cursor()
8953901442SBram Moolenaar  " Check that setting the cursor position works.
9053901442SBram Moolenaar  new
9153901442SBram Moolenaar  call setline(1, ['first line', 'second line'])
9253901442SBram Moolenaar  normal gg
9353901442SBram Moolenaar  pydo vim.current.window.cursor = (1, 5)
9453901442SBram Moolenaar  call assert_equal([1, 6], [line('.'), col('.')])
9553901442SBram Moolenaar
9653901442SBram Moolenaar  " Check that movement after setting cursor position keeps current column.
9753901442SBram Moolenaar  normal j
9853901442SBram Moolenaar  call assert_equal([2, 6], [line('.'), col('.')])
9953901442SBram Moolenaarendfunc
1009123c0b3SBram Moolenaar
1019123c0b3SBram Moolenaarfunc Test_vim_function()
1029123c0b3SBram Moolenaar  " Check creating vim.Function object
1039123c0b3SBram Moolenaar
1049123c0b3SBram Moolenaar  func s:foo()
1059123c0b3SBram Moolenaar    return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
1069123c0b3SBram Moolenaar  endfunc
1079123c0b3SBram Moolenaar  let name = '<SNR>' . s:foo()
1089123c0b3SBram Moolenaar
1099123c0b3SBram Moolenaar  try
1109123c0b3SBram Moolenaar    py f = vim.bindeval('function("s:foo")')
1119123c0b3SBram Moolenaar    call assert_equal(name, pyeval('f.name'))
1129123c0b3SBram Moolenaar  catch
1139123c0b3SBram Moolenaar    call assert_false(v:exception)
1149123c0b3SBram Moolenaar  endtry
1159123c0b3SBram Moolenaar
1169123c0b3SBram Moolenaar  try
1179123c0b3SBram Moolenaar    py f = vim.Function('\x80\xfdR' + vim.eval('s:foo()'))
1183f4f3d8eSBram Moolenaar    call assert_equal(name, 'f.name'->pyeval())
1199123c0b3SBram Moolenaar  catch
1209123c0b3SBram Moolenaar    call assert_false(v:exception)
1219123c0b3SBram Moolenaar  endtry
1229123c0b3SBram Moolenaar
123ab589463SBram Moolenaar  " Non-existing function attribute
124ab589463SBram Moolenaar  call AssertException(["let x = pyeval('f.abc')"],
125ab589463SBram Moolenaar        \ 'Vim(let):AttributeError: abc')
12692fdd1e7SBram Moolenaar
1279123c0b3SBram Moolenaar  py del f
1289123c0b3SBram Moolenaar  delfunc s:foo
1299123c0b3SBram Moolenaarendfunc
13014816ad6SBram Moolenaar
13114816ad6SBram Moolenaarfunc Test_skipped_python_command_does_not_affect_pyxversion()
13214816ad6SBram Moolenaar  set pyxversion=0
13314816ad6SBram Moolenaar  if 0
13414816ad6SBram Moolenaar    python import vim
13514816ad6SBram Moolenaar  endif
13614816ad6SBram Moolenaar  call assert_equal(0, &pyxversion)  " This assertion would have failed with Vim 8.0.0251. (pyxversion was introduced in 8.0.0251.)
13714816ad6SBram Moolenaarendfunc
13863dbfd33SBram Moolenaar
13963dbfd33SBram Moolenaarfunc _SetUpHiddenBuffer()
14063dbfd33SBram Moolenaar  new
14163dbfd33SBram Moolenaar  edit hidden
14263dbfd33SBram Moolenaar  setlocal bufhidden=hide
14363dbfd33SBram Moolenaar
14463dbfd33SBram Moolenaar  enew
14563dbfd33SBram Moolenaar  let lnum = 0
14663dbfd33SBram Moolenaar  while lnum < 10
14763dbfd33SBram Moolenaar    call append( 1, string( lnum ) )
14863dbfd33SBram Moolenaar    let lnum = lnum + 1
14963dbfd33SBram Moolenaar  endwhile
15063dbfd33SBram Moolenaar  normal G
15163dbfd33SBram Moolenaar
15263dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 11 )
15363dbfd33SBram Moolenaarendfunc
15463dbfd33SBram Moolenaar
155bfd36036SBram Moolenaarfunc _CleanUpHiddenBuffer()
156bfd36036SBram Moolenaar  bwipe! hidden
157bfd36036SBram Moolenaar  bwipe!
158bfd36036SBram Moolenaarendfunc
159bfd36036SBram Moolenaar
16063dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Clear()
16163dbfd33SBram Moolenaar  call _SetUpHiddenBuffer()
16263dbfd33SBram Moolenaar  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = None
16363dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 11 )
164bfd36036SBram Moolenaar  call _CleanUpHiddenBuffer()
16563dbfd33SBram Moolenaarendfunc
16663dbfd33SBram Moolenaar
16763dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_List()
16863dbfd33SBram Moolenaar  call _SetUpHiddenBuffer()
16963dbfd33SBram Moolenaar  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = [ 'test' ]
17063dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 11 )
171bfd36036SBram Moolenaar  call _CleanUpHiddenBuffer()
17263dbfd33SBram Moolenaarendfunc
17363dbfd33SBram Moolenaar
17463dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Str()
17563dbfd33SBram Moolenaar  call _SetUpHiddenBuffer()
17663dbfd33SBram Moolenaar  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = 'test'
17763dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 11 )
178bfd36036SBram Moolenaar  call _CleanUpHiddenBuffer()
17963dbfd33SBram Moolenaarendfunc
18063dbfd33SBram Moolenaar
18163dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_ClearLine()
18263dbfd33SBram Moolenaar  call _SetUpHiddenBuffer()
18363dbfd33SBram Moolenaar  py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = None
18463dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 11 )
185bfd36036SBram Moolenaar  call _CleanUpHiddenBuffer()
18663dbfd33SBram Moolenaarendfunc
18763dbfd33SBram Moolenaar
18863dbfd33SBram Moolenaarfunc _SetUpVisibleBuffer()
18963dbfd33SBram Moolenaar  new
19063dbfd33SBram Moolenaar  let lnum = 0
19163dbfd33SBram Moolenaar  while lnum < 10
19263dbfd33SBram Moolenaar    call append( 1, string( lnum ) )
19363dbfd33SBram Moolenaar    let lnum = lnum + 1
19463dbfd33SBram Moolenaar  endwhile
19563dbfd33SBram Moolenaar  normal G
19663dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 11 )
19763dbfd33SBram Moolenaarendfunc
19863dbfd33SBram Moolenaar
19963dbfd33SBram Moolenaarfunc Test_Write_To_Current_Buffer_Fixes_Cursor_Clear()
20063dbfd33SBram Moolenaar  call _SetUpVisibleBuffer()
20163dbfd33SBram Moolenaar
20263dbfd33SBram Moolenaar  py vim.current.buffer[:] = None
20363dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 1 )
20463dbfd33SBram Moolenaar
20563dbfd33SBram Moolenaar  bwipe!
20663dbfd33SBram Moolenaarendfunc
20763dbfd33SBram Moolenaar
20863dbfd33SBram Moolenaarfunc Test_Write_To_Current_Buffer_Fixes_Cursor_List()
20963dbfd33SBram Moolenaar  call _SetUpVisibleBuffer()
21063dbfd33SBram Moolenaar
21163dbfd33SBram Moolenaar  py vim.current.buffer[:] = [ 'test' ]
21263dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 1 )
21363dbfd33SBram Moolenaar
21463dbfd33SBram Moolenaar  bwipe!
21592fdd1e7SBram Moolenaarendfunc
21663dbfd33SBram Moolenaar
21763dbfd33SBram Moolenaarfunc Test_Write_To_Current_Buffer_Fixes_Cursor_Str()
21863dbfd33SBram Moolenaar  call _SetUpVisibleBuffer()
21963dbfd33SBram Moolenaar
22063dbfd33SBram Moolenaar  py vim.current.buffer[-1] = None
22163dbfd33SBram Moolenaar  call assert_equal( line( '.' ), 10 )
22263dbfd33SBram Moolenaar
22363dbfd33SBram Moolenaar  bwipe!
22492fdd1e7SBram Moolenaarendfunc
2257f3a2849SBram Moolenaar
2267f3a2849SBram Moolenaarfunc Test_Catch_Exception_Message()
2277f3a2849SBram Moolenaar  try
2287f3a2849SBram Moolenaar    py raise RuntimeError( 'TEST' )
2297f3a2849SBram Moolenaar  catch /.*/
2307f3a2849SBram Moolenaar    call assert_match( '^Vim(.*):RuntimeError: TEST$', v:exception )
2317f3a2849SBram Moolenaar  endtry
2327f3a2849SBram Moolenaarendfunc
2336c2b7b80SBram Moolenaar
2346c2b7b80SBram Moolenaar" Test for various heredoc syntax
2356c2b7b80SBram Moolenaarfunc Test_python_heredoc()
2366c2b7b80SBram Moolenaar  python << END
2376c2b7b80SBram Moolenaars='A'
2386c2b7b80SBram MoolenaarEND
2396c2b7b80SBram Moolenaar  python <<
2406c2b7b80SBram Moolenaars+='B'
2416c2b7b80SBram Moolenaar.
2426c2b7b80SBram Moolenaar  python << trim END
2436c2b7b80SBram Moolenaar    s+='C'
2446c2b7b80SBram Moolenaar  END
2456c2b7b80SBram Moolenaar  python << trim
2466c2b7b80SBram Moolenaar    s+='D'
2476c2b7b80SBram Moolenaar  .
2486ab0953fSBram Moolenaar  python << trim eof
2496ab0953fSBram Moolenaar    s+='E'
2506ab0953fSBram Moolenaar  eof
2516ab0953fSBram Moolenaar  call assert_equal('ABCDE', pyxeval('s'))
2526c2b7b80SBram Moolenaarendfunc
2536c2b7b80SBram Moolenaar
25492fdd1e7SBram Moolenaar" Test for the buffer range object
25592fdd1e7SBram Moolenaarfunc Test_python_range()
25692fdd1e7SBram Moolenaar  new
25792fdd1e7SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
25892fdd1e7SBram Moolenaar  py b = vim.current.buffer
25992fdd1e7SBram Moolenaar  py r = b.range(1, 3)
26092fdd1e7SBram Moolenaar  call assert_equal(0, pyeval('r.start'))
26192fdd1e7SBram Moolenaar  call assert_equal(2, pyeval('r.end'))
262ab589463SBram Moolenaar  call assert_equal('one', pyeval('r[0]'))
263ab589463SBram Moolenaar  call assert_equal('one', pyeval('r[-3]'))
264ab589463SBram Moolenaar  call assert_equal('three', pyeval('r[-4]'))
26592fdd1e7SBram Moolenaar  call assert_equal(['two', 'three'], pyeval('r[1:]'))
26692fdd1e7SBram Moolenaar  py r[0] = 'green'
26792fdd1e7SBram Moolenaar  call assert_equal(['green', 'two', 'three'], getline(1, '$'))
26892fdd1e7SBram Moolenaar  py r[0:2] = ['red', 'blue']
26992fdd1e7SBram Moolenaar  call assert_equal(['red', 'blue', 'three'], getline(1, '$'))
27092fdd1e7SBram Moolenaar  call assert_equal(['start', 'end', '__members__'], pyeval('r.__members__'))
27192fdd1e7SBram Moolenaar
272ab589463SBram Moolenaar  " try different invalid start/end index for the range slice
273ab589463SBram Moolenaar  %d
274ab589463SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
275ab589463SBram Moolenaar  py r[-10:1] = ["a"]
276ab589463SBram Moolenaar  py r[10:12] = ["b"]
277ab589463SBram Moolenaar  py r[-10:-9] = ["c"]
278ab589463SBram Moolenaar  py r[1:0] = ["d"]
279ab589463SBram Moolenaar  call assert_equal(['c', 'd', 'a', 'two', 'three', 'b'], getline(1, '$'))
280ab589463SBram Moolenaar
281bb790dccSBram Moolenaar  " The following code used to trigger an ml_get error
282bb790dccSBram Moolenaar  %d
283bb790dccSBram Moolenaar  let x = pyeval('r[:]')
284ab589463SBram Moolenaar
285ab589463SBram Moolenaar  " Non-existing range attribute
286ab589463SBram Moolenaar  call AssertException(["let x = pyeval('r.abc')"],
287ab589463SBram Moolenaar        \ 'Vim(let):AttributeError: abc')
28892fdd1e7SBram Moolenaar
28992fdd1e7SBram Moolenaar  close!
29092fdd1e7SBram Moolenaarendfunc
29192fdd1e7SBram Moolenaar
29292fdd1e7SBram Moolenaar" Test for the python tabpage object
29392fdd1e7SBram Moolenaarfunc Test_python_tabpage()
29492fdd1e7SBram Moolenaar  tabnew
29592fdd1e7SBram Moolenaar  py t = vim.tabpages[1]
296ab589463SBram Moolenaar  py wl = t.windows
29792fdd1e7SBram Moolenaar  tabclose
298ab589463SBram Moolenaar  " Accessing a closed tabpage
299ab589463SBram Moolenaar  call AssertException(["let n = pyeval('t.number')"],
300ab589463SBram Moolenaar        \ 'Vim(let):vim.error: attempt to refer to deleted tab page')
301ab589463SBram Moolenaar  call AssertException(["let n = pyeval('len(wl)')"],
302ab589463SBram Moolenaar        \ 'Vim(let):vim.error: attempt to refer to deleted tab page')
303ab589463SBram Moolenaar  call AssertException(["py w = wl[0]"],
304ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted tab page')
305ab589463SBram Moolenaar  call AssertException(["py vim.current.tabpage = t"],
306ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted tab page')
307ab589463SBram Moolenaar  call assert_match('<tabpage object (deleted)', pyeval('repr(t)'))
30892fdd1e7SBram Moolenaar  %bw!
30992fdd1e7SBram Moolenaarendfunc
31092fdd1e7SBram Moolenaar
31192fdd1e7SBram Moolenaar" Test for the python window object
31292fdd1e7SBram Moolenaarfunc Test_python_window()
313ab589463SBram Moolenaar  " Test for setting the window height
314ab589463SBram Moolenaar  10new
315ab589463SBram Moolenaar  py vim.current.window.height = 5
316ab589463SBram Moolenaar  call assert_equal(5, winheight(0))
317*611728f8SYegappan Lakshmanan  py vim.current.window.height = 3.2
318*611728f8SYegappan Lakshmanan  call assert_equal(3, winheight(0))
319ab589463SBram Moolenaar
320ab589463SBram Moolenaar  " Test for setting the window width
321ab589463SBram Moolenaar  10vnew
322ab589463SBram Moolenaar  py vim.current.window.width = 6
323ab589463SBram Moolenaar  call assert_equal(6, winwidth(0))
324ab589463SBram Moolenaar
325ab589463SBram Moolenaar  " Try accessing a closed window
32692fdd1e7SBram Moolenaar  py w = vim.current.window
327ab589463SBram Moolenaar  py wopts = w.options
32892fdd1e7SBram Moolenaar  close
329ab589463SBram Moolenaar  " Access the attributes of a closed window
330ab589463SBram Moolenaar  call AssertException(["let n = pyeval('w.number')"],
331ab589463SBram Moolenaar        \ 'Vim(let):vim.error: attempt to refer to deleted window')
332ab589463SBram Moolenaar  call AssertException(["py w.height = 5"],
333ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted window')
334ab589463SBram Moolenaar  call AssertException(["py vim.current.window = w"],
335ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted window')
336ab589463SBram Moolenaar  " Try to set one of the options of the closed window
337bb790dccSBram Moolenaar  " The following caused an ASAN failure
338bb790dccSBram Moolenaar  call AssertException(["py wopts['list'] = False"],
339bb790dccSBram Moolenaar        \ 'vim.error: attempt to refer to deleted window')
340ab589463SBram Moolenaar  call assert_match('<window object (deleted)', pyeval("repr(w)"))
341ab589463SBram Moolenaar  %bw!
34292fdd1e7SBram Moolenaarendfunc
34392fdd1e7SBram Moolenaar
34492fdd1e7SBram Moolenaar" Test for the python List object
34592fdd1e7SBram Moolenaarfunc Test_python_list()
34692fdd1e7SBram Moolenaar  let l = [1, 2]
34792fdd1e7SBram Moolenaar  py pl = vim.bindeval('l')
34892fdd1e7SBram Moolenaar  call assert_equal(['locked', '__members__'], pyeval('pl.__members__'))
34992fdd1e7SBram Moolenaar
350ab589463SBram Moolenaar  " Try to convert a null List
351ab589463SBram Moolenaar  call AssertException(["py t = vim.eval('test_null_list()')"],
352ab589463SBram Moolenaar        \ 'Vim(python):SystemError: error return without exception set')
353ab589463SBram Moolenaar
354ab589463SBram Moolenaar  " Try to convert a List with a null List item
355ab589463SBram Moolenaar  call AssertException(["py t = vim.eval('[test_null_list()]')"],
356ab589463SBram Moolenaar        \ 'Vim(python):SystemError: error return without exception set')
357ab589463SBram Moolenaar
35864ffa9b5SBram Moolenaar  " Try to bind a null List variable (works because an empty list is used)
359ab589463SBram Moolenaar  let cmds =<< trim END
360ab589463SBram Moolenaar    let l = test_null_list()
361ab589463SBram Moolenaar    py ll = vim.bindeval('l')
362ab589463SBram Moolenaar  END
36364ffa9b5SBram Moolenaar  call AssertException(cmds, '')
364ab589463SBram Moolenaar
36592fdd1e7SBram Moolenaar  let l = []
36692fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
36792fdd1e7SBram Moolenaar  py f = vim.bindeval('function("strlen")')
36892fdd1e7SBram Moolenaar  " Extending List directly with different types
36992fdd1e7SBram Moolenaar  py l.extend([1, "as'd", [1, 2, f, {'a': 1}]])
37092fdd1e7SBram Moolenaar  call assert_equal([1, "as'd", [1, 2, function("strlen"), {'a': 1}]], l)
37192fdd1e7SBram Moolenaar  call assert_equal([1, 2, function("strlen"), {'a': 1}], l[-1])
37292fdd1e7SBram Moolenaar  call assert_fails('echo l[-4]', 'E684:')
37392fdd1e7SBram Moolenaar
37492fdd1e7SBram Moolenaar  " List assignment
37592fdd1e7SBram Moolenaar  py l[0] = 0
37692fdd1e7SBram Moolenaar  call assert_equal([0, "as'd", [1, 2, function("strlen"), {'a': 1}]], l)
37792fdd1e7SBram Moolenaar  py l[-2] = f
37892fdd1e7SBram Moolenaar  call assert_equal([0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]], l)
379ab589463SBram Moolenaar
380ab589463SBram Moolenaar  " appending to a list
381ab589463SBram Moolenaar  let l = [1, 2]
382ab589463SBram Moolenaar  py ll = vim.bindeval('l')
383ab589463SBram Moolenaar  py ll[2] = 8
384ab589463SBram Moolenaar  call assert_equal([1, 2, 8], l)
385ab589463SBram Moolenaar
386ab589463SBram Moolenaar  " Using dict as an index
387ab589463SBram Moolenaar  call AssertException(['py ll[{}] = 10'],
388ab589463SBram Moolenaar        \ 'Vim(python):TypeError: index must be int or slice, not dict')
38992fdd1e7SBram Moolenaarendfunc
39092fdd1e7SBram Moolenaar
39192fdd1e7SBram Moolenaar" Test for the python Dict object
39292fdd1e7SBram Moolenaarfunc Test_python_dict()
39392fdd1e7SBram Moolenaar  let d = {}
39492fdd1e7SBram Moolenaar  py pd = vim.bindeval('d')
39592fdd1e7SBram Moolenaar  call assert_equal(['locked', 'scope', '__members__'],
39692fdd1e7SBram Moolenaar        \ pyeval('pd.__members__'))
397ab589463SBram Moolenaar
398ab589463SBram Moolenaar  " Try to convert a null Dict
399ab589463SBram Moolenaar  call AssertException(["py t = vim.eval('test_null_dict()')"],
400ab589463SBram Moolenaar        \ 'Vim(python):SystemError: error return without exception set')
401ab589463SBram Moolenaar
402ab589463SBram Moolenaar  " Try to convert a Dict with a null List value
403ab589463SBram Moolenaar  call AssertException(["py t = vim.eval(\"{'a' : test_null_list()}\")"],
404ab589463SBram Moolenaar        \ 'Vim(python):SystemError: error return without exception set')
405ab589463SBram Moolenaar
406ab589463SBram Moolenaar  " Try to convert a Dict with a null string key
407ab589463SBram Moolenaar  py t = vim.eval("{test_null_string() : 10}")
408ab589463SBram Moolenaar  call assert_fails("let d = pyeval('t')", 'E859:')
409ab589463SBram Moolenaar
410ab589463SBram Moolenaar  " Dict length
411ab589463SBram Moolenaar  let d = {'a' : 10, 'b' : 20}
412ab589463SBram Moolenaar  py d = vim.bindeval('d')
413ab589463SBram Moolenaar  call assert_equal(2, pyeval('len(d)'))
414ab589463SBram Moolenaar
415ab589463SBram Moolenaar  " Deleting an non-existing key
416ab589463SBram Moolenaar  call AssertException(["py del d['c']"], "Vim(python):KeyError: 'c'")
41792fdd1e7SBram Moolenaarendfunc
41892fdd1e7SBram Moolenaar
41992fdd1e7SBram Moolenaar" Extending Dictionary directly with different types
42092fdd1e7SBram Moolenaarfunc Test_python_dict_extend()
42192fdd1e7SBram Moolenaar  let d = {}
42292fdd1e7SBram Moolenaar  func d.f()
42392fdd1e7SBram Moolenaar    return 1
42492fdd1e7SBram Moolenaar  endfunc
42592fdd1e7SBram Moolenaar
42692fdd1e7SBram Moolenaar  py f = vim.bindeval('function("strlen")')
42792fdd1e7SBram Moolenaar  py << trim EOF
42892fdd1e7SBram Moolenaar    d = vim.bindeval('d')
42992fdd1e7SBram Moolenaar    d['1'] = 'asd'
43092fdd1e7SBram Moolenaar    d.update()  # Must not do anything, including throwing errors
43192fdd1e7SBram Moolenaar    d.update(b = [1, 2, f])
43292fdd1e7SBram Moolenaar    d.update((('-1', {'a': 1}),))
43392fdd1e7SBram Moolenaar    d.update({'0': -1})
43492fdd1e7SBram Moolenaar    dk = d.keys()
43592fdd1e7SBram Moolenaar    dv = d.values()
43692fdd1e7SBram Moolenaar    di = d.items()
43792fdd1e7SBram Moolenaar    cmpfun = lambda a, b: cmp(repr(a), repr(b))
43892fdd1e7SBram Moolenaar    dk.sort(cmpfun)
43992fdd1e7SBram Moolenaar    dv.sort(cmpfun)
44092fdd1e7SBram Moolenaar    di.sort(cmpfun)
44192fdd1e7SBram Moolenaar  EOF
44292fdd1e7SBram Moolenaar
443ab589463SBram Moolenaar  " Try extending a locked dictionary
444ab589463SBram Moolenaar  lockvar d
445ab589463SBram Moolenaar  call AssertException(["py d.update({'b' : 20})"],
446ab589463SBram Moolenaar        \ 'Vim(python):vim.error: dictionary is locked')
447ab589463SBram Moolenaar  unlockvar d
448ab589463SBram Moolenaar
44992fdd1e7SBram Moolenaar  call assert_equal(1, pyeval("d['f'](self={})"))
45092fdd1e7SBram Moolenaar  call assert_equal("['-1', '0', '1', 'b', 'f']", pyeval('repr(dk)'))
45192fdd1e7SBram Moolenaar  call assert_equal("['asd', -1L, <vim.Function '1'>, <vim.dictionary object at >, <vim.list object at >]", substitute(pyeval('repr(dv)'),'0x\x\+','','g'))
45292fdd1e7SBram Moolenaar  call assert_equal("[('-1', <vim.dictionary object at >), ('0', -1L), ('1', 'asd'), ('b', <vim.list object at >), ('f', <vim.Function '1'>)]", substitute(pyeval('repr(di)'),'0x\x\+','','g'))
45392fdd1e7SBram Moolenaar  call assert_equal(['0', '1', 'b', 'f', '-1'], keys(d))
45492fdd1e7SBram Moolenaar  call assert_equal("[-1, 'asd', [1, 2, function('strlen')], function('1'), {'a': 1}]", string(values(d)))
45592fdd1e7SBram Moolenaar  py del dk
45692fdd1e7SBram Moolenaar  py del di
45792fdd1e7SBram Moolenaar  py del dv
45892fdd1e7SBram Moolenaarendfunc
45992fdd1e7SBram Moolenaar
46092fdd1e7SBram Moolenaarfunc Test_python_list_del_items()
46192fdd1e7SBram Moolenaar  " removing items with del
46292fdd1e7SBram Moolenaar  let l = [0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]]
46392fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
46492fdd1e7SBram Moolenaar  py del l[2]
46592fdd1e7SBram Moolenaar  call assert_equal("[0, function('strlen')]", string(l))
46692fdd1e7SBram Moolenaar
46792fdd1e7SBram Moolenaar  let l = range(8)
46892fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
46992fdd1e7SBram Moolenaar  py del l[:3]
47092fdd1e7SBram Moolenaar  py del l[1:]
47192fdd1e7SBram Moolenaar  call assert_equal([3], l)
47292fdd1e7SBram Moolenaar
47392fdd1e7SBram Moolenaar  " removing items out of range: silently skip items that don't exist
47492fdd1e7SBram Moolenaar
47592fdd1e7SBram Moolenaar  " The following two ranges delete nothing as they match empty list:
47692fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
47792fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
47892fdd1e7SBram Moolenaar  py del l[2:1]
47992fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3], l)
48092fdd1e7SBram Moolenaar  py del l[2:2]
48192fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3], l)
48292fdd1e7SBram Moolenaar  py del l[2:3]
48392fdd1e7SBram Moolenaar  call assert_equal([0, 1, 3], l)
48492fdd1e7SBram Moolenaar
48592fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
48692fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
48792fdd1e7SBram Moolenaar  py del l[2:4]
48892fdd1e7SBram Moolenaar  call assert_equal([0, 1], l)
48992fdd1e7SBram Moolenaar
49092fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
49192fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
49292fdd1e7SBram Moolenaar  py del l[2:5]
49392fdd1e7SBram Moolenaar  call assert_equal([0, 1], l)
49492fdd1e7SBram Moolenaar
49592fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
49692fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
49792fdd1e7SBram Moolenaar  py del l[2:6]
49892fdd1e7SBram Moolenaar  call assert_equal([0, 1], l)
49992fdd1e7SBram Moolenaar
50092fdd1e7SBram Moolenaar  " The following two ranges delete nothing as they match empty list:
50192fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
50292fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
50392fdd1e7SBram Moolenaar  py del l[-1:2]
50492fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3], l)
50592fdd1e7SBram Moolenaar  py del l[-2:2]
50692fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3], l)
50792fdd1e7SBram Moolenaar  py del l[-3:2]
50892fdd1e7SBram Moolenaar  call assert_equal([0, 2, 3], l)
50992fdd1e7SBram Moolenaar
51092fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
51192fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
51292fdd1e7SBram Moolenaar  py del l[-4:2]
51392fdd1e7SBram Moolenaar  call assert_equal([2, 3], l)
51492fdd1e7SBram Moolenaar
51592fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
51692fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
51792fdd1e7SBram Moolenaar  py del l[-5:2]
51892fdd1e7SBram Moolenaar  call assert_equal([2, 3], l)
51992fdd1e7SBram Moolenaar
52092fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
52192fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
52292fdd1e7SBram Moolenaar  py del l[-6:2]
52392fdd1e7SBram Moolenaar  call assert_equal([2, 3], l)
52492fdd1e7SBram Moolenaar
52592fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
52692fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
52792fdd1e7SBram Moolenaar  py del l[::2]
52892fdd1e7SBram Moolenaar  call assert_equal([1, 3], l)
52992fdd1e7SBram Moolenaar
53092fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
53192fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
53292fdd1e7SBram Moolenaar  py del l[3:0:-2]
53392fdd1e7SBram Moolenaar  call assert_equal([0, 2], l)
53492fdd1e7SBram Moolenaar
53592fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
53692fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
53792fdd1e7SBram Moolenaar  py del l[2:4:-2]
53892fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
53992fdd1e7SBram Moolenaarendfunc
54092fdd1e7SBram Moolenaar
54192fdd1e7SBram Moolenaarfunc Test_python_dict_del_items()
54292fdd1e7SBram Moolenaar  let d = eval("{'0' : -1, '1' : 'asd', 'b' : [1, 2, function('strlen')], 'f' : function('min'), '-1' : {'a': 1}}")
54392fdd1e7SBram Moolenaar  py d = vim.bindeval('d')
54492fdd1e7SBram Moolenaar  py del d['-1']
54592fdd1e7SBram Moolenaar  py del d['f']
54692fdd1e7SBram Moolenaar  call assert_equal([1, 2, function('strlen')], pyeval('d.get(''b'', 1)'))
54792fdd1e7SBram Moolenaar  call assert_equal([1, 2, function('strlen')], pyeval('d.pop(''b'')'))
54892fdd1e7SBram Moolenaar  call assert_equal(1, pyeval('d.get(''b'', 1)'))
54992fdd1e7SBram Moolenaar  call assert_equal('asd', pyeval('d.pop(''1'', 2)'))
55092fdd1e7SBram Moolenaar  call assert_equal(2, pyeval('d.pop(''1'', 2)'))
55192fdd1e7SBram Moolenaar  call assert_equal('True', pyeval('repr(d.has_key(''0''))'))
55292fdd1e7SBram Moolenaar  call assert_equal('False', pyeval('repr(d.has_key(''1''))'))
55392fdd1e7SBram Moolenaar  call assert_equal('True', pyeval('repr(''0'' in d)'))
55492fdd1e7SBram Moolenaar  call assert_equal('False', pyeval('repr(''1'' in d)'))
55592fdd1e7SBram Moolenaar  call assert_equal("['0']", pyeval('repr(list(iter(d)))'))
55692fdd1e7SBram Moolenaar  call assert_equal({'0' : -1}, d)
55792fdd1e7SBram Moolenaar  call assert_equal("('0', -1L)", pyeval('repr(d.popitem())'))
55892fdd1e7SBram Moolenaar  call assert_equal('None', pyeval('repr(d.get(''0''))'))
55992fdd1e7SBram Moolenaar  call assert_equal('[]', pyeval('repr(list(iter(d)))'))
56092fdd1e7SBram Moolenaarendfunc
56192fdd1e7SBram Moolenaar
56292fdd1e7SBram Moolenaar" Slice assignment to a list
56392fdd1e7SBram Moolenaarfunc Test_python_slice_assignment()
56492fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
56592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
56692fdd1e7SBram Moolenaar  py l[0:0] = ['a']
56792fdd1e7SBram Moolenaar  call assert_equal(['a', 0, 1, 2, 3], l)
56892fdd1e7SBram Moolenaar
56992fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
57092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
57192fdd1e7SBram Moolenaar  py l[1:2] = ['b']
57292fdd1e7SBram Moolenaar  call assert_equal([0, 'b', 2, 3], l)
57392fdd1e7SBram Moolenaar
57492fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
57592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
57692fdd1e7SBram Moolenaar  py l[2:4] = ['c']
57792fdd1e7SBram Moolenaar  call assert_equal([0, 1, 'c'], l)
57892fdd1e7SBram Moolenaar
57992fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
58092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
58192fdd1e7SBram Moolenaar  py l[4:4] = ['d']
58292fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 'd'], l)
58392fdd1e7SBram Moolenaar
58492fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
58592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
58692fdd1e7SBram Moolenaar  py l[-1:2] = ['e']
58792fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 'e', 3], l)
58892fdd1e7SBram Moolenaar
58992fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
59092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
59192fdd1e7SBram Moolenaar  py l[-10:2] = ['f']
59292fdd1e7SBram Moolenaar  call assert_equal(['f', 2, 3], l)
59392fdd1e7SBram Moolenaar
59492fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
59592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
59692fdd1e7SBram Moolenaar  py l[2:-10] = ['g']
59792fdd1e7SBram Moolenaar  call assert_equal([0, 1, 'g', 2, 3], l)
59892fdd1e7SBram Moolenaar
59992fdd1e7SBram Moolenaar  let l = []
60092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
60192fdd1e7SBram Moolenaar  py l[0:0] = ['h']
60292fdd1e7SBram Moolenaar  call assert_equal(['h'], l)
60392fdd1e7SBram Moolenaar
60492fdd1e7SBram Moolenaar  let l = range(8)
60592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
60692fdd1e7SBram Moolenaar  py l[2:6:2] = [10, 20]
60792fdd1e7SBram Moolenaar  call assert_equal([0, 1, 10, 3, 20, 5, 6, 7], l)
60892fdd1e7SBram Moolenaar
60992fdd1e7SBram Moolenaar  let l = range(8)
61092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
61192fdd1e7SBram Moolenaar  py l[6:2:-2] = [10, 20]
61292fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 20, 5, 10, 7], l)
61392fdd1e7SBram Moolenaar
61492fdd1e7SBram Moolenaar  let l = range(8)
61592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
61692fdd1e7SBram Moolenaar  py l[6:2] = ()
61792fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
61892fdd1e7SBram Moolenaar
61992fdd1e7SBram Moolenaar  let l = range(8)
62092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
62192fdd1e7SBram Moolenaar  py l[6:2:1] = ()
62292fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
62392fdd1e7SBram Moolenaar
62492fdd1e7SBram Moolenaar  let l = range(8)
62592fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
62692fdd1e7SBram Moolenaar  py l[2:2:1] = ()
62792fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
6280ab55d62SBram Moolenaar
6290ab55d62SBram Moolenaar  call AssertException(["py x = l[10:11:0]"],
6300ab55d62SBram Moolenaar        \ "Vim(python):ValueError: slice step cannot be zero")
63192fdd1e7SBram Moolenaarendfunc
63292fdd1e7SBram Moolenaar
63392fdd1e7SBram Moolenaar" Locked variables
63492fdd1e7SBram Moolenaarfunc Test_python_lockedvar()
63592fdd1e7SBram Moolenaar  new
63692fdd1e7SBram Moolenaar  py cb = vim.current.buffer
63792fdd1e7SBram Moolenaar  let l = [0, 1, 2, 3]
63892fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
63992fdd1e7SBram Moolenaar  lockvar! l
64092fdd1e7SBram Moolenaar  py << trim EOF
64192fdd1e7SBram Moolenaar    try:
64292fdd1e7SBram Moolenaar        l[2]='i'
64392fdd1e7SBram Moolenaar    except vim.error:
64492fdd1e7SBram Moolenaar        cb.append('l[2] threw vim.error: ' + emsg(sys.exc_info()))
64592fdd1e7SBram Moolenaar  EOF
64692fdd1e7SBram Moolenaar  call assert_equal(['', "l[2] threw vim.error: error:('list is locked',)"],
64792fdd1e7SBram Moolenaar        \ getline(1, '$'))
648ab589463SBram Moolenaar
649ab589463SBram Moolenaar  " Try to concatenate a locked list
650ab589463SBram Moolenaar  call AssertException(['py l += [4, 5]'],
651ab589463SBram Moolenaar        \ 'Vim(python):vim.error: list is locked')
652ab589463SBram Moolenaar
65392fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3], l)
65492fdd1e7SBram Moolenaar  unlockvar! l
65592fdd1e7SBram Moolenaar  close!
65692fdd1e7SBram Moolenaarendfunc
65792fdd1e7SBram Moolenaar
65892fdd1e7SBram Moolenaar" Test for calling a function
65992fdd1e7SBram Moolenaarfunc Test_python_function_call()
66092fdd1e7SBram Moolenaar  func New(...)
66192fdd1e7SBram Moolenaar    return ['NewStart'] + a:000 + ['NewEnd']
66292fdd1e7SBram Moolenaar  endfunc
66392fdd1e7SBram Moolenaar
66492fdd1e7SBram Moolenaar  func DictNew(...) dict
66592fdd1e7SBram Moolenaar    return ['DictNewStart'] + a:000 + ['DictNewEnd', self]
66692fdd1e7SBram Moolenaar  endfunc
66792fdd1e7SBram Moolenaar
66892fdd1e7SBram Moolenaar  new
66992fdd1e7SBram Moolenaar  let l = [function('New'), function('DictNew')]
67092fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
67192fdd1e7SBram Moolenaar  py l.extend(list(l[0](1, 2, 3)))
67292fdd1e7SBram Moolenaar  call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd'], l)
67392fdd1e7SBram Moolenaar  py l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
67492fdd1e7SBram Moolenaar  call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}], l)
67592fdd1e7SBram Moolenaar  py l.extend([l[0].name])
67692fdd1e7SBram Moolenaar  call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}, 'New'], l)
67792fdd1e7SBram Moolenaar  py ee('l[1](1, 2, 3)')
67892fdd1e7SBram Moolenaar  call assert_equal("l[1](1, 2, 3):error:('Vim:E725: Calling dict function without Dictionary: DictNew',)", getline(2))
67992fdd1e7SBram Moolenaar  %d
68092fdd1e7SBram Moolenaar  py f = l[0]
68192fdd1e7SBram Moolenaar  delfunction New
68292fdd1e7SBram Moolenaar  py ee('f(1, 2, 3)')
68392fdd1e7SBram Moolenaar  call assert_equal("f(1, 2, 3):error:('Vim:E117: Unknown function: New',)", getline(2))
68492fdd1e7SBram Moolenaar  close!
68592fdd1e7SBram Moolenaar  delfunction DictNew
68692fdd1e7SBram Moolenaarendfunc
68792fdd1e7SBram Moolenaar
68892fdd1e7SBram Moolenaarfunc Test_python_float()
68992fdd1e7SBram Moolenaar  CheckFeature float
69092fdd1e7SBram Moolenaar  let l = [0.0]
69192fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
69292fdd1e7SBram Moolenaar  py l.extend([0.0])
69392fdd1e7SBram Moolenaar  call assert_equal([0.0, 0.0], l)
69492fdd1e7SBram Moolenaarendfunc
69592fdd1e7SBram Moolenaar
69692fdd1e7SBram Moolenaar" Test for Dict key errors
69792fdd1e7SBram Moolenaarfunc Test_python_dict_key_error()
69892fdd1e7SBram Moolenaar  let messages = []
69992fdd1e7SBram Moolenaar  py << trim EOF
70092fdd1e7SBram Moolenaar    d = vim.bindeval('{}')
70192fdd1e7SBram Moolenaar    m = vim.bindeval('messages')
70292fdd1e7SBram Moolenaar    def em(expr, g=globals(), l=locals()):
70392fdd1e7SBram Moolenaar      try:
70492fdd1e7SBram Moolenaar        exec(expr, g, l)
70592fdd1e7SBram Moolenaar      except:
70692fdd1e7SBram Moolenaar        m.extend([sys.exc_type.__name__])
70792fdd1e7SBram Moolenaar
70892fdd1e7SBram Moolenaar    em('d["abc1"]')
70992fdd1e7SBram Moolenaar    em('d["abc1"]="\\0"')
71092fdd1e7SBram Moolenaar    em('d["abc1"]=vim')
71192fdd1e7SBram Moolenaar    em('d[""]=1')
71292fdd1e7SBram Moolenaar    em('d["a\\0b"]=1')
71392fdd1e7SBram Moolenaar    em('d[u"a\\0b"]=1')
71492fdd1e7SBram Moolenaar    em('d.pop("abc1")')
71592fdd1e7SBram Moolenaar    em('d.popitem()')
71692fdd1e7SBram Moolenaar    del em
71792fdd1e7SBram Moolenaar    del m
71892fdd1e7SBram Moolenaar  EOF
71992fdd1e7SBram Moolenaar
72092fdd1e7SBram Moolenaar  call assert_equal(['KeyError', 'TypeError', 'TypeError', 'ValueError',
72192fdd1e7SBram Moolenaar        \ 'TypeError', 'TypeError', 'KeyError', 'KeyError'], messages)
72292fdd1e7SBram Moolenaar  unlet messages
72392fdd1e7SBram Moolenaarendfunc
72492fdd1e7SBram Moolenaar
72592fdd1e7SBram Moolenaar" Test for locked and scope attributes
72692fdd1e7SBram Moolenaarfunc Test_python_lock_scope_attr()
72792fdd1e7SBram Moolenaar  let d = {} | let dl = {} | lockvar dl
72892fdd1e7SBram Moolenaar  let res = []
72992fdd1e7SBram Moolenaar  for s in split("d dl v: g:")
73092fdd1e7SBram Moolenaar    let name = tr(s, ':', 's')
73192fdd1e7SBram Moolenaar    execute 'py ' .. name .. ' = vim.bindeval("' .. s .. '")'
73292fdd1e7SBram Moolenaar    call add(res, s .. ' : ' .. join(map(['locked', 'scope'],
73392fdd1e7SBram Moolenaar          \ 'v:val .. ":" .. pyeval(name .. "." .. v:val)'), ';'))
73492fdd1e7SBram Moolenaar  endfor
73592fdd1e7SBram Moolenaar  call assert_equal(['d : locked:0;scope:0', 'dl : locked:1;scope:0',
73692fdd1e7SBram Moolenaar        \ 'v: : locked:2;scope:1', 'g: : locked:0;scope:2'], res)
73792fdd1e7SBram Moolenaar
73892fdd1e7SBram Moolenaar  silent! let d.abc2 = 1
73992fdd1e7SBram Moolenaar  silent! let dl.abc3 = 1
74092fdd1e7SBram Moolenaar  py d.locked = True
74192fdd1e7SBram Moolenaar  py dl.locked = False
74292fdd1e7SBram Moolenaar  silent! let d.def = 1
74392fdd1e7SBram Moolenaar  silent! let dl.def = 1
74492fdd1e7SBram Moolenaar  call assert_equal({'abc2': 1}, d)
74592fdd1e7SBram Moolenaar  call assert_equal({'def': 1}, dl)
74692fdd1e7SBram Moolenaar  unlet d dl
74792fdd1e7SBram Moolenaar
74892fdd1e7SBram Moolenaar  let l = [] | let ll = [] | lockvar ll
74992fdd1e7SBram Moolenaar  let res = []
75092fdd1e7SBram Moolenaar  for s in split("l ll")
75192fdd1e7SBram Moolenaar    let name = tr(s, ':', 's')
75292fdd1e7SBram Moolenaar    execute 'py ' .. name .. '=vim.bindeval("' .. s .. '")'
75392fdd1e7SBram Moolenaar    call add(res, s .. ' : locked:' .. pyeval(name .. '.locked'))
75492fdd1e7SBram Moolenaar  endfor
75592fdd1e7SBram Moolenaar  call assert_equal(['l : locked:0', 'll : locked:1'], res)
75692fdd1e7SBram Moolenaar
75792fdd1e7SBram Moolenaar  silent! call extend(l, [0])
75892fdd1e7SBram Moolenaar  silent! call extend(ll, [0])
75992fdd1e7SBram Moolenaar  py l.locked = True
76092fdd1e7SBram Moolenaar  py ll.locked = False
76192fdd1e7SBram Moolenaar  silent! call extend(l, [1])
76292fdd1e7SBram Moolenaar  silent! call extend(ll, [1])
76392fdd1e7SBram Moolenaar  call assert_equal([0], l)
76492fdd1e7SBram Moolenaar  call assert_equal([1], ll)
76592fdd1e7SBram Moolenaar  unlet l ll
766ab589463SBram Moolenaar
767ab589463SBram Moolenaar  " Try changing an attribute of a fixed list
768ab589463SBram Moolenaar  py a = vim.bindeval('v:argv')
769ab589463SBram Moolenaar  call AssertException(['py a.locked = 0'],
770ab589463SBram Moolenaar        \ 'Vim(python):TypeError: cannot modify fixed list')
77192fdd1e7SBram Moolenaarendfunc
77292fdd1e7SBram Moolenaar
77392fdd1e7SBram Moolenaar" Test for pyeval()
77492fdd1e7SBram Moolenaarfunc Test_python_pyeval()
77592fdd1e7SBram Moolenaar  let l = pyeval('range(3)')
77692fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2], l)
77792fdd1e7SBram Moolenaar
77892fdd1e7SBram Moolenaar  let d = pyeval('{"a": "b", "c": 1, "d": ["e"]}')
77992fdd1e7SBram Moolenaar  call assert_equal([['a', 'b'], ['c', 1], ['d', ['e']]], sort(items(d)))
78092fdd1e7SBram Moolenaar
78192fdd1e7SBram Moolenaar  let v:errmsg = ''
78292fdd1e7SBram Moolenaar  call assert_equal(v:none, pyeval('None'))
78392fdd1e7SBram Moolenaar  call assert_equal('', v:errmsg)
78492fdd1e7SBram Moolenaar
785ab589463SBram Moolenaar  py v = vim.eval('test_null_function()')
786ab589463SBram Moolenaar  call assert_equal(v:none, pyeval('v'))
787ab589463SBram Moolenaar
78892fdd1e7SBram Moolenaar  if has('float')
78992fdd1e7SBram Moolenaar    call assert_equal(0.0, pyeval('0.0'))
79092fdd1e7SBram Moolenaar  endif
79192fdd1e7SBram Moolenaar
792ab589463SBram Moolenaar  " Evaluate an invalid values
793ab589463SBram Moolenaar  call AssertException(['let v = pyeval(''"\0"'')'], 'E859:')
794ab589463SBram Moolenaar  call AssertException(['let v = pyeval(''{"\0" : 1}'')'], 'E859:')
795ab589463SBram Moolenaar  call AssertException(['let v = pyeval("undefined_name")'],
796ab589463SBram Moolenaar        \ "Vim(let):NameError: name 'undefined_name' is not defined")
797ab589463SBram Moolenaar  call AssertException(['let v = pyeval("vim")'], 'E859:')
798ab589463SBram Moolenaarendfunc
79992fdd1e7SBram Moolenaar
800ab589463SBram Moolenaar" Test for vim.bindeval()
801ab589463SBram Moolenaarfunc Test_python_vim_bindeval()
802ab589463SBram Moolenaar  " Float
803ab589463SBram Moolenaar  let f = 3.14
804ab589463SBram Moolenaar  py f = vim.bindeval('f')
805ab589463SBram Moolenaar  call assert_equal(3.14, pyeval('f'))
80692fdd1e7SBram Moolenaar
807ab589463SBram Moolenaar  " Blob
808ab589463SBram Moolenaar  let b = 0z12
809ab589463SBram Moolenaar  py b = vim.bindeval('b')
810ab589463SBram Moolenaar  call assert_equal("\x12", pyeval('b'))
81192fdd1e7SBram Moolenaar
812ab589463SBram Moolenaar  " Bool
813ab589463SBram Moolenaar  call assert_equal(1, pyeval("vim.bindeval('v:true')"))
814ab589463SBram Moolenaar  call assert_equal(0, pyeval("vim.bindeval('v:false')"))
815ab589463SBram Moolenaar  call assert_equal(v:none, pyeval("vim.bindeval('v:null')"))
816ab589463SBram Moolenaar  call assert_equal(v:none, pyeval("vim.bindeval('v:none')"))
8170ab55d62SBram Moolenaar
8180ab55d62SBram Moolenaar  " channel/job
81956c9fd01SDominique Pelle  if has('channel')
8200ab55d62SBram Moolenaar    call assert_equal(v:none, pyeval("vim.bindeval('test_null_channel()')"))
82156c9fd01SDominique Pelle  endif
82256c9fd01SDominique Pelle  if has('job')
8230ab55d62SBram Moolenaar    call assert_equal(v:none, pyeval("vim.bindeval('test_null_job()')"))
82456c9fd01SDominique Pelle  endif
82592fdd1e7SBram Moolenaarendfunc
82692fdd1e7SBram Moolenaar
82792fdd1e7SBram Moolenaar" threading
82892fdd1e7SBram Moolenaar" Running pydo command (Test_pydo) before this test, stops the python thread
82992fdd1e7SBram Moolenaar" from running. So this test should be run before the pydo test
83092fdd1e7SBram Moolenaarfunc Test_aaa_python_threading()
83192fdd1e7SBram Moolenaar  let l = [0]
83292fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
83392fdd1e7SBram Moolenaar  py << trim EOF
83492fdd1e7SBram Moolenaar    import threading
83592fdd1e7SBram Moolenaar    import time
83692fdd1e7SBram Moolenaar
83792fdd1e7SBram Moolenaar    class T(threading.Thread):
83892fdd1e7SBram Moolenaar      def __init__(self):
83992fdd1e7SBram Moolenaar        threading.Thread.__init__(self)
84092fdd1e7SBram Moolenaar        self.t = 0
84192fdd1e7SBram Moolenaar        self.running = True
84292fdd1e7SBram Moolenaar
84392fdd1e7SBram Moolenaar      def run(self):
84492fdd1e7SBram Moolenaar        while self.running:
84592fdd1e7SBram Moolenaar          self.t += 1
84692fdd1e7SBram Moolenaar          time.sleep(0.1)
84792fdd1e7SBram Moolenaar
84892fdd1e7SBram Moolenaar    t = T()
84992fdd1e7SBram Moolenaar    del T
85092fdd1e7SBram Moolenaar    t.start()
85192fdd1e7SBram Moolenaar  EOF
85292fdd1e7SBram Moolenaar
85392fdd1e7SBram Moolenaar  sleep 1
85492fdd1e7SBram Moolenaar  py t.running = False
85592fdd1e7SBram Moolenaar  py t.join()
85692fdd1e7SBram Moolenaar
85792fdd1e7SBram Moolenaar  " Check if the background thread is working.  Count should be 10, but on a
85892fdd1e7SBram Moolenaar  " busy system (AppVeyor) it can be much lower.
85992fdd1e7SBram Moolenaar  py l[0] = t.t > 4
86092fdd1e7SBram Moolenaar  py del time
86192fdd1e7SBram Moolenaar  py del threading
86292fdd1e7SBram Moolenaar  py del t
86392fdd1e7SBram Moolenaar  call assert_equal([1], l)
86492fdd1e7SBram Moolenaarendfunc
86592fdd1e7SBram Moolenaar
86692fdd1e7SBram Moolenaar" settrace
86792fdd1e7SBram Moolenaarfunc Test_python_settrace()
86892fdd1e7SBram Moolenaar  let l = []
86992fdd1e7SBram Moolenaar  py l = vim.bindeval('l')
87092fdd1e7SBram Moolenaar  py << trim EOF
87192fdd1e7SBram Moolenaar    import sys
87292fdd1e7SBram Moolenaar
87392fdd1e7SBram Moolenaar    def traceit(frame, event, arg):
87492fdd1e7SBram Moolenaar      global l
87592fdd1e7SBram Moolenaar      if event == "line":
87692fdd1e7SBram Moolenaar          l.extend([frame.f_lineno])
87792fdd1e7SBram Moolenaar      return traceit
87892fdd1e7SBram Moolenaar
87992fdd1e7SBram Moolenaar    def trace_main():
88092fdd1e7SBram Moolenaar      for i in range(5):
88192fdd1e7SBram Moolenaar        pass
88292fdd1e7SBram Moolenaar  EOF
88392fdd1e7SBram Moolenaar  py sys.settrace(traceit)
88492fdd1e7SBram Moolenaar  py trace_main()
88592fdd1e7SBram Moolenaar  py sys.settrace(None)
88692fdd1e7SBram Moolenaar  py del traceit
88792fdd1e7SBram Moolenaar  py del trace_main
88892fdd1e7SBram Moolenaar  call assert_equal([1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1], l)
88992fdd1e7SBram Moolenaarendfunc
89092fdd1e7SBram Moolenaar
89192fdd1e7SBram Moolenaar" Slice
89292fdd1e7SBram Moolenaarfunc Test_python_list_slice()
89392fdd1e7SBram Moolenaar  py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
89492fdd1e7SBram Moolenaar  py l = ll[:4]
89592fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3], pyeval('l'))
89692fdd1e7SBram Moolenaar  py l = ll[2:]
89792fdd1e7SBram Moolenaar  call assert_equal([2, 3, 4, 5], pyeval('l'))
89892fdd1e7SBram Moolenaar  py l = ll[:-4]
89992fdd1e7SBram Moolenaar  call assert_equal([0, 1], pyeval('l'))
90092fdd1e7SBram Moolenaar  py l = ll[-2:]
90192fdd1e7SBram Moolenaar  call assert_equal([4, 5], pyeval('l'))
90292fdd1e7SBram Moolenaar  py l = ll[2:4]
90392fdd1e7SBram Moolenaar  call assert_equal([2, 3], pyeval('l'))
90492fdd1e7SBram Moolenaar  py l = ll[4:2]
90592fdd1e7SBram Moolenaar  call assert_equal([], pyeval('l'))
90692fdd1e7SBram Moolenaar  py l = ll[-4:-2]
90792fdd1e7SBram Moolenaar  call assert_equal([2, 3], pyeval('l'))
90892fdd1e7SBram Moolenaar  py l = ll[-2:-4]
90992fdd1e7SBram Moolenaar  call assert_equal([], pyeval('l'))
91092fdd1e7SBram Moolenaar  py l = ll[:]
91192fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
91292fdd1e7SBram Moolenaar  py l = ll[0:6]
91392fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
91492fdd1e7SBram Moolenaar  py l = ll[-10:10]
91592fdd1e7SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
91692fdd1e7SBram Moolenaar  py l = ll[4:2:-1]
91792fdd1e7SBram Moolenaar  call assert_equal([4, 3], pyeval('l'))
91892fdd1e7SBram Moolenaar  py l = ll[::2]
91992fdd1e7SBram Moolenaar  call assert_equal([0, 2, 4], pyeval('l'))
92092fdd1e7SBram Moolenaar  py l = ll[4:2:1]
92192fdd1e7SBram Moolenaar  call assert_equal([], pyeval('l'))
922ab589463SBram Moolenaar
923ab589463SBram Moolenaar  " Error case: Use an invalid index
924ab589463SBram Moolenaar  call AssertException(['py ll[-10] = 5'], 'Vim(python):vim.error: internal error:')
925ab589463SBram Moolenaar
926ab589463SBram Moolenaar  " Use a step value of 0
927ab589463SBram Moolenaar  call AssertException(['py ll[0:3:0] = [1, 2, 3]'],
928ab589463SBram Moolenaar        \ 'Vim(python):ValueError: slice step cannot be zero')
929ab589463SBram Moolenaar
930ab589463SBram Moolenaar  " Error case: Invalid slice type
931ab589463SBram Moolenaar  call AssertException(["py x = ll['abc']"],
932ab589463SBram Moolenaar        \ 'Vim(python):TypeError: index must be int or slice, not str')
93392fdd1e7SBram Moolenaar  py del l
934ab589463SBram Moolenaar
935ab589463SBram Moolenaar  " Error case: List with a null list item
936ab589463SBram Moolenaar  let l = [test_null_list()]
937ab589463SBram Moolenaar  py ll = vim.bindeval('l')
938ab589463SBram Moolenaar  call AssertException(["py x = ll[:]"],
939ab589463SBram Moolenaar        \ 'Vim(python):SystemError: error return without exception set')
94092fdd1e7SBram Moolenaarendfunc
94192fdd1e7SBram Moolenaar
94292fdd1e7SBram Moolenaar" Vars
94392fdd1e7SBram Moolenaarfunc Test_python_vars()
94492fdd1e7SBram Moolenaar  let g:foo = 'bac'
94592fdd1e7SBram Moolenaar  let w:abc3 = 'def'
94692fdd1e7SBram Moolenaar  let b:baz = 'bar'
94792fdd1e7SBram Moolenaar  let t:bar = 'jkl'
94892fdd1e7SBram Moolenaar  try
94992fdd1e7SBram Moolenaar    throw "Abc"
95092fdd1e7SBram Moolenaar  catch /Abc/
95192fdd1e7SBram Moolenaar    call assert_equal('Abc', pyeval('vim.vvars[''exception'']'))
95292fdd1e7SBram Moolenaar  endtry
95392fdd1e7SBram Moolenaar  call assert_equal('bac', pyeval('vim.vars[''foo'']'))
95492fdd1e7SBram Moolenaar  call assert_equal('def', pyeval('vim.current.window.vars[''abc3'']'))
95592fdd1e7SBram Moolenaar  call assert_equal('bar', pyeval('vim.current.buffer.vars[''baz'']'))
95692fdd1e7SBram Moolenaar  call assert_equal('jkl', pyeval('vim.current.tabpage.vars[''bar'']'))
95792fdd1e7SBram Moolenaarendfunc
95892fdd1e7SBram Moolenaar
95992fdd1e7SBram Moolenaar" Options
96092fdd1e7SBram Moolenaar" paste:          boolean, global
96192fdd1e7SBram Moolenaar" previewheight   number,  global
96292fdd1e7SBram Moolenaar" operatorfunc:   string,  global
96392fdd1e7SBram Moolenaar" number:         boolean, window-local
96492fdd1e7SBram Moolenaar" numberwidth:    number,  window-local
96592fdd1e7SBram Moolenaar" colorcolumn:    string,  window-local
96692fdd1e7SBram Moolenaar" statusline:     string,  window-local/global
96792fdd1e7SBram Moolenaar" autoindent:     boolean, buffer-local
96892fdd1e7SBram Moolenaar" shiftwidth:     number,  buffer-local
96992fdd1e7SBram Moolenaar" omnifunc:       string,  buffer-local
97092fdd1e7SBram Moolenaar" preserveindent: boolean, buffer-local/global
97192fdd1e7SBram Moolenaar" path:           string,  buffer-local/global
97292fdd1e7SBram Moolenaarfunc Test_python_opts()
97392fdd1e7SBram Moolenaar  let g:res = []
97492fdd1e7SBram Moolenaar  let g:bufs = [bufnr('%')]
97592fdd1e7SBram Moolenaar  new
97692fdd1e7SBram Moolenaar  let g:bufs += [bufnr('%')]
97792fdd1e7SBram Moolenaar  vnew
97892fdd1e7SBram Moolenaar  let g:bufs += [bufnr('%')]
97992fdd1e7SBram Moolenaar  wincmd j
98092fdd1e7SBram Moolenaar  vnew
98192fdd1e7SBram Moolenaar  let g:bufs += [bufnr('%')]
98292fdd1e7SBram Moolenaar  wincmd l
98392fdd1e7SBram Moolenaar
98492fdd1e7SBram Moolenaar  func RecVars(opt)
98592fdd1e7SBram Moolenaar    let gval = string(eval('&g:' .. a:opt))
98692fdd1e7SBram Moolenaar    let wvals = join(map(range(1, 4),
98792fdd1e7SBram Moolenaar          \ 'v:val .. ":" .. string(getwinvar(v:val, "&" .. a:opt))'))
98892fdd1e7SBram Moolenaar    let bvals = join(map(copy(g:bufs),
98992fdd1e7SBram Moolenaar          \ 'v:val .. ":" .. string(getbufvar(v:val, "&" .. a:opt))'))
99092fdd1e7SBram Moolenaar    call add(g:res, '  G: ' .. gval)
99192fdd1e7SBram Moolenaar    call add(g:res, '  W: ' .. wvals)
99292fdd1e7SBram Moolenaar    call add(g:res, '  B: ' .. wvals)
99392fdd1e7SBram Moolenaar  endfunc
99492fdd1e7SBram Moolenaar
99592fdd1e7SBram Moolenaar  py << trim EOF
99692fdd1e7SBram Moolenaar    def e(s, g=globals(), l=locals()):
99792fdd1e7SBram Moolenaar      try:
99892fdd1e7SBram Moolenaar        exec(s, g, l)
99992fdd1e7SBram Moolenaar      except:
100092fdd1e7SBram Moolenaar        vim.command('return ' + repr(sys.exc_type.__name__))
100192fdd1e7SBram Moolenaar
100292fdd1e7SBram Moolenaar    def ev(s, g=globals(), l=locals()):
100392fdd1e7SBram Moolenaar      try:
100492fdd1e7SBram Moolenaar        return eval(s, g, l)
100592fdd1e7SBram Moolenaar      except:
100692fdd1e7SBram Moolenaar        vim.command('let exc=' + repr(sys.exc_type.__name__))
100792fdd1e7SBram Moolenaar        return 0
100892fdd1e7SBram Moolenaar  EOF
100992fdd1e7SBram Moolenaar
101092fdd1e7SBram Moolenaar  func E(s)
101192fdd1e7SBram Moolenaar    python e(vim.eval('a:s'))
101292fdd1e7SBram Moolenaar  endfunc
101392fdd1e7SBram Moolenaar
101492fdd1e7SBram Moolenaar  func Ev(s)
101592fdd1e7SBram Moolenaar    let r = pyeval('ev(vim.eval("a:s"))')
101692fdd1e7SBram Moolenaar    if exists('exc')
101792fdd1e7SBram Moolenaar      throw exc
101892fdd1e7SBram Moolenaar    endif
101992fdd1e7SBram Moolenaar    return r
102092fdd1e7SBram Moolenaar  endfunc
102192fdd1e7SBram Moolenaar
102292fdd1e7SBram Moolenaar  py gopts1 = vim.options
102392fdd1e7SBram Moolenaar  py wopts1 = vim.windows[2].options
102492fdd1e7SBram Moolenaar  py wopts2 = vim.windows[0].options
102592fdd1e7SBram Moolenaar  py wopts3 = vim.windows[1].options
102692fdd1e7SBram Moolenaar  py bopts1 = vim.buffers[vim.bindeval("g:bufs")[2]].options
102792fdd1e7SBram Moolenaar  py bopts2 = vim.buffers[vim.bindeval("g:bufs")[1]].options
102892fdd1e7SBram Moolenaar  py bopts3 = vim.buffers[vim.bindeval("g:bufs")[0]].options
102992fdd1e7SBram Moolenaar  call add(g:res, 'wopts iters equal: ' ..
103092fdd1e7SBram Moolenaar        \ pyeval('list(wopts1) == list(wopts2)'))
103192fdd1e7SBram Moolenaar  call add(g:res, 'bopts iters equal: ' ..
103292fdd1e7SBram Moolenaar        \ pyeval('list(bopts1) == list(bopts2)'))
103392fdd1e7SBram Moolenaar  py gset = set(iter(gopts1))
103492fdd1e7SBram Moolenaar  py wset = set(iter(wopts1))
103592fdd1e7SBram Moolenaar  py bset = set(iter(bopts1))
103692fdd1e7SBram Moolenaar
103792fdd1e7SBram Moolenaar  set path=.,..,,
103892fdd1e7SBram Moolenaar  let lst = []
103992fdd1e7SBram Moolenaar  let lst += [['paste', 1, 0, 1, 2, 1, 1, 0]]
104092fdd1e7SBram Moolenaar  let lst += [['previewheight', 5, 1, 6, 'a', 0, 1, 0]]
104192fdd1e7SBram Moolenaar  let lst += [['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0]]
104292fdd1e7SBram Moolenaar  let lst += [['number', 0, 1, 1, 0, 1, 0, 1]]
104392fdd1e7SBram Moolenaar  let lst += [['numberwidth', 2, 3, 5, -100, 0, 0, 1]]
104492fdd1e7SBram Moolenaar  let lst += [['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1]]
104592fdd1e7SBram Moolenaar  let lst += [['statusline', '1', '2', '4', 0, 0, 1, 1]]
104692fdd1e7SBram Moolenaar  let lst += [['autoindent', 0, 1, 1, 2, 1, 0, 2]]
104792fdd1e7SBram Moolenaar  let lst += [['shiftwidth', 0, 2, 1, 3, 0, 0, 2]]
104892fdd1e7SBram Moolenaar  let lst += [['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2]]
104992fdd1e7SBram Moolenaar  let lst += [['preserveindent', 0, 1, 1, 2, 1, 1, 2]]
105092fdd1e7SBram Moolenaar  let lst += [['path', '.,,', ',,', '.', 0, 0, 1, 2]]
105192fdd1e7SBram Moolenaar  for  [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
105292fdd1e7SBram Moolenaar    py oname = vim.eval('oname')
105392fdd1e7SBram Moolenaar    py oval1 = vim.bindeval('oval1')
105492fdd1e7SBram Moolenaar    py oval2 = vim.bindeval('oval2')
105592fdd1e7SBram Moolenaar    py oval3 = vim.bindeval('oval3')
105692fdd1e7SBram Moolenaar    if invval is 0 || invval is 1
105792fdd1e7SBram Moolenaar      py invval = bool(vim.bindeval('invval'))
105892fdd1e7SBram Moolenaar    else
105992fdd1e7SBram Moolenaar      py invval = vim.bindeval('invval')
106092fdd1e7SBram Moolenaar    endif
106192fdd1e7SBram Moolenaar    if bool
106292fdd1e7SBram Moolenaar      py oval1 = bool(oval1)
106392fdd1e7SBram Moolenaar      py oval2 = bool(oval2)
106492fdd1e7SBram Moolenaar      py oval3 = bool(oval3)
106592fdd1e7SBram Moolenaar    endif
106692fdd1e7SBram Moolenaar    call add(g:res, '>>> ' .. oname)
106792fdd1e7SBram Moolenaar    call add(g:res, '  g/w/b:' .. pyeval('oname in gset') .. '/' ..
106892fdd1e7SBram Moolenaar          \ pyeval('oname in wset') .. '/' .. pyeval('oname in bset'))
106992fdd1e7SBram Moolenaar    call add(g:res, '  g/w/b (in):' .. pyeval('oname in gopts1') .. '/' ..
107092fdd1e7SBram Moolenaar          \ pyeval('oname in wopts1') .. '/' .. pyeval('oname in bopts1'))
107192fdd1e7SBram Moolenaar    for v in ['gopts1', 'wopts1', 'bopts1']
107292fdd1e7SBram Moolenaar      try
107392fdd1e7SBram Moolenaar        call add(g:res, '  p/' .. v .. ': ' .. Ev('repr(' .. v .. '[''' .. oname .. '''])'))
107492fdd1e7SBram Moolenaar      catch
107592fdd1e7SBram Moolenaar        call add(g:res, '  p/' .. v .. '! ' .. v:exception)
107692fdd1e7SBram Moolenaar      endtry
107792fdd1e7SBram Moolenaar      let r = E(v .. '[''' .. oname .. ''']=invval')
107892fdd1e7SBram Moolenaar      if r isnot 0
107992fdd1e7SBram Moolenaar        call add(g:res, '  inv: ' .. string(invval) .. '! ' .. r)
108092fdd1e7SBram Moolenaar      endif
108192fdd1e7SBram Moolenaar      for vv in (v is# 'gopts1' ? [v] : [v, v[:-2] .. '2', v[:-2] .. '3'])
108292fdd1e7SBram Moolenaar        let val = substitute(vv, '^.opts', 'oval', '')
108392fdd1e7SBram Moolenaar        let r = E(vv .. '[''' .. oname .. ''']=' .. val)
108492fdd1e7SBram Moolenaar        if r isnot 0
108592fdd1e7SBram Moolenaar            call add(g:res, '  ' .. vv .. '! ' .. r)
108692fdd1e7SBram Moolenaar        endif
108792fdd1e7SBram Moolenaar      endfor
108892fdd1e7SBram Moolenaar    endfor
108992fdd1e7SBram Moolenaar    call RecVars(oname)
109092fdd1e7SBram Moolenaar    for v in ['wopts3', 'bopts3']
109192fdd1e7SBram Moolenaar      let r = E('del ' .. v .. '["' .. oname .. '"]')
109292fdd1e7SBram Moolenaar      if r isnot 0
109392fdd1e7SBram Moolenaar        call add(g:res, '  del ' .. v .. '! ' .. r)
109492fdd1e7SBram Moolenaar      endif
109592fdd1e7SBram Moolenaar    endfor
109692fdd1e7SBram Moolenaar    call RecVars(oname)
109792fdd1e7SBram Moolenaar  endfor
109892fdd1e7SBram Moolenaar  delfunction RecVars
109992fdd1e7SBram Moolenaar  delfunction E
110092fdd1e7SBram Moolenaar  delfunction Ev
110192fdd1e7SBram Moolenaar  py del ev
110292fdd1e7SBram Moolenaar  py del e
110392fdd1e7SBram Moolenaar  only
110492fdd1e7SBram Moolenaar  for buf in g:bufs[1:]
110592fdd1e7SBram Moolenaar    execute 'bwipeout!' buf
110692fdd1e7SBram Moolenaar  endfor
110792fdd1e7SBram Moolenaar  py del gopts1
110892fdd1e7SBram Moolenaar  py del wopts1
110992fdd1e7SBram Moolenaar  py del wopts2
111092fdd1e7SBram Moolenaar  py del wopts3
111192fdd1e7SBram Moolenaar  py del bopts1
111292fdd1e7SBram Moolenaar  py del bopts2
111392fdd1e7SBram Moolenaar  py del bopts3
111492fdd1e7SBram Moolenaar  py del oval1
111592fdd1e7SBram Moolenaar  py del oval2
111692fdd1e7SBram Moolenaar  py del oval3
111792fdd1e7SBram Moolenaar  py del oname
111892fdd1e7SBram Moolenaar  py del invval
111992fdd1e7SBram Moolenaar
112092fdd1e7SBram Moolenaar  let expected =<< trim END
112192fdd1e7SBram Moolenaar    wopts iters equal: 1
112292fdd1e7SBram Moolenaar    bopts iters equal: 1
112392fdd1e7SBram Moolenaar    >>> paste
112492fdd1e7SBram Moolenaar      g/w/b:1/0/0
112592fdd1e7SBram Moolenaar      g/w/b (in):1/0/0
112692fdd1e7SBram Moolenaar      p/gopts1: False
112792fdd1e7SBram Moolenaar      p/wopts1! KeyError
112892fdd1e7SBram Moolenaar      inv: 2! KeyError
112992fdd1e7SBram Moolenaar      wopts1! KeyError
113092fdd1e7SBram Moolenaar      wopts2! KeyError
113192fdd1e7SBram Moolenaar      wopts3! KeyError
113292fdd1e7SBram Moolenaar      p/bopts1! KeyError
113392fdd1e7SBram Moolenaar      inv: 2! KeyError
113492fdd1e7SBram Moolenaar      bopts1! KeyError
113592fdd1e7SBram Moolenaar      bopts2! KeyError
113692fdd1e7SBram Moolenaar      bopts3! KeyError
113792fdd1e7SBram Moolenaar      G: 1
113892fdd1e7SBram Moolenaar      W: 1:1 2:1 3:1 4:1
113992fdd1e7SBram Moolenaar      B: 1:1 2:1 3:1 4:1
114092fdd1e7SBram Moolenaar      del wopts3! KeyError
114192fdd1e7SBram Moolenaar      del bopts3! KeyError
114292fdd1e7SBram Moolenaar      G: 1
114392fdd1e7SBram Moolenaar      W: 1:1 2:1 3:1 4:1
114492fdd1e7SBram Moolenaar      B: 1:1 2:1 3:1 4:1
114592fdd1e7SBram Moolenaar    >>> previewheight
114692fdd1e7SBram Moolenaar      g/w/b:1/0/0
114792fdd1e7SBram Moolenaar      g/w/b (in):1/0/0
114892fdd1e7SBram Moolenaar      p/gopts1: 12
114992fdd1e7SBram Moolenaar      inv: 'a'! TypeError
115092fdd1e7SBram Moolenaar      p/wopts1! KeyError
115192fdd1e7SBram Moolenaar      inv: 'a'! KeyError
115292fdd1e7SBram Moolenaar      wopts1! KeyError
115392fdd1e7SBram Moolenaar      wopts2! KeyError
115492fdd1e7SBram Moolenaar      wopts3! KeyError
115592fdd1e7SBram Moolenaar      p/bopts1! KeyError
115692fdd1e7SBram Moolenaar      inv: 'a'! KeyError
115792fdd1e7SBram Moolenaar      bopts1! KeyError
115892fdd1e7SBram Moolenaar      bopts2! KeyError
115992fdd1e7SBram Moolenaar      bopts3! KeyError
116092fdd1e7SBram Moolenaar      G: 5
116192fdd1e7SBram Moolenaar      W: 1:5 2:5 3:5 4:5
116292fdd1e7SBram Moolenaar      B: 1:5 2:5 3:5 4:5
116392fdd1e7SBram Moolenaar      del wopts3! KeyError
116492fdd1e7SBram Moolenaar      del bopts3! KeyError
116592fdd1e7SBram Moolenaar      G: 5
116692fdd1e7SBram Moolenaar      W: 1:5 2:5 3:5 4:5
116792fdd1e7SBram Moolenaar      B: 1:5 2:5 3:5 4:5
116892fdd1e7SBram Moolenaar    >>> operatorfunc
116992fdd1e7SBram Moolenaar      g/w/b:1/0/0
117092fdd1e7SBram Moolenaar      g/w/b (in):1/0/0
117192fdd1e7SBram Moolenaar      p/gopts1: ''
117292fdd1e7SBram Moolenaar      inv: 2! TypeError
117392fdd1e7SBram Moolenaar      p/wopts1! KeyError
117492fdd1e7SBram Moolenaar      inv: 2! KeyError
117592fdd1e7SBram Moolenaar      wopts1! KeyError
117692fdd1e7SBram Moolenaar      wopts2! KeyError
117792fdd1e7SBram Moolenaar      wopts3! KeyError
117892fdd1e7SBram Moolenaar      p/bopts1! KeyError
117992fdd1e7SBram Moolenaar      inv: 2! KeyError
118092fdd1e7SBram Moolenaar      bopts1! KeyError
118192fdd1e7SBram Moolenaar      bopts2! KeyError
118292fdd1e7SBram Moolenaar      bopts3! KeyError
118392fdd1e7SBram Moolenaar      G: 'A'
118492fdd1e7SBram Moolenaar      W: 1:'A' 2:'A' 3:'A' 4:'A'
118592fdd1e7SBram Moolenaar      B: 1:'A' 2:'A' 3:'A' 4:'A'
118692fdd1e7SBram Moolenaar      del wopts3! KeyError
118792fdd1e7SBram Moolenaar      del bopts3! KeyError
118892fdd1e7SBram Moolenaar      G: 'A'
118992fdd1e7SBram Moolenaar      W: 1:'A' 2:'A' 3:'A' 4:'A'
119092fdd1e7SBram Moolenaar      B: 1:'A' 2:'A' 3:'A' 4:'A'
119192fdd1e7SBram Moolenaar    >>> number
119292fdd1e7SBram Moolenaar      g/w/b:0/1/0
119392fdd1e7SBram Moolenaar      g/w/b (in):0/1/0
119492fdd1e7SBram Moolenaar      p/gopts1! KeyError
119592fdd1e7SBram Moolenaar      inv: 0! KeyError
119692fdd1e7SBram Moolenaar      gopts1! KeyError
119792fdd1e7SBram Moolenaar      p/wopts1: False
119892fdd1e7SBram Moolenaar      p/bopts1! KeyError
119992fdd1e7SBram Moolenaar      inv: 0! KeyError
120092fdd1e7SBram Moolenaar      bopts1! KeyError
120192fdd1e7SBram Moolenaar      bopts2! KeyError
120292fdd1e7SBram Moolenaar      bopts3! KeyError
120392fdd1e7SBram Moolenaar      G: 0
120492fdd1e7SBram Moolenaar      W: 1:1 2:1 3:0 4:0
120592fdd1e7SBram Moolenaar      B: 1:1 2:1 3:0 4:0
120692fdd1e7SBram Moolenaar      del wopts3! ValueError
120792fdd1e7SBram Moolenaar      del bopts3! KeyError
120892fdd1e7SBram Moolenaar      G: 0
120992fdd1e7SBram Moolenaar      W: 1:1 2:1 3:0 4:0
121092fdd1e7SBram Moolenaar      B: 1:1 2:1 3:0 4:0
121192fdd1e7SBram Moolenaar    >>> numberwidth
121292fdd1e7SBram Moolenaar      g/w/b:0/1/0
121392fdd1e7SBram Moolenaar      g/w/b (in):0/1/0
121492fdd1e7SBram Moolenaar      p/gopts1! KeyError
121592fdd1e7SBram Moolenaar      inv: -100! KeyError
121692fdd1e7SBram Moolenaar      gopts1! KeyError
121792fdd1e7SBram Moolenaar      p/wopts1: 4
121892fdd1e7SBram Moolenaar      inv: -100! error
121992fdd1e7SBram Moolenaar      p/bopts1! KeyError
122092fdd1e7SBram Moolenaar      inv: -100! KeyError
122192fdd1e7SBram Moolenaar      bopts1! KeyError
122292fdd1e7SBram Moolenaar      bopts2! KeyError
122392fdd1e7SBram Moolenaar      bopts3! KeyError
122492fdd1e7SBram Moolenaar      G: 4
122592fdd1e7SBram Moolenaar      W: 1:3 2:5 3:2 4:4
122692fdd1e7SBram Moolenaar      B: 1:3 2:5 3:2 4:4
122792fdd1e7SBram Moolenaar      del wopts3! ValueError
122892fdd1e7SBram Moolenaar      del bopts3! KeyError
122992fdd1e7SBram Moolenaar      G: 4
123092fdd1e7SBram Moolenaar      W: 1:3 2:5 3:2 4:4
123192fdd1e7SBram Moolenaar      B: 1:3 2:5 3:2 4:4
123292fdd1e7SBram Moolenaar    >>> colorcolumn
123392fdd1e7SBram Moolenaar      g/w/b:0/1/0
123492fdd1e7SBram Moolenaar      g/w/b (in):0/1/0
123592fdd1e7SBram Moolenaar      p/gopts1! KeyError
123692fdd1e7SBram Moolenaar      inv: 'abc4'! KeyError
123792fdd1e7SBram Moolenaar      gopts1! KeyError
123892fdd1e7SBram Moolenaar      p/wopts1: ''
123992fdd1e7SBram Moolenaar      inv: 'abc4'! error
124092fdd1e7SBram Moolenaar      p/bopts1! KeyError
124192fdd1e7SBram Moolenaar      inv: 'abc4'! KeyError
124292fdd1e7SBram Moolenaar      bopts1! KeyError
124392fdd1e7SBram Moolenaar      bopts2! KeyError
124492fdd1e7SBram Moolenaar      bopts3! KeyError
124592fdd1e7SBram Moolenaar      G: ''
124692fdd1e7SBram Moolenaar      W: 1:'+2' 2:'+3' 3:'+1' 4:''
124792fdd1e7SBram Moolenaar      B: 1:'+2' 2:'+3' 3:'+1' 4:''
124892fdd1e7SBram Moolenaar      del wopts3! ValueError
124992fdd1e7SBram Moolenaar      del bopts3! KeyError
125092fdd1e7SBram Moolenaar      G: ''
125192fdd1e7SBram Moolenaar      W: 1:'+2' 2:'+3' 3:'+1' 4:''
125292fdd1e7SBram Moolenaar      B: 1:'+2' 2:'+3' 3:'+1' 4:''
125392fdd1e7SBram Moolenaar    >>> statusline
125492fdd1e7SBram Moolenaar      g/w/b:1/1/0
125592fdd1e7SBram Moolenaar      g/w/b (in):1/1/0
125692fdd1e7SBram Moolenaar      p/gopts1: ''
125792fdd1e7SBram Moolenaar      inv: 0! TypeError
125892fdd1e7SBram Moolenaar      p/wopts1: None
125992fdd1e7SBram Moolenaar      inv: 0! TypeError
126092fdd1e7SBram Moolenaar      p/bopts1! KeyError
126192fdd1e7SBram Moolenaar      inv: 0! KeyError
126292fdd1e7SBram Moolenaar      bopts1! KeyError
126392fdd1e7SBram Moolenaar      bopts2! KeyError
126492fdd1e7SBram Moolenaar      bopts3! KeyError
126592fdd1e7SBram Moolenaar      G: '1'
126692fdd1e7SBram Moolenaar      W: 1:'2' 2:'4' 3:'1' 4:'1'
126792fdd1e7SBram Moolenaar      B: 1:'2' 2:'4' 3:'1' 4:'1'
126892fdd1e7SBram Moolenaar      del bopts3! KeyError
126992fdd1e7SBram Moolenaar      G: '1'
127092fdd1e7SBram Moolenaar      W: 1:'2' 2:'1' 3:'1' 4:'1'
127192fdd1e7SBram Moolenaar      B: 1:'2' 2:'1' 3:'1' 4:'1'
127292fdd1e7SBram Moolenaar    >>> autoindent
127392fdd1e7SBram Moolenaar      g/w/b:0/0/1
127492fdd1e7SBram Moolenaar      g/w/b (in):0/0/1
127592fdd1e7SBram Moolenaar      p/gopts1! KeyError
127692fdd1e7SBram Moolenaar      inv: 2! KeyError
127792fdd1e7SBram Moolenaar      gopts1! KeyError
127892fdd1e7SBram Moolenaar      p/wopts1! KeyError
127992fdd1e7SBram Moolenaar      inv: 2! KeyError
128092fdd1e7SBram Moolenaar      wopts1! KeyError
128192fdd1e7SBram Moolenaar      wopts2! KeyError
128292fdd1e7SBram Moolenaar      wopts3! KeyError
128392fdd1e7SBram Moolenaar      p/bopts1: False
128492fdd1e7SBram Moolenaar      G: 0
128592fdd1e7SBram Moolenaar      W: 1:0 2:1 3:0 4:1
128692fdd1e7SBram Moolenaar      B: 1:0 2:1 3:0 4:1
128792fdd1e7SBram Moolenaar      del wopts3! KeyError
128892fdd1e7SBram Moolenaar      del bopts3! ValueError
128992fdd1e7SBram Moolenaar      G: 0
129092fdd1e7SBram Moolenaar      W: 1:0 2:1 3:0 4:1
129192fdd1e7SBram Moolenaar      B: 1:0 2:1 3:0 4:1
129292fdd1e7SBram Moolenaar    >>> shiftwidth
129392fdd1e7SBram Moolenaar      g/w/b:0/0/1
129492fdd1e7SBram Moolenaar      g/w/b (in):0/0/1
129592fdd1e7SBram Moolenaar      p/gopts1! KeyError
129692fdd1e7SBram Moolenaar      inv: 3! KeyError
129792fdd1e7SBram Moolenaar      gopts1! KeyError
129892fdd1e7SBram Moolenaar      p/wopts1! KeyError
129992fdd1e7SBram Moolenaar      inv: 3! KeyError
130092fdd1e7SBram Moolenaar      wopts1! KeyError
130192fdd1e7SBram Moolenaar      wopts2! KeyError
130292fdd1e7SBram Moolenaar      wopts3! KeyError
130392fdd1e7SBram Moolenaar      p/bopts1: 8
130492fdd1e7SBram Moolenaar      G: 8
130592fdd1e7SBram Moolenaar      W: 1:0 2:2 3:8 4:1
130692fdd1e7SBram Moolenaar      B: 1:0 2:2 3:8 4:1
130792fdd1e7SBram Moolenaar      del wopts3! KeyError
130892fdd1e7SBram Moolenaar      del bopts3! ValueError
130992fdd1e7SBram Moolenaar      G: 8
131092fdd1e7SBram Moolenaar      W: 1:0 2:2 3:8 4:1
131192fdd1e7SBram Moolenaar      B: 1:0 2:2 3:8 4:1
131292fdd1e7SBram Moolenaar    >>> omnifunc
131392fdd1e7SBram Moolenaar      g/w/b:0/0/1
131492fdd1e7SBram Moolenaar      g/w/b (in):0/0/1
131592fdd1e7SBram Moolenaar      p/gopts1! KeyError
131692fdd1e7SBram Moolenaar      inv: 1! KeyError
131792fdd1e7SBram Moolenaar      gopts1! KeyError
131892fdd1e7SBram Moolenaar      p/wopts1! KeyError
131992fdd1e7SBram Moolenaar      inv: 1! KeyError
132092fdd1e7SBram Moolenaar      wopts1! KeyError
132192fdd1e7SBram Moolenaar      wopts2! KeyError
132292fdd1e7SBram Moolenaar      wopts3! KeyError
132392fdd1e7SBram Moolenaar      p/bopts1: ''
132492fdd1e7SBram Moolenaar      inv: 1! TypeError
132592fdd1e7SBram Moolenaar      G: ''
132692fdd1e7SBram Moolenaar      W: 1:'A' 2:'B' 3:'' 4:'C'
132792fdd1e7SBram Moolenaar      B: 1:'A' 2:'B' 3:'' 4:'C'
132892fdd1e7SBram Moolenaar      del wopts3! KeyError
132992fdd1e7SBram Moolenaar      del bopts3! ValueError
133092fdd1e7SBram Moolenaar      G: ''
133192fdd1e7SBram Moolenaar      W: 1:'A' 2:'B' 3:'' 4:'C'
133292fdd1e7SBram Moolenaar      B: 1:'A' 2:'B' 3:'' 4:'C'
133392fdd1e7SBram Moolenaar    >>> preserveindent
133492fdd1e7SBram Moolenaar      g/w/b:0/0/1
133592fdd1e7SBram Moolenaar      g/w/b (in):0/0/1
133692fdd1e7SBram Moolenaar      p/gopts1! KeyError
133792fdd1e7SBram Moolenaar      inv: 2! KeyError
133892fdd1e7SBram Moolenaar      gopts1! KeyError
133992fdd1e7SBram Moolenaar      p/wopts1! KeyError
134092fdd1e7SBram Moolenaar      inv: 2! KeyError
134192fdd1e7SBram Moolenaar      wopts1! KeyError
134292fdd1e7SBram Moolenaar      wopts2! KeyError
134392fdd1e7SBram Moolenaar      wopts3! KeyError
134492fdd1e7SBram Moolenaar      p/bopts1: False
134592fdd1e7SBram Moolenaar      G: 0
134692fdd1e7SBram Moolenaar      W: 1:0 2:1 3:0 4:1
134792fdd1e7SBram Moolenaar      B: 1:0 2:1 3:0 4:1
134892fdd1e7SBram Moolenaar      del wopts3! KeyError
134992fdd1e7SBram Moolenaar      del bopts3! ValueError
135092fdd1e7SBram Moolenaar      G: 0
135192fdd1e7SBram Moolenaar      W: 1:0 2:1 3:0 4:1
135292fdd1e7SBram Moolenaar      B: 1:0 2:1 3:0 4:1
135392fdd1e7SBram Moolenaar    >>> path
135492fdd1e7SBram Moolenaar      g/w/b:1/0/1
135592fdd1e7SBram Moolenaar      g/w/b (in):1/0/1
135692fdd1e7SBram Moolenaar      p/gopts1: '.,..,,'
135792fdd1e7SBram Moolenaar      inv: 0! TypeError
135892fdd1e7SBram Moolenaar      p/wopts1! KeyError
135992fdd1e7SBram Moolenaar      inv: 0! KeyError
136092fdd1e7SBram Moolenaar      wopts1! KeyError
136192fdd1e7SBram Moolenaar      wopts2! KeyError
136292fdd1e7SBram Moolenaar      wopts3! KeyError
136392fdd1e7SBram Moolenaar      p/bopts1: None
136492fdd1e7SBram Moolenaar      inv: 0! TypeError
136592fdd1e7SBram Moolenaar      G: '.,,'
136692fdd1e7SBram Moolenaar      W: 1:'.,,' 2:',,' 3:'.,,' 4:'.'
136792fdd1e7SBram Moolenaar      B: 1:'.,,' 2:',,' 3:'.,,' 4:'.'
136892fdd1e7SBram Moolenaar      del wopts3! KeyError
136992fdd1e7SBram Moolenaar      G: '.,,'
137092fdd1e7SBram Moolenaar      W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,'
137192fdd1e7SBram Moolenaar      B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,'
137292fdd1e7SBram Moolenaar  END
137392fdd1e7SBram Moolenaar
137492fdd1e7SBram Moolenaar  call assert_equal(expected, g:res)
137592fdd1e7SBram Moolenaar  unlet g:res
1376ab589463SBram Moolenaar
1377ab589463SBram Moolenaar  call assert_equal(0, pyeval("'' in vim.options"))
1378ab589463SBram Moolenaar
1379ab589463SBram Moolenaar  " use an empty key to index vim.options
1380ab589463SBram Moolenaar  call AssertException(["let v = pyeval(\"vim.options['']\")"],
1381ab589463SBram Moolenaar        \ 'Vim(let):ValueError: empty keys are not allowed')
1382ab589463SBram Moolenaar  call AssertException(["py vim.current.window.options[''] = 0"],
1383ab589463SBram Moolenaar        \ 'Vim(python):ValueError: empty keys are not allowed')
1384ab589463SBram Moolenaar  call AssertException(["py vim.current.window.options[{}] = 0"],
1385ab589463SBram Moolenaar        \ 'Vim(python):TypeError: expected str() or unicode() instance, but got dict')
1386ab589463SBram Moolenaar
1387ab589463SBram Moolenaar  " set one of the number options to a very large number
1388ab589463SBram Moolenaar  let cmd = ["py vim.options['previewheight'] = 9999999999999999"]
1389ab589463SBram Moolenaar  call AssertException(cmd, 'OverflowError:')
1390ab589463SBram Moolenaar
1391ab589463SBram Moolenaar  " unset a global-local string option
1392ab589463SBram Moolenaar  call AssertException(["py del vim.options['errorformat']"],
1393ab589463SBram Moolenaar        \ 'Vim(python):ValueError: unable to unset global option errorformat')
139492fdd1e7SBram Moolenaarendfunc
139592fdd1e7SBram Moolenaar
139692fdd1e7SBram Moolenaar" Test for vim.buffer object
139792fdd1e7SBram Moolenaarfunc Test_python_buffer()
139892fdd1e7SBram Moolenaar  new
139992fdd1e7SBram Moolenaar  call setline(1, "Hello\nWorld")
140092fdd1e7SBram Moolenaar  call assert_fails("let x = pyeval('vim.current.buffer[0]')", 'E859:')
140192fdd1e7SBram Moolenaar  %bw!
140292fdd1e7SBram Moolenaar
140392fdd1e7SBram Moolenaar  edit Xfile1
140492fdd1e7SBram Moolenaar  let bnr1 = bufnr()
140592fdd1e7SBram Moolenaar  py cb = vim.current.buffer
140692fdd1e7SBram Moolenaar  vnew Xfile2
140792fdd1e7SBram Moolenaar  let bnr2 = bufnr()
140892fdd1e7SBram Moolenaar  call setline(1, ['First line', 'Second line', 'Third line'])
140992fdd1e7SBram Moolenaar  py b = vim.current.buffer
141092fdd1e7SBram Moolenaar  wincmd w
141192fdd1e7SBram Moolenaar
1412ab589463SBram Moolenaar  " Test for getting lines from the buffer using a slice
1413ab589463SBram Moolenaar  call assert_equal(['First line'], pyeval('b[-10:1]'))
1414ab589463SBram Moolenaar  call assert_equal(['Third line'], pyeval('b[2:10]'))
1415ab589463SBram Moolenaar  call assert_equal([], pyeval('b[2:0]'))
1416ab589463SBram Moolenaar  call assert_equal([], pyeval('b[10:12]'))
1417ab589463SBram Moolenaar  call assert_equal([], pyeval('b[-10:-8]'))
14180ab55d62SBram Moolenaar  call AssertException(["py x = b[0:3:0]"],
14190ab55d62SBram Moolenaar        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
14200ab55d62SBram Moolenaar  call AssertException(["py b[0:3:0] = 'abc'"],
14210ab55d62SBram Moolenaar        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
14220ab55d62SBram Moolenaar  call AssertException(["py x = b[{}]"],
14230ab55d62SBram Moolenaar        \ "Vim(python):TypeError: sequence index must be integer, not 'dict'")
14240ab55d62SBram Moolenaar  call AssertException(["py b[{}] = 'abc'"],
14250ab55d62SBram Moolenaar        \ "Vim(python):TypeError: sequence index must be integer, not 'dict'")
14260ab55d62SBram Moolenaar
14270ab55d62SBram Moolenaar  " Test for getting lines using a range
14280ab55d62SBram Moolenaar  call AssertException(["py x = b.range(0,3)[0:2:0]"],
14290ab55d62SBram Moolenaar        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
14300ab55d62SBram Moolenaar  call AssertException(["py b.range(0,3)[0:2:0] = 'abc'"],
14310ab55d62SBram Moolenaar        \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1432ab589463SBram Moolenaar
143392fdd1e7SBram Moolenaar  " Tests BufferAppend and BufferItem
143492fdd1e7SBram Moolenaar  py cb.append(b[0])
143592fdd1e7SBram Moolenaar  call assert_equal(['First line'], getbufline(bnr1, 2))
143692fdd1e7SBram Moolenaar  %d
143792fdd1e7SBram Moolenaar
1438ab589463SBram Moolenaar  " Try to append using out-of-range line number
1439ab589463SBram Moolenaar  call AssertException(["py b.append('abc', 10)"],
1440ab589463SBram Moolenaar        \ 'Vim(python):IndexError: line number out of range')
1441ab589463SBram Moolenaar
1442ab589463SBram Moolenaar  " Append a non-string item
1443ab589463SBram Moolenaar  call AssertException(["py b.append([22])"],
1444ab589463SBram Moolenaar        \ 'Vim(python):TypeError: expected str() or unicode() instance, but got int')
1445ab589463SBram Moolenaar
144692fdd1e7SBram Moolenaar  " Tests BufferSlice and BufferAssSlice
144792fdd1e7SBram Moolenaar  py cb.append('abc5') # Will be overwritten
144892fdd1e7SBram Moolenaar  py cb[-1:] = b[:-2]
144992fdd1e7SBram Moolenaar  call assert_equal(['First line'], getbufline(bnr1, 2))
145092fdd1e7SBram Moolenaar  %d
145192fdd1e7SBram Moolenaar
145292fdd1e7SBram Moolenaar  " Test BufferLength and BufferAssSlice
145392fdd1e7SBram Moolenaar  py cb.append('def') # Will not be overwritten
145492fdd1e7SBram Moolenaar  py cb[len(cb):] = b[:]
145592fdd1e7SBram Moolenaar  call assert_equal(['def', 'First line', 'Second line', 'Third line'],
145692fdd1e7SBram Moolenaar        \ getbufline(bnr1, 2, '$'))
145792fdd1e7SBram Moolenaar  %d
145892fdd1e7SBram Moolenaar
145992fdd1e7SBram Moolenaar  " Test BufferAssItem and BufferMark
146092fdd1e7SBram Moolenaar  call setbufline(bnr1, 1, ['one', 'two', 'three'])
146192fdd1e7SBram Moolenaar  call cursor(1, 3)
146292fdd1e7SBram Moolenaar  normal ma
146392fdd1e7SBram Moolenaar  py cb.append('ghi') # Will be overwritten
146492fdd1e7SBram Moolenaar  py cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
146592fdd1e7SBram Moolenaar  call assert_equal(['(3, 2)'], getbufline(bnr1, 4))
146692fdd1e7SBram Moolenaar  %d
146792fdd1e7SBram Moolenaar
146892fdd1e7SBram Moolenaar  " Test BufferRepr
146992fdd1e7SBram Moolenaar  py cb.append(repr(cb) + repr(b))
147092fdd1e7SBram Moolenaar  call assert_equal(['<buffer Xfile1><buffer Xfile2>'], getbufline(bnr1, 2))
147192fdd1e7SBram Moolenaar  %d
147292fdd1e7SBram Moolenaar
147392fdd1e7SBram Moolenaar  " Modify foreign buffer
147492fdd1e7SBram Moolenaar  py << trim EOF
147592fdd1e7SBram Moolenaar    b.append('foo')
147692fdd1e7SBram Moolenaar    b[0]='bar'
147792fdd1e7SBram Moolenaar    b[0:0]=['baz']
147892fdd1e7SBram Moolenaar    vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
147992fdd1e7SBram Moolenaar  EOF
148092fdd1e7SBram Moolenaar  call assert_equal(['baz', 'bar', 'Second line', 'Third line', 'foo'],
148192fdd1e7SBram Moolenaar        \ getbufline(bnr2, 1, '$'))
148292fdd1e7SBram Moolenaar  %d
148392fdd1e7SBram Moolenaar
148492fdd1e7SBram Moolenaar  " Test assigning to name property
148592fdd1e7SBram Moolenaar  augroup BUFS
148692fdd1e7SBram Moolenaar    autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
148792fdd1e7SBram Moolenaar    autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
148892fdd1e7SBram Moolenaar  augroup END
148992fdd1e7SBram Moolenaar  py << trim EOF
149092fdd1e7SBram Moolenaar    import os
149192fdd1e7SBram Moolenaar    old_name = cb.name
149292fdd1e7SBram Moolenaar    cb.name = 'foo'
149392fdd1e7SBram Moolenaar    cb.append(cb.name[-11:].replace(os.path.sep, '/'))
149492fdd1e7SBram Moolenaar    b.name = 'bar'
149592fdd1e7SBram Moolenaar    cb.append(b.name[-11:].replace(os.path.sep, '/'))
149692fdd1e7SBram Moolenaar    cb.name = old_name
149792fdd1e7SBram Moolenaar    cb.append(cb.name[-14:].replace(os.path.sep, '/'))
149892fdd1e7SBram Moolenaar    del old_name
149992fdd1e7SBram Moolenaar  EOF
150092fdd1e7SBram Moolenaar  call assert_equal([bnr1 .. ':BufFilePre:' .. bnr1,
150192fdd1e7SBram Moolenaar        \ bnr1 .. ':BufFilePost:' .. bnr1,
150292fdd1e7SBram Moolenaar        \ 'testdir/foo',
150392fdd1e7SBram Moolenaar        \ bnr2 .. ':BufFilePre:' .. bnr2,
150492fdd1e7SBram Moolenaar        \ bnr2 .. ':BufFilePost:' .. bnr2,
150592fdd1e7SBram Moolenaar        \ 'testdir/bar',
150692fdd1e7SBram Moolenaar        \ bnr1 .. ':BufFilePre:' .. bnr1,
150792fdd1e7SBram Moolenaar        \ bnr1 .. ':BufFilePost:' .. bnr1,
150892fdd1e7SBram Moolenaar        \ 'testdir/Xfile1'], getbufline(bnr1, 2, '$'))
150992fdd1e7SBram Moolenaar  %d
151092fdd1e7SBram Moolenaar
151192fdd1e7SBram Moolenaar  " Test CheckBuffer
151292fdd1e7SBram Moolenaar  py << trim EOF
151392fdd1e7SBram Moolenaar    for _b in vim.buffers:
151492fdd1e7SBram Moolenaar      if _b is not cb:
151592fdd1e7SBram Moolenaar        vim.command('bwipeout! ' + str(_b.number))
151692fdd1e7SBram Moolenaar    del _b
151792fdd1e7SBram Moolenaar    cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
151892fdd1e7SBram Moolenaar  EOF
151992fdd1e7SBram Moolenaar  call assert_equal('valid: b:False, cb:True', getline(2))
152092fdd1e7SBram Moolenaar  %d
152192fdd1e7SBram Moolenaar
152292fdd1e7SBram Moolenaar  py << trim EOF
152392fdd1e7SBram Moolenaar    for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")', 'b.name = "!"'):
152492fdd1e7SBram Moolenaar      try:
152592fdd1e7SBram Moolenaar        exec(expr)
152692fdd1e7SBram Moolenaar      except vim.error:
152792fdd1e7SBram Moolenaar        pass
152892fdd1e7SBram Moolenaar      else:
152992fdd1e7SBram Moolenaar        # Usually a SEGV here
153092fdd1e7SBram Moolenaar        # Should not happen in any case
153192fdd1e7SBram Moolenaar        cb.append('No exception for ' + expr)
153292fdd1e7SBram Moolenaar    vim.command('cd .')
153392fdd1e7SBram Moolenaar    del b
153492fdd1e7SBram Moolenaar  EOF
153592fdd1e7SBram Moolenaar  call assert_equal([''], getline(1, '$'))
153692fdd1e7SBram Moolenaar
1537ab589463SBram Moolenaar  " Delete all the lines in a buffer
1538ab589463SBram Moolenaar  call setline(1, ['a', 'b', 'c'])
1539ab589463SBram Moolenaar  py vim.current.buffer[:] = []
1540ab589463SBram Moolenaar  call assert_equal([''], getline(1, '$'))
1541ab589463SBram Moolenaar
15420ab55d62SBram Moolenaar  " Test for buffer marks
15430ab55d62SBram Moolenaar  call assert_equal(v:none, pyeval("vim.current.buffer.mark('r')"))
15440ab55d62SBram Moolenaar
1545ab589463SBram Moolenaar  " Test for modifying a 'nomodifiable' buffer
1546ab589463SBram Moolenaar  setlocal nomodifiable
1547ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer[0] = 'abc'"],
1548ab589463SBram Moolenaar        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1549ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer[0] = None"],
1550ab589463SBram Moolenaar        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1551ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer[:] = None"],
1552ab589463SBram Moolenaar        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1553ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer[:] = []"],
1554ab589463SBram Moolenaar        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1555ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer.append('abc')"],
1556ab589463SBram Moolenaar        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1557ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer.append([])"],
1558ab589463SBram Moolenaar        \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1559ab589463SBram Moolenaar  setlocal modifiable
1560ab589463SBram Moolenaar
156192fdd1e7SBram Moolenaar  augroup BUFS
156292fdd1e7SBram Moolenaar    autocmd!
156392fdd1e7SBram Moolenaar  augroup END
156492fdd1e7SBram Moolenaar  augroup! BUFS
156592fdd1e7SBram Moolenaar  %bw!
1566ab589463SBram Moolenaar
1567ab589463SBram Moolenaar  " Range object for a deleted buffer
1568ab589463SBram Moolenaar  new Xfile
1569ab589463SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
1570ab589463SBram Moolenaar  py b = vim.current.buffer
1571ab589463SBram Moolenaar  py r = vim.current.buffer.range(0, 2)
1572ab589463SBram Moolenaar  call assert_equal('<range Xfile (0:2)>', pyeval('repr(r)'))
1573ab589463SBram Moolenaar  %bw!
1574ab589463SBram Moolenaar  call AssertException(['py r[:] = []'],
1575ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1576ab589463SBram Moolenaar  call assert_match('<buffer object (deleted)', pyeval('repr(b)'))
1577ab589463SBram Moolenaar  call assert_match('<range object (for deleted buffer)', pyeval('repr(r)'))
1578ab589463SBram Moolenaar  call AssertException(["let n = pyeval('len(r)')"],
1579ab589463SBram Moolenaar        \ 'Vim(let):vim.error: attempt to refer to deleted buffer')
1580ab589463SBram Moolenaar  call AssertException(["py r.append('abc')"],
1581ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1582ab589463SBram Moolenaar
1583ab589463SBram Moolenaar  " object for a deleted buffer
1584ab589463SBram Moolenaar  call AssertException(["py b[0] = 'one'"],
1585ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1586ab589463SBram Moolenaar  call AssertException(["py b.append('one')"],
1587ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1588ab589463SBram Moolenaar  call AssertException(["let n = pyeval('len(b)')"],
1589ab589463SBram Moolenaar        \ 'Vim(let):vim.error: attempt to refer to deleted buffer')
1590ab589463SBram Moolenaar  call AssertException(["py pos = b.mark('a')"],
1591ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1592ab589463SBram Moolenaar  call AssertException(["py vim.current.buffer = b"],
1593ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1594ab589463SBram Moolenaar  call AssertException(["py rn = b.range(0, 2)"],
1595ab589463SBram Moolenaar        \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
159692fdd1e7SBram Moolenaarendfunc
159792fdd1e7SBram Moolenaar
159892fdd1e7SBram Moolenaar" Test vim.buffers object
159992fdd1e7SBram Moolenaarfunc Test_python_buffers()
160092fdd1e7SBram Moolenaar  %bw!
160192fdd1e7SBram Moolenaar  edit Xfile
160292fdd1e7SBram Moolenaar  py cb = vim.current.buffer
160392fdd1e7SBram Moolenaar  set hidden
160492fdd1e7SBram Moolenaar  edit a
160592fdd1e7SBram Moolenaar  buffer #
160692fdd1e7SBram Moolenaar  edit b
160792fdd1e7SBram Moolenaar  buffer #
160892fdd1e7SBram Moolenaar  edit c
160992fdd1e7SBram Moolenaar  buffer #
161092fdd1e7SBram Moolenaar  py << trim EOF
161192fdd1e7SBram Moolenaar    try:
161292fdd1e7SBram Moolenaar      from __builtin__ import next
161392fdd1e7SBram Moolenaar    except ImportError:
161492fdd1e7SBram Moolenaar      next = lambda o: o.next()
161592fdd1e7SBram Moolenaar    # Check GCing iterator that was not fully exhausted
161692fdd1e7SBram Moolenaar    i = iter(vim.buffers)
161792fdd1e7SBram Moolenaar    cb.append('i:' + str(next(i)))
161892fdd1e7SBram Moolenaar    # and also check creating more than one iterator at a time
161992fdd1e7SBram Moolenaar    i2 = iter(vim.buffers)
162092fdd1e7SBram Moolenaar    cb.append('i2:' + str(next(i2)))
162192fdd1e7SBram Moolenaar    cb.append('i:' + str(next(i)))
162292fdd1e7SBram Moolenaar    # The following should trigger GC and not cause any problems
162392fdd1e7SBram Moolenaar    del i
162492fdd1e7SBram Moolenaar    del i2
162592fdd1e7SBram Moolenaar    i3 = iter(vim.buffers)
162692fdd1e7SBram Moolenaar    cb.append('i3:' + str(next(i3)))
162792fdd1e7SBram Moolenaar    del i3
162892fdd1e7SBram Moolenaar  EOF
162992fdd1e7SBram Moolenaar  call assert_equal(['i:<buffer Xfile>',
163092fdd1e7SBram Moolenaar        \ 'i2:<buffer Xfile>', 'i:<buffer a>', 'i3:<buffer Xfile>'],
163192fdd1e7SBram Moolenaar        \ getline(2, '$'))
163292fdd1e7SBram Moolenaar  %d
163392fdd1e7SBram Moolenaar
163492fdd1e7SBram Moolenaar  py << trim EOF
163592fdd1e7SBram Moolenaar    prevnum = 0
163692fdd1e7SBram Moolenaar    for b in vim.buffers:
163792fdd1e7SBram Moolenaar      # Check buffer order
163892fdd1e7SBram Moolenaar      if prevnum >= b.number:
163992fdd1e7SBram Moolenaar        cb.append('!!! Buffer numbers not in strictly ascending order')
164092fdd1e7SBram Moolenaar      # Check indexing: vim.buffers[number].number == number
164192fdd1e7SBram Moolenaar      cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + \
164292fdd1e7SBram Moolenaar                                                            '=' + repr(b))
164392fdd1e7SBram Moolenaar      prevnum = b.number
164492fdd1e7SBram Moolenaar    del prevnum
164592fdd1e7SBram Moolenaar
164692fdd1e7SBram Moolenaar    cb.append(str(len(vim.buffers)))
164792fdd1e7SBram Moolenaar  EOF
164892fdd1e7SBram Moolenaar  call assert_equal([bufnr('Xfile') .. ':<buffer Xfile>=<buffer Xfile>',
164992fdd1e7SBram Moolenaar        \ bufnr('a') .. ':<buffer a>=<buffer a>',
165092fdd1e7SBram Moolenaar        \ bufnr('b') .. ':<buffer b>=<buffer b>',
165192fdd1e7SBram Moolenaar        \ bufnr('c') .. ':<buffer c>=<buffer c>', '4'], getline(2, '$'))
165292fdd1e7SBram Moolenaar  %d
165392fdd1e7SBram Moolenaar
165492fdd1e7SBram Moolenaar  py << trim EOF
165592fdd1e7SBram Moolenaar    bnums = list(map(lambda b: b.number, vim.buffers))[1:]
165692fdd1e7SBram Moolenaar
165792fdd1e7SBram Moolenaar    # Test wiping out buffer with existing iterator
165892fdd1e7SBram Moolenaar    i4 = iter(vim.buffers)
165992fdd1e7SBram Moolenaar    cb.append('i4:' + str(next(i4)))
166092fdd1e7SBram Moolenaar    vim.command('bwipeout! ' + str(bnums.pop(0)))
166192fdd1e7SBram Moolenaar    try:
166292fdd1e7SBram Moolenaar      next(i4)
166392fdd1e7SBram Moolenaar    except vim.error:
166492fdd1e7SBram Moolenaar      pass
166592fdd1e7SBram Moolenaar    else:
166692fdd1e7SBram Moolenaar      cb.append('!!!! No vim.error')
166792fdd1e7SBram Moolenaar    i4 = iter(vim.buffers)
166892fdd1e7SBram Moolenaar    vim.command('bwipeout! ' + str(bnums.pop(-1)))
166992fdd1e7SBram Moolenaar    vim.command('bwipeout! ' + str(bnums.pop(-1)))
167092fdd1e7SBram Moolenaar    cb.append('i4:' + str(next(i4)))
167192fdd1e7SBram Moolenaar    try:
167292fdd1e7SBram Moolenaar      next(i4)
167392fdd1e7SBram Moolenaar    except StopIteration:
167492fdd1e7SBram Moolenaar      cb.append('StopIteration')
167592fdd1e7SBram Moolenaar    del i4
167692fdd1e7SBram Moolenaar    del bnums
167792fdd1e7SBram Moolenaar  EOF
167892fdd1e7SBram Moolenaar  call assert_equal(['i4:<buffer Xfile>',
167992fdd1e7SBram Moolenaar        \ 'i4:<buffer Xfile>', 'StopIteration'], getline(2, '$'))
168092fdd1e7SBram Moolenaar  %bw!
168192fdd1e7SBram Moolenaarendfunc
168292fdd1e7SBram Moolenaar
168392fdd1e7SBram Moolenaar" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
168492fdd1e7SBram Moolenaarfunc Test_python_tabpage_window()
168592fdd1e7SBram Moolenaar  %bw
168692fdd1e7SBram Moolenaar  edit Xfile
168792fdd1e7SBram Moolenaar  py cb = vim.current.buffer
168892fdd1e7SBram Moolenaar  tabnew 0
168992fdd1e7SBram Moolenaar  tabnew 1
169092fdd1e7SBram Moolenaar  vnew a.1
169192fdd1e7SBram Moolenaar  tabnew 2
169292fdd1e7SBram Moolenaar  vnew a.2
169392fdd1e7SBram Moolenaar  vnew b.2
169492fdd1e7SBram Moolenaar  vnew c.2
169592fdd1e7SBram Moolenaar
1696ab589463SBram Moolenaar  call assert_equal(4, pyeval('vim.current.window.tabpage.number'))
1697ab589463SBram Moolenaar
169892fdd1e7SBram Moolenaar  py << trim EOF
169992fdd1e7SBram Moolenaar    cb.append('Number of tabs: ' + str(len(vim.tabpages)))
170092fdd1e7SBram Moolenaar    cb.append('Current tab pages:')
170192fdd1e7SBram Moolenaar    def W(w):
170292fdd1e7SBram Moolenaar      if repr(w).find('(unknown)') != -1:
170392fdd1e7SBram Moolenaar        return '<window object (unknown)>'
170492fdd1e7SBram Moolenaar      else:
170592fdd1e7SBram Moolenaar        return repr(w)
170692fdd1e7SBram Moolenaar
170792fdd1e7SBram Moolenaar    start = len(cb)
170892fdd1e7SBram Moolenaar
170992fdd1e7SBram Moolenaar    def Cursor(w):
171092fdd1e7SBram Moolenaar      if w.buffer is cb:
171192fdd1e7SBram Moolenaar        return repr((start - w.cursor[0], w.cursor[1]))
171292fdd1e7SBram Moolenaar      else:
171392fdd1e7SBram Moolenaar        return repr(w.cursor)
171492fdd1e7SBram Moolenaar
171592fdd1e7SBram Moolenaar    for t in vim.tabpages:
171692fdd1e7SBram Moolenaar      cb.append('  ' + repr(t) + '(' + str(t.number) + ')' + ': ' + \
171792fdd1e7SBram Moolenaar                str(len(t.windows)) + ' windows, current is ' + W(t.window))
171892fdd1e7SBram Moolenaar      cb.append('  Windows:')
171992fdd1e7SBram Moolenaar      for w in t.windows:
172092fdd1e7SBram Moolenaar        cb.append('    ' + W(w) + '(' + str(w.number) + ')' + \
172192fdd1e7SBram Moolenaar                                  ': displays buffer ' + repr(w.buffer) + \
172292fdd1e7SBram Moolenaar                                  '; cursor is at ' + Cursor(w))
172392fdd1e7SBram Moolenaar        # Other values depend on the size of the terminal, so they are checked
172492fdd1e7SBram Moolenaar        # partly:
172592fdd1e7SBram Moolenaar        for attr in ('height', 'row', 'width', 'col'):
172692fdd1e7SBram Moolenaar          try:
172792fdd1e7SBram Moolenaar            aval = getattr(w, attr)
172892fdd1e7SBram Moolenaar            if type(aval) is not long:
172992fdd1e7SBram Moolenaar              raise TypeError
173092fdd1e7SBram Moolenaar            if aval < 0:
173192fdd1e7SBram Moolenaar              raise ValueError
173292fdd1e7SBram Moolenaar          except Exception:
173392fdd1e7SBram Moolenaar            cb.append('!!!!!! Error while getting attribute ' + attr + \
173492fdd1e7SBram Moolenaar                                            ': ' + sys.exc_type.__name__)
173592fdd1e7SBram Moolenaar        del aval
173692fdd1e7SBram Moolenaar        del attr
173792fdd1e7SBram Moolenaar        w.cursor = (len(w.buffer), 0)
173892fdd1e7SBram Moolenaar    del W
173992fdd1e7SBram Moolenaar    del Cursor
174092fdd1e7SBram Moolenaar    cb.append('Number of windows in current tab page: ' + \
174192fdd1e7SBram Moolenaar                                                    str(len(vim.windows)))
174292fdd1e7SBram Moolenaar    if list(vim.windows) != list(vim.current.tabpage.windows):
174392fdd1e7SBram Moolenaar      cb.append('!!!!!! Windows differ')
174492fdd1e7SBram Moolenaar  EOF
174592fdd1e7SBram Moolenaar
174692fdd1e7SBram Moolenaar  let expected =<< trim END
174792fdd1e7SBram Moolenaar    Number of tabs: 4
174892fdd1e7SBram Moolenaar    Current tab pages:
174992fdd1e7SBram Moolenaar      <tabpage 0>(1): 1 windows, current is <window object (unknown)>
175092fdd1e7SBram Moolenaar      Windows:
175192fdd1e7SBram Moolenaar        <window object (unknown)>(1): displays buffer <buffer Xfile>; cursor is at (2, 0)
175292fdd1e7SBram Moolenaar      <tabpage 1>(2): 1 windows, current is <window object (unknown)>
175392fdd1e7SBram Moolenaar      Windows:
175492fdd1e7SBram Moolenaar        <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
175592fdd1e7SBram Moolenaar      <tabpage 2>(3): 2 windows, current is <window object (unknown)>
175692fdd1e7SBram Moolenaar      Windows:
175792fdd1e7SBram Moolenaar        <window object (unknown)>(1): displays buffer <buffer a.1>; cursor is at (1, 0)
175892fdd1e7SBram Moolenaar        <window object (unknown)>(2): displays buffer <buffer 1>; cursor is at (1, 0)
175992fdd1e7SBram Moolenaar      <tabpage 3>(4): 4 windows, current is <window 0>
176092fdd1e7SBram Moolenaar      Windows:
176192fdd1e7SBram Moolenaar        <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
176292fdd1e7SBram Moolenaar        <window 1>(2): displays buffer <buffer b.2>; cursor is at (1, 0)
176392fdd1e7SBram Moolenaar        <window 2>(3): displays buffer <buffer a.2>; cursor is at (1, 0)
176492fdd1e7SBram Moolenaar        <window 3>(4): displays buffer <buffer 2>; cursor is at (1, 0)
176592fdd1e7SBram Moolenaar    Number of windows in current tab page: 4
176692fdd1e7SBram Moolenaar  END
176792fdd1e7SBram Moolenaar  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
176892fdd1e7SBram Moolenaar  %bw!
176992fdd1e7SBram Moolenaarendfunc
177092fdd1e7SBram Moolenaar
177192fdd1e7SBram Moolenaar" Test vim.current
177292fdd1e7SBram Moolenaarfunc Test_python_vim_current()
177392fdd1e7SBram Moolenaar  %bw
177492fdd1e7SBram Moolenaar  edit Xfile
177592fdd1e7SBram Moolenaar  py cb = vim.current.buffer
177692fdd1e7SBram Moolenaar  tabnew 0
177792fdd1e7SBram Moolenaar  tabnew 1
177892fdd1e7SBram Moolenaar  vnew a.1
177992fdd1e7SBram Moolenaar  tabnew 2
178092fdd1e7SBram Moolenaar  vnew a.2
178192fdd1e7SBram Moolenaar  vnew b.2
178292fdd1e7SBram Moolenaar  vnew c.2
178392fdd1e7SBram Moolenaar
178492fdd1e7SBram Moolenaar  py << trim EOF
178592fdd1e7SBram Moolenaar    def H(o):
178692fdd1e7SBram Moolenaar      return repr(o)
178792fdd1e7SBram Moolenaar    cb.append('Current tab page: ' + repr(vim.current.tabpage))
178892fdd1e7SBram Moolenaar    cb.append('Current window: ' + repr(vim.current.window) + ': ' + \
178992fdd1e7SBram Moolenaar               H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
179092fdd1e7SBram Moolenaar    cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + \
179192fdd1e7SBram Moolenaar               H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ \
179292fdd1e7SBram Moolenaar               ' is ' + H(vim.current.tabpage.window.buffer))
179392fdd1e7SBram Moolenaar    del H
179492fdd1e7SBram Moolenaar  EOF
179592fdd1e7SBram Moolenaar  let expected =<< trim END
179692fdd1e7SBram Moolenaar    Current tab page: <tabpage 3>
179792fdd1e7SBram Moolenaar    Current window: <window 0>: <window 0> is <window 0>
179892fdd1e7SBram Moolenaar    Current buffer: <buffer c.2>: <buffer c.2> is <buffer c.2> is <buffer c.2>
179992fdd1e7SBram Moolenaar  END
180092fdd1e7SBram Moolenaar  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
180192fdd1e7SBram Moolenaar  call deletebufline(bufnr('Xfile'), 1, '$')
180292fdd1e7SBram Moolenaar
180392fdd1e7SBram Moolenaar  " Assigning: fails
180492fdd1e7SBram Moolenaar  py << trim EOF
180592fdd1e7SBram Moolenaar    try:
180692fdd1e7SBram Moolenaar      vim.current.window = vim.tabpages[0].window
180792fdd1e7SBram Moolenaar    except ValueError:
180892fdd1e7SBram Moolenaar      cb.append('ValueError at assigning foreign tab window')
180992fdd1e7SBram Moolenaar
181092fdd1e7SBram Moolenaar    for attr in ('window', 'tabpage', 'buffer'):
181192fdd1e7SBram Moolenaar      try:
181292fdd1e7SBram Moolenaar        setattr(vim.current, attr, None)
181392fdd1e7SBram Moolenaar      except TypeError:
181492fdd1e7SBram Moolenaar        cb.append('Type error at assigning None to vim.current.' + attr)
181592fdd1e7SBram Moolenaar    del attr
181692fdd1e7SBram Moolenaar  EOF
181792fdd1e7SBram Moolenaar
181892fdd1e7SBram Moolenaar  let expected =<< trim END
181992fdd1e7SBram Moolenaar    ValueError at assigning foreign tab window
182092fdd1e7SBram Moolenaar    Type error at assigning None to vim.current.window
182192fdd1e7SBram Moolenaar    Type error at assigning None to vim.current.tabpage
182292fdd1e7SBram Moolenaar    Type error at assigning None to vim.current.buffer
182392fdd1e7SBram Moolenaar  END
182492fdd1e7SBram Moolenaar  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
182592fdd1e7SBram Moolenaar  call deletebufline(bufnr('Xfile'), 1, '$')
182692fdd1e7SBram Moolenaar
182792fdd1e7SBram Moolenaar  call setbufline(bufnr('Xfile'), 1, 'python interface')
182892fdd1e7SBram Moolenaar  py << trim EOF
182992fdd1e7SBram Moolenaar    # Assigning: success
183092fdd1e7SBram Moolenaar    vim.current.tabpage = vim.tabpages[-2]
183192fdd1e7SBram Moolenaar    vim.current.buffer = cb
183292fdd1e7SBram Moolenaar    vim.current.window = vim.windows[0]
183392fdd1e7SBram Moolenaar    vim.current.window.cursor = (len(vim.current.buffer), 0)
183492fdd1e7SBram Moolenaar    cb.append('Current tab page: ' + repr(vim.current.tabpage))
183592fdd1e7SBram Moolenaar    cb.append('Current window: ' + repr(vim.current.window))
183692fdd1e7SBram Moolenaar    cb.append('Current buffer: ' + repr(vim.current.buffer))
183792fdd1e7SBram Moolenaar    cb.append('Current line: ' + repr(vim.current.line))
183892fdd1e7SBram Moolenaar  EOF
183992fdd1e7SBram Moolenaar
184092fdd1e7SBram Moolenaar  let expected =<< trim END
184192fdd1e7SBram Moolenaar    Current tab page: <tabpage 2>
184292fdd1e7SBram Moolenaar    Current window: <window 0>
184392fdd1e7SBram Moolenaar    Current buffer: <buffer Xfile>
184492fdd1e7SBram Moolenaar    Current line: 'python interface'
184592fdd1e7SBram Moolenaar  END
184692fdd1e7SBram Moolenaar  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1847ab589463SBram Moolenaar  py vim.current.line = 'one line'
1848ab589463SBram Moolenaar  call assert_equal('one line', getline('.'))
184992fdd1e7SBram Moolenaar  call deletebufline(bufnr('Xfile'), 1, '$')
185092fdd1e7SBram Moolenaar
185192fdd1e7SBram Moolenaar  py << trim EOF
185292fdd1e7SBram Moolenaar    ws = list(vim.windows)
185392fdd1e7SBram Moolenaar    ts = list(vim.tabpages)
185492fdd1e7SBram Moolenaar    for b in vim.buffers:
185592fdd1e7SBram Moolenaar      if b is not cb:
185692fdd1e7SBram Moolenaar        vim.command('bwipeout! ' + str(b.number))
185792fdd1e7SBram Moolenaar    del b
185892fdd1e7SBram Moolenaar    cb.append('w.valid: ' + repr([w.valid for w in ws]))
185992fdd1e7SBram Moolenaar    cb.append('t.valid: ' + repr([t.valid for t in ts]))
186092fdd1e7SBram Moolenaar    del w
186192fdd1e7SBram Moolenaar    del t
186292fdd1e7SBram Moolenaar    del ts
186392fdd1e7SBram Moolenaar    del ws
186492fdd1e7SBram Moolenaar  EOF
186592fdd1e7SBram Moolenaar  let expected =<< trim END
186692fdd1e7SBram Moolenaar    w.valid: [True, False]
186792fdd1e7SBram Moolenaar    t.valid: [True, False, True, False]
186892fdd1e7SBram Moolenaar  END
186992fdd1e7SBram Moolenaar  call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
187092fdd1e7SBram Moolenaar  %bw!
187192fdd1e7SBram Moolenaarendfunc
187292fdd1e7SBram Moolenaar
187392fdd1e7SBram Moolenaar" Test types
187492fdd1e7SBram Moolenaarfunc Test_python_types()
187592fdd1e7SBram Moolenaar  %d
187692fdd1e7SBram Moolenaar  py cb = vim.current.buffer
187792fdd1e7SBram Moolenaar  py << trim EOF
187892fdd1e7SBram Moolenaar    for expr, attr in (
187992fdd1e7SBram Moolenaar      ('vim.vars',                         'Dictionary'),
188092fdd1e7SBram Moolenaar      ('vim.options',                      'Options'),
188192fdd1e7SBram Moolenaar      ('vim.bindeval("{}")',               'Dictionary'),
188292fdd1e7SBram Moolenaar      ('vim.bindeval("[]")',               'List'),
188392fdd1e7SBram Moolenaar      ('vim.bindeval("function(\'tr\')")', 'Function'),
188492fdd1e7SBram Moolenaar      ('vim.current.buffer',               'Buffer'),
188592fdd1e7SBram Moolenaar      ('vim.current.range',                'Range'),
188692fdd1e7SBram Moolenaar      ('vim.current.window',               'Window'),
188792fdd1e7SBram Moolenaar      ('vim.current.tabpage',              'TabPage'),
188892fdd1e7SBram Moolenaar    ):
188992fdd1e7SBram Moolenaar      cb.append(expr + ':' + attr + ':' + \
189092fdd1e7SBram Moolenaar                                repr(type(eval(expr)) is getattr(vim, attr)))
189192fdd1e7SBram Moolenaar    del expr
189292fdd1e7SBram Moolenaar    del attr
189392fdd1e7SBram Moolenaar  EOF
189492fdd1e7SBram Moolenaar  let expected =<< trim END
189592fdd1e7SBram Moolenaar    vim.vars:Dictionary:True
189692fdd1e7SBram Moolenaar    vim.options:Options:True
189792fdd1e7SBram Moolenaar    vim.bindeval("{}"):Dictionary:True
189892fdd1e7SBram Moolenaar    vim.bindeval("[]"):List:True
189992fdd1e7SBram Moolenaar    vim.bindeval("function('tr')"):Function:True
190092fdd1e7SBram Moolenaar    vim.current.buffer:Buffer:True
190192fdd1e7SBram Moolenaar    vim.current.range:Range:True
190292fdd1e7SBram Moolenaar    vim.current.window:Window:True
190392fdd1e7SBram Moolenaar    vim.current.tabpage:TabPage:True
190492fdd1e7SBram Moolenaar  END
190592fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
190692fdd1e7SBram Moolenaarendfunc
190792fdd1e7SBram Moolenaar
190892fdd1e7SBram Moolenaar" Test __dir__() method
190992fdd1e7SBram Moolenaarfunc Test_python_dir_method()
191092fdd1e7SBram Moolenaar  %d
191192fdd1e7SBram Moolenaar  py cb = vim.current.buffer
191292fdd1e7SBram Moolenaar  py << trim EOF
191392fdd1e7SBram Moolenaar    for name, o in (
191492fdd1e7SBram Moolenaar            ('current',    vim.current),
191592fdd1e7SBram Moolenaar            ('buffer',     vim.current.buffer),
191692fdd1e7SBram Moolenaar            ('window',     vim.current.window),
191792fdd1e7SBram Moolenaar            ('tabpage',    vim.current.tabpage),
191892fdd1e7SBram Moolenaar            ('range',      vim.current.range),
191992fdd1e7SBram Moolenaar            ('dictionary', vim.bindeval('{}')),
192092fdd1e7SBram Moolenaar            ('list',       vim.bindeval('[]')),
192192fdd1e7SBram Moolenaar            ('function',   vim.bindeval('function("tr")')),
192292fdd1e7SBram Moolenaar            ('output',     sys.stdout),
192392fdd1e7SBram Moolenaar        ):
192492fdd1e7SBram Moolenaar        cb.append(name + ':' + ','.join(dir(o)))
192592fdd1e7SBram Moolenaar    del name
192692fdd1e7SBram Moolenaar    del o
192792fdd1e7SBram Moolenaar  EOF
192892fdd1e7SBram Moolenaar  let expected =<< trim END
192992fdd1e7SBram Moolenaar    current:__dir__,__members__,buffer,line,range,tabpage,window
193092fdd1e7SBram Moolenaar    buffer:__dir__,__members__,append,mark,name,number,options,range,valid,vars
193192fdd1e7SBram Moolenaar    window:__dir__,__members__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width
193292fdd1e7SBram Moolenaar    tabpage:__dir__,__members__,number,valid,vars,window,windows
193392fdd1e7SBram Moolenaar    range:__dir__,__members__,append,end,start
193492fdd1e7SBram Moolenaar    dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
193592fdd1e7SBram Moolenaar    list:__dir__,__members__,extend,locked
193692fdd1e7SBram Moolenaar    function:__dir__,__members__,args,auto_rebind,self,softspace
193792fdd1e7SBram Moolenaar    output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
193892fdd1e7SBram Moolenaar  END
193992fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
194092fdd1e7SBram Moolenaarendfunc
194192fdd1e7SBram Moolenaar
194292fdd1e7SBram Moolenaar" Test vim.*.__new__
194392fdd1e7SBram Moolenaarfunc Test_python_new()
194492fdd1e7SBram Moolenaar  call assert_equal({}, pyeval('vim.Dictionary({})'))
194592fdd1e7SBram Moolenaar  call assert_equal({'a': 1}, pyeval('vim.Dictionary(a=1)'))
194692fdd1e7SBram Moolenaar  call assert_equal({'a': 1}, pyeval('vim.Dictionary(((''a'', 1),))'))
194792fdd1e7SBram Moolenaar  call assert_equal([], pyeval('vim.List()'))
194892fdd1e7SBram Moolenaar  call assert_equal(['a', 'b', 'c', '7'], pyeval('vim.List(iter(''abc7''))'))
194992fdd1e7SBram Moolenaar  call assert_equal(function('tr'), pyeval('vim.Function(''tr'')'))
195092fdd1e7SBram Moolenaar  call assert_equal(function('tr', [123, 3, 4]),
195192fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', args=[123, 3, 4])'))
195292fdd1e7SBram Moolenaar  call assert_equal(function('tr'), pyeval('vim.Function(''tr'', args=[])'))
195392fdd1e7SBram Moolenaar  call assert_equal(function('tr', {}),
195492fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', self={})'))
195592fdd1e7SBram Moolenaar  call assert_equal(function('tr', [123, 3, 4], {}),
195692fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})'))
195792fdd1e7SBram Moolenaar  call assert_equal(function('tr'),
195892fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', auto_rebind=False)'))
195992fdd1e7SBram Moolenaar  call assert_equal(function('tr', [123, 3, 4]),
196092fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)'))
196192fdd1e7SBram Moolenaar  call assert_equal(function('tr'),
196292fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', args=[], auto_rebind=False)'))
196392fdd1e7SBram Moolenaar  call assert_equal(function('tr', {}),
196492fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', self={}, auto_rebind=False)'))
196592fdd1e7SBram Moolenaar  call assert_equal(function('tr', [123, 3, 4], {}),
196692fdd1e7SBram Moolenaar        \ pyeval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)'))
196792fdd1e7SBram Moolenaarendfunc
196892fdd1e7SBram Moolenaar
196992fdd1e7SBram Moolenaar" Test vim.Function
197092fdd1e7SBram Moolenaarfunc Test_python_vim_func()
1971ab589463SBram Moolenaar  func Args(...)
197292fdd1e7SBram Moolenaar    return a:000
1973ab589463SBram Moolenaar  endfunc
197492fdd1e7SBram Moolenaar
1975ab589463SBram Moolenaar  func SelfArgs(...) dict
197692fdd1e7SBram Moolenaar    return [a:000, self]
1977ab589463SBram Moolenaar  endfunc
197892fdd1e7SBram Moolenaar
197992fdd1e7SBram Moolenaar  " The following four lines should not crash
198092fdd1e7SBram Moolenaar  let Pt = function('tr', [[]], {'l': []})
198192fdd1e7SBram Moolenaar  py Pt = vim.bindeval('Pt')
198292fdd1e7SBram Moolenaar  unlet Pt
198392fdd1e7SBram Moolenaar  py del Pt
198492fdd1e7SBram Moolenaar
1985ab589463SBram Moolenaar  call assert_equal(3, pyeval('vim.strwidth("a\tb")'))
1986ab589463SBram Moolenaar
198792fdd1e7SBram Moolenaar  %bw!
198892fdd1e7SBram Moolenaar  py cb = vim.current.buffer
198992fdd1e7SBram Moolenaar  py << trim EOF
199092fdd1e7SBram Moolenaar    def ecall(out_prefix, func, *args, **kwargs):
199192fdd1e7SBram Moolenaar        line = out_prefix + ': '
199292fdd1e7SBram Moolenaar        try:
199392fdd1e7SBram Moolenaar            ret = func(*args, **kwargs)
199492fdd1e7SBram Moolenaar        except Exception:
199592fdd1e7SBram Moolenaar            line += '!exception: ' + emsg(sys.exc_info())
199692fdd1e7SBram Moolenaar        else:
199792fdd1e7SBram Moolenaar            line += '!result: ' + vim.Function('string')(ret)
199892fdd1e7SBram Moolenaar        cb.append(line)
199992fdd1e7SBram Moolenaar    a = vim.Function('Args')
200092fdd1e7SBram Moolenaar    pa1 = vim.Function('Args', args=['abcArgsPA1'])
200192fdd1e7SBram Moolenaar    pa2 = vim.Function('Args', args=[])
200292fdd1e7SBram Moolenaar    pa3 = vim.Function('Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'})
200392fdd1e7SBram Moolenaar    pa4 = vim.Function('Args', self={'abcSelfPA4': 'abcSelfPA4Val'})
200492fdd1e7SBram Moolenaar    cb.append('a: ' + repr(a))
200592fdd1e7SBram Moolenaar    cb.append('pa1: ' + repr(pa1))
200692fdd1e7SBram Moolenaar    cb.append('pa2: ' + repr(pa2))
200792fdd1e7SBram Moolenaar    cb.append('pa3: ' + repr(pa3))
200892fdd1e7SBram Moolenaar    cb.append('pa4: ' + repr(pa4))
200992fdd1e7SBram Moolenaar    sa = vim.Function('SelfArgs')
201092fdd1e7SBram Moolenaar    psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1'])
201192fdd1e7SBram Moolenaar    psa2 = vim.Function('SelfArgs', args=[])
201292fdd1e7SBram Moolenaar    psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'})
201392fdd1e7SBram Moolenaar    psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'})
201492fdd1e7SBram Moolenaar    psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0)
201592fdd1e7SBram Moolenaar    psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=())
201692fdd1e7SBram Moolenaar    psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[])
201792fdd1e7SBram Moolenaar    psa8 = vim.Function('SelfArgs', auto_rebind=False)
201892fdd1e7SBram Moolenaar    psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True)
201992fdd1e7SBram Moolenaar    psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1)
202092fdd1e7SBram Moolenaar    psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'})
202192fdd1e7SBram Moolenaar    psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC'])
202292fdd1e7SBram Moolenaar    cb.append('sa: ' + repr(sa))
202392fdd1e7SBram Moolenaar    cb.append('psa1: ' + repr(psa1))
202492fdd1e7SBram Moolenaar    cb.append('psa2: ' + repr(psa2))
202592fdd1e7SBram Moolenaar    cb.append('psa3: ' + repr(psa3))
202692fdd1e7SBram Moolenaar    cb.append('psa4: ' + repr(psa4))
202792fdd1e7SBram Moolenaar    cb.append('psa5: ' + repr(psa5))
202892fdd1e7SBram Moolenaar    cb.append('psa6: ' + repr(psa6))
202992fdd1e7SBram Moolenaar    cb.append('psa7: ' + repr(psa7))
203092fdd1e7SBram Moolenaar    cb.append('psa8: ' + repr(psa8))
203192fdd1e7SBram Moolenaar    cb.append('psa9: ' + repr(psa9))
203292fdd1e7SBram Moolenaar    cb.append('psaA: ' + repr(psaA))
203392fdd1e7SBram Moolenaar    cb.append('psaB: ' + repr(psaB))
203492fdd1e7SBram Moolenaar    cb.append('psaC: ' + repr(psaC))
203592fdd1e7SBram Moolenaar
203692fdd1e7SBram Moolenaar    psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'})
203792fdd1e7SBram Moolenaar    psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]]
203892fdd1e7SBram Moolenaar    psar.self['rec'] = psar
203992fdd1e7SBram Moolenaar    psar.self['self'] = psar.self
204092fdd1e7SBram Moolenaar    psar.self['args'] = psar.args
204192fdd1e7SBram Moolenaar
204292fdd1e7SBram Moolenaar    try:
204392fdd1e7SBram Moolenaar        cb.append('psar: ' + repr(psar))
204492fdd1e7SBram Moolenaar    except Exception:
204592fdd1e7SBram Moolenaar        cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
204692fdd1e7SBram Moolenaar  EOF
204792fdd1e7SBram Moolenaar
204892fdd1e7SBram Moolenaar  let expected =<< trim END
204992fdd1e7SBram Moolenaar    a: <vim.Function 'Args'>
205092fdd1e7SBram Moolenaar    pa1: <vim.Function 'Args', args=['abcArgsPA1']>
205192fdd1e7SBram Moolenaar    pa2: <vim.Function 'Args'>
205292fdd1e7SBram Moolenaar    pa3: <vim.Function 'Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'}>
205392fdd1e7SBram Moolenaar    pa4: <vim.Function 'Args', self={'abcSelfPA4': 'abcSelfPA4Val'}>
205492fdd1e7SBram Moolenaar    sa: <vim.Function 'SelfArgs'>
205592fdd1e7SBram Moolenaar    psa1: <vim.Function 'SelfArgs', args=['abcArgsPSA1']>
205692fdd1e7SBram Moolenaar    psa2: <vim.Function 'SelfArgs'>
205792fdd1e7SBram Moolenaar    psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}>
205892fdd1e7SBram Moolenaar    psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}>
205992fdd1e7SBram Moolenaar    psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}>
206092fdd1e7SBram Moolenaar    psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}>
206192fdd1e7SBram Moolenaar    psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']>
206292fdd1e7SBram Moolenaar    psa8: <vim.Function 'SelfArgs'>
206392fdd1e7SBram Moolenaar    psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True>
206492fdd1e7SBram Moolenaar    psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True>
206592fdd1e7SBram Moolenaar    psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']>
206692fdd1e7SBram Moolenaar    psaC: <vim.Function 'SelfArgs'>
206792fdd1e7SBram 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'}]}>
206892fdd1e7SBram Moolenaar  END
206992fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
207092fdd1e7SBram Moolenaar  %d
207192fdd1e7SBram Moolenaar
207292fdd1e7SBram Moolenaar  call assert_equal(function('Args'), pyeval('a'))
207392fdd1e7SBram Moolenaar  call assert_equal(function('Args', ['abcArgsPA1']), pyeval('pa1'))
207492fdd1e7SBram Moolenaar  call assert_equal(function('Args'), pyeval('pa2'))
207592fdd1e7SBram Moolenaar  call assert_equal(function('Args', ['abcArgsPA3'], {'abcSelfPA3': 'abcSelfPA3Val'}), pyeval('pa3'))
207692fdd1e7SBram Moolenaar  call assert_equal(function('Args', {'abcSelfPA4': 'abcSelfPA4Val'}), pyeval('pa4'))
207792fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs'), pyeval('sa'))
207892fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', ['abcArgsPSA1']), pyeval('psa1'))
207992fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs'), pyeval('psa2'))
208092fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}), pyeval('psa3'))
208192fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}), pyeval('psa4'))
208292fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}), pyeval('psa5'))
208392fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}), pyeval('psa6'))
208492fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', ['abcArgsPSA7']), pyeval('psa7'))
208592fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs'), pyeval('psa8'))
208692fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}), pyeval('psa9'))
208792fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}), pyeval('psaA'))
208892fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs', ['abcArgsPSAB']), pyeval('psaB'))
208992fdd1e7SBram Moolenaar  call assert_equal(function('SelfArgs'), pyeval('psaC'))
209092fdd1e7SBram Moolenaar
209192fdd1e7SBram Moolenaar  let res = []
209292fdd1e7SBram Moolenaar  for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7',
209392fdd1e7SBram Moolenaar        \ 'psa8', 'psa9', 'psaA', 'psaB', 'psaC']
209492fdd1e7SBram Moolenaar    let d = {'f': pyeval(v)}
209592fdd1e7SBram Moolenaar    call add(res, 'd.' .. v .. '(): ' .. string(d.f()))
209692fdd1e7SBram Moolenaar  endfor
209792fdd1e7SBram Moolenaar
209892fdd1e7SBram Moolenaar  let expected =<< trim END
209992fdd1e7SBram Moolenaar    d.sa(): [[], {'f': function('SelfArgs')}]
210092fdd1e7SBram Moolenaar    d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}]
210192fdd1e7SBram Moolenaar    d.psa2(): [[], {'f': function('SelfArgs')}]
210292fdd1e7SBram Moolenaar    d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
210392fdd1e7SBram Moolenaar    d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
210492fdd1e7SBram Moolenaar    d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}]
210592fdd1e7SBram Moolenaar    d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}]
210692fdd1e7SBram Moolenaar    d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}]
210792fdd1e7SBram Moolenaar    d.psa8(): [[], {'f': function('SelfArgs')}]
210892fdd1e7SBram Moolenaar    d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}]
210992fdd1e7SBram Moolenaar    d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}]
211092fdd1e7SBram Moolenaar    d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}]
211192fdd1e7SBram Moolenaar    d.psaC(): [[], {'f': function('SelfArgs')}]
211292fdd1e7SBram Moolenaar  END
211392fdd1e7SBram Moolenaar  call assert_equal(expected, res)
211492fdd1e7SBram Moolenaar
211592fdd1e7SBram Moolenaar  py ecall('a()', a, )
211692fdd1e7SBram Moolenaar  py ecall('pa1()', pa1, )
211792fdd1e7SBram Moolenaar  py ecall('pa2()', pa2, )
211892fdd1e7SBram Moolenaar  py ecall('pa3()', pa3, )
211992fdd1e7SBram Moolenaar  py ecall('pa4()', pa4, )
212092fdd1e7SBram Moolenaar  py ecall('sa()', sa, )
212192fdd1e7SBram Moolenaar  py ecall('psa1()', psa1, )
212292fdd1e7SBram Moolenaar  py ecall('psa2()', psa2, )
212392fdd1e7SBram Moolenaar  py ecall('psa3()', psa3, )
212492fdd1e7SBram Moolenaar  py ecall('psa4()', psa4, )
212592fdd1e7SBram Moolenaar
212692fdd1e7SBram Moolenaar  py ecall('a(42, 43)', a, 42, 43)
212792fdd1e7SBram Moolenaar  py ecall('pa1(42, 43)', pa1, 42, 43)
212892fdd1e7SBram Moolenaar  py ecall('pa2(42, 43)', pa2, 42, 43)
212992fdd1e7SBram Moolenaar  py ecall('pa3(42, 43)', pa3, 42, 43)
213092fdd1e7SBram Moolenaar  py ecall('pa4(42, 43)', pa4, 42, 43)
213192fdd1e7SBram Moolenaar  py ecall('sa(42, 43)', sa, 42, 43)
213292fdd1e7SBram Moolenaar  py ecall('psa1(42, 43)', psa1, 42, 43)
213392fdd1e7SBram Moolenaar  py ecall('psa2(42, 43)', psa2, 42, 43)
213492fdd1e7SBram Moolenaar  py ecall('psa3(42, 43)', psa3, 42, 43)
213592fdd1e7SBram Moolenaar  py ecall('psa4(42, 43)', psa4, 42, 43)
213692fdd1e7SBram Moolenaar
213792fdd1e7SBram Moolenaar  py ecall('a(42, self={"20": 1})', a, 42, self={'20': 1})
213892fdd1e7SBram Moolenaar  py ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1})
213992fdd1e7SBram Moolenaar  py ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1})
214092fdd1e7SBram Moolenaar  py ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1})
214192fdd1e7SBram Moolenaar  py ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1})
214292fdd1e7SBram Moolenaar  py ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1})
214392fdd1e7SBram Moolenaar  py ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1})
214492fdd1e7SBram Moolenaar  py ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1})
214592fdd1e7SBram Moolenaar  py ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1})
214692fdd1e7SBram Moolenaar  py ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1})
214792fdd1e7SBram Moolenaar
214892fdd1e7SBram Moolenaar  py ecall('a(self={"20": 1})', a, self={'20': 1})
214992fdd1e7SBram Moolenaar  py ecall('pa1(self={"20": 1})', pa1, self={'20': 1})
215092fdd1e7SBram Moolenaar  py ecall('pa2(self={"20": 1})', pa2, self={'20': 1})
215192fdd1e7SBram Moolenaar  py ecall('pa3(self={"20": 1})', pa3, self={'20': 1})
215292fdd1e7SBram Moolenaar  py ecall('pa4(self={"20": 1})', pa4, self={'20': 1})
215392fdd1e7SBram Moolenaar  py ecall('sa(self={"20": 1})', sa, self={'20': 1})
215492fdd1e7SBram Moolenaar  py ecall('psa1(self={"20": 1})', psa1, self={'20': 1})
215592fdd1e7SBram Moolenaar  py ecall('psa2(self={"20": 1})', psa2, self={'20': 1})
215692fdd1e7SBram Moolenaar  py ecall('psa3(self={"20": 1})', psa3, self={'20': 1})
215792fdd1e7SBram Moolenaar  py ecall('psa4(self={"20": 1})', psa4, self={'20': 1})
215892fdd1e7SBram Moolenaar
215992fdd1e7SBram Moolenaar  py << trim EOF
216092fdd1e7SBram Moolenaar    def s(v):
216192fdd1e7SBram Moolenaar        if v is None:
216292fdd1e7SBram Moolenaar            return repr(v)
216392fdd1e7SBram Moolenaar        else:
216492fdd1e7SBram Moolenaar            return vim.Function('string')(v)
216592fdd1e7SBram Moolenaar
216692fdd1e7SBram Moolenaar    cb.append('a.args: ' + s(a.args))
216792fdd1e7SBram Moolenaar    cb.append('pa1.args: ' + s(pa1.args))
216892fdd1e7SBram Moolenaar    cb.append('pa2.args: ' + s(pa2.args))
216992fdd1e7SBram Moolenaar    cb.append('pa3.args: ' + s(pa3.args))
217092fdd1e7SBram Moolenaar    cb.append('pa4.args: ' + s(pa4.args))
217192fdd1e7SBram Moolenaar    cb.append('sa.args: ' + s(sa.args))
217292fdd1e7SBram Moolenaar    cb.append('psa1.args: ' + s(psa1.args))
217392fdd1e7SBram Moolenaar    cb.append('psa2.args: ' + s(psa2.args))
217492fdd1e7SBram Moolenaar    cb.append('psa3.args: ' + s(psa3.args))
217592fdd1e7SBram Moolenaar    cb.append('psa4.args: ' + s(psa4.args))
217692fdd1e7SBram Moolenaar
217792fdd1e7SBram Moolenaar    cb.append('a.self: ' + s(a.self))
217892fdd1e7SBram Moolenaar    cb.append('pa1.self: ' + s(pa1.self))
217992fdd1e7SBram Moolenaar    cb.append('pa2.self: ' + s(pa2.self))
218092fdd1e7SBram Moolenaar    cb.append('pa3.self: ' + s(pa3.self))
218192fdd1e7SBram Moolenaar    cb.append('pa4.self: ' + s(pa4.self))
218292fdd1e7SBram Moolenaar    cb.append('sa.self: ' + s(sa.self))
218392fdd1e7SBram Moolenaar    cb.append('psa1.self: ' + s(psa1.self))
218492fdd1e7SBram Moolenaar    cb.append('psa2.self: ' + s(psa2.self))
218592fdd1e7SBram Moolenaar    cb.append('psa3.self: ' + s(psa3.self))
218692fdd1e7SBram Moolenaar    cb.append('psa4.self: ' + s(psa4.self))
218792fdd1e7SBram Moolenaar
218892fdd1e7SBram Moolenaar    cb.append('a.name: ' + s(a.name))
218992fdd1e7SBram Moolenaar    cb.append('pa1.name: ' + s(pa1.name))
219092fdd1e7SBram Moolenaar    cb.append('pa2.name: ' + s(pa2.name))
219192fdd1e7SBram Moolenaar    cb.append('pa3.name: ' + s(pa3.name))
219292fdd1e7SBram Moolenaar    cb.append('pa4.name: ' + s(pa4.name))
219392fdd1e7SBram Moolenaar    cb.append('sa.name: ' + s(sa.name))
219492fdd1e7SBram Moolenaar    cb.append('psa1.name: ' + s(psa1.name))
219592fdd1e7SBram Moolenaar    cb.append('psa2.name: ' + s(psa2.name))
219692fdd1e7SBram Moolenaar    cb.append('psa3.name: ' + s(psa3.name))
219792fdd1e7SBram Moolenaar    cb.append('psa4.name: ' + s(psa4.name))
219892fdd1e7SBram Moolenaar
219992fdd1e7SBram Moolenaar    cb.append('a.auto_rebind: ' + s(a.auto_rebind))
220092fdd1e7SBram Moolenaar    cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind))
220192fdd1e7SBram Moolenaar    cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind))
220292fdd1e7SBram Moolenaar    cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind))
220392fdd1e7SBram Moolenaar    cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind))
220492fdd1e7SBram Moolenaar    cb.append('sa.auto_rebind: ' + s(sa.auto_rebind))
220592fdd1e7SBram Moolenaar    cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind))
220692fdd1e7SBram Moolenaar    cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind))
220792fdd1e7SBram Moolenaar    cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind))
220892fdd1e7SBram Moolenaar    cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind))
220992fdd1e7SBram Moolenaar    cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind))
221092fdd1e7SBram Moolenaar    cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind))
221192fdd1e7SBram Moolenaar    cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind))
221292fdd1e7SBram Moolenaar    cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind))
221392fdd1e7SBram Moolenaar    cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind))
221492fdd1e7SBram Moolenaar    cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind))
221592fdd1e7SBram Moolenaar    cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind))
221692fdd1e7SBram Moolenaar    cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind))
221792fdd1e7SBram Moolenaar
221892fdd1e7SBram Moolenaar    del s
221992fdd1e7SBram Moolenaar
222092fdd1e7SBram Moolenaar    del a
222192fdd1e7SBram Moolenaar    del pa1
222292fdd1e7SBram Moolenaar    del pa2
222392fdd1e7SBram Moolenaar    del pa3
222492fdd1e7SBram Moolenaar    del pa4
222592fdd1e7SBram Moolenaar    del sa
222692fdd1e7SBram Moolenaar    del psa1
222792fdd1e7SBram Moolenaar    del psa2
222892fdd1e7SBram Moolenaar    del psa3
222992fdd1e7SBram Moolenaar    del psa4
223092fdd1e7SBram Moolenaar    del psa5
223192fdd1e7SBram Moolenaar    del psa6
223292fdd1e7SBram Moolenaar    del psa7
223392fdd1e7SBram Moolenaar    del psa8
223492fdd1e7SBram Moolenaar    del psa9
223592fdd1e7SBram Moolenaar    del psaA
223692fdd1e7SBram Moolenaar    del psaB
223792fdd1e7SBram Moolenaar    del psaC
223892fdd1e7SBram Moolenaar    del psar
223992fdd1e7SBram Moolenaar
224092fdd1e7SBram Moolenaar    del ecall
224192fdd1e7SBram Moolenaar  EOF
224292fdd1e7SBram Moolenaar
224392fdd1e7SBram Moolenaar  let expected =<< trim END
224492fdd1e7SBram Moolenaar    a(): !result: []
224592fdd1e7SBram Moolenaar    pa1(): !result: ['abcArgsPA1']
224692fdd1e7SBram Moolenaar    pa2(): !result: []
224792fdd1e7SBram Moolenaar    pa3(): !result: ['abcArgsPA3']
224892fdd1e7SBram Moolenaar    pa4(): !result: []
224992fdd1e7SBram Moolenaar    sa(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
225092fdd1e7SBram Moolenaar    psa1(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
225192fdd1e7SBram Moolenaar    psa2(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
225292fdd1e7SBram Moolenaar    psa3(): !result: [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
225392fdd1e7SBram Moolenaar    psa4(): !result: [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
225492fdd1e7SBram Moolenaar    a(42, 43): !result: [42, 43]
225592fdd1e7SBram Moolenaar    pa1(42, 43): !result: ['abcArgsPA1', 42, 43]
225692fdd1e7SBram Moolenaar    pa2(42, 43): !result: [42, 43]
225792fdd1e7SBram Moolenaar    pa3(42, 43): !result: ['abcArgsPA3', 42, 43]
225892fdd1e7SBram Moolenaar    pa4(42, 43): !result: [42, 43]
225992fdd1e7SBram Moolenaar    sa(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
226092fdd1e7SBram Moolenaar    psa1(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
226192fdd1e7SBram Moolenaar    psa2(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
226292fdd1e7SBram Moolenaar    psa3(42, 43): !result: [['abcArgsPSA3', 42, 43], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
226392fdd1e7SBram Moolenaar    psa4(42, 43): !result: [[42, 43], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
226492fdd1e7SBram Moolenaar    a(42, self={"20": 1}): !result: [42]
226592fdd1e7SBram Moolenaar    pa1(42, self={"20": 1}): !result: ['abcArgsPA1', 42]
226692fdd1e7SBram Moolenaar    pa2(42, self={"20": 1}): !result: [42]
226792fdd1e7SBram Moolenaar    pa3(42, self={"20": 1}): !result: ['abcArgsPA3', 42]
226892fdd1e7SBram Moolenaar    pa4(42, self={"20": 1}): !result: [42]
226992fdd1e7SBram Moolenaar    sa(42, self={"20": 1}): !result: [[42], {'20': 1}]
227092fdd1e7SBram Moolenaar    psa1(42, self={"20": 1}): !result: [['abcArgsPSA1', 42], {'20': 1}]
227192fdd1e7SBram Moolenaar    psa2(42, self={"20": 1}): !result: [[42], {'20': 1}]
227292fdd1e7SBram Moolenaar    psa3(42, self={"20": 1}): !result: [['abcArgsPSA3', 42], {'20': 1}]
227392fdd1e7SBram Moolenaar    psa4(42, self={"20": 1}): !result: [[42], {'20': 1}]
227492fdd1e7SBram Moolenaar    a(self={"20": 1}): !result: []
227592fdd1e7SBram Moolenaar    pa1(self={"20": 1}): !result: ['abcArgsPA1']
227692fdd1e7SBram Moolenaar    pa2(self={"20": 1}): !result: []
227792fdd1e7SBram Moolenaar    pa3(self={"20": 1}): !result: ['abcArgsPA3']
227892fdd1e7SBram Moolenaar    pa4(self={"20": 1}): !result: []
227992fdd1e7SBram Moolenaar    sa(self={"20": 1}): !result: [[], {'20': 1}]
228092fdd1e7SBram Moolenaar    psa1(self={"20": 1}): !result: [['abcArgsPSA1'], {'20': 1}]
228192fdd1e7SBram Moolenaar    psa2(self={"20": 1}): !result: [[], {'20': 1}]
228292fdd1e7SBram Moolenaar    psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'20': 1}]
228392fdd1e7SBram Moolenaar    psa4(self={"20": 1}): !result: [[], {'20': 1}]
228492fdd1e7SBram Moolenaar    a.args: None
228592fdd1e7SBram Moolenaar    pa1.args: ['abcArgsPA1']
228692fdd1e7SBram Moolenaar    pa2.args: None
228792fdd1e7SBram Moolenaar    pa3.args: ['abcArgsPA3']
228892fdd1e7SBram Moolenaar    pa4.args: None
228992fdd1e7SBram Moolenaar    sa.args: None
229092fdd1e7SBram Moolenaar    psa1.args: ['abcArgsPSA1']
229192fdd1e7SBram Moolenaar    psa2.args: None
229292fdd1e7SBram Moolenaar    psa3.args: ['abcArgsPSA3']
229392fdd1e7SBram Moolenaar    psa4.args: None
229492fdd1e7SBram Moolenaar    a.self: None
229592fdd1e7SBram Moolenaar    pa1.self: None
229692fdd1e7SBram Moolenaar    pa2.self: None
229792fdd1e7SBram Moolenaar    pa3.self: {'abcSelfPA3': 'abcSelfPA3Val'}
229892fdd1e7SBram Moolenaar    pa4.self: {'abcSelfPA4': 'abcSelfPA4Val'}
229992fdd1e7SBram Moolenaar    sa.self: None
230092fdd1e7SBram Moolenaar    psa1.self: None
230192fdd1e7SBram Moolenaar    psa2.self: None
230292fdd1e7SBram Moolenaar    psa3.self: {'abcSelfPSA3': 'abcSelfPSA3Val'}
230392fdd1e7SBram Moolenaar    psa4.self: {'abcSelfPSA4': 'abcSelfPSA4Val'}
230492fdd1e7SBram Moolenaar    a.name: 'Args'
230592fdd1e7SBram Moolenaar    pa1.name: 'Args'
230692fdd1e7SBram Moolenaar    pa2.name: 'Args'
230792fdd1e7SBram Moolenaar    pa3.name: 'Args'
230892fdd1e7SBram Moolenaar    pa4.name: 'Args'
230992fdd1e7SBram Moolenaar    sa.name: 'SelfArgs'
231092fdd1e7SBram Moolenaar    psa1.name: 'SelfArgs'
231192fdd1e7SBram Moolenaar    psa2.name: 'SelfArgs'
231292fdd1e7SBram Moolenaar    psa3.name: 'SelfArgs'
231392fdd1e7SBram Moolenaar    psa4.name: 'SelfArgs'
231492fdd1e7SBram Moolenaar    a.auto_rebind: 1
231592fdd1e7SBram Moolenaar    pa1.auto_rebind: 1
231692fdd1e7SBram Moolenaar    pa2.auto_rebind: 1
231792fdd1e7SBram Moolenaar    pa3.auto_rebind: 0
231892fdd1e7SBram Moolenaar    pa4.auto_rebind: 0
231992fdd1e7SBram Moolenaar    sa.auto_rebind: 1
232092fdd1e7SBram Moolenaar    psa1.auto_rebind: 1
232192fdd1e7SBram Moolenaar    psa2.auto_rebind: 1
232292fdd1e7SBram Moolenaar    psa3.auto_rebind: 0
232392fdd1e7SBram Moolenaar    psa4.auto_rebind: 0
232492fdd1e7SBram Moolenaar    psa5.auto_rebind: 0
232592fdd1e7SBram Moolenaar    psa6.auto_rebind: 0
232692fdd1e7SBram Moolenaar    psa7.auto_rebind: 1
232792fdd1e7SBram Moolenaar    psa8.auto_rebind: 1
232892fdd1e7SBram Moolenaar    psa9.auto_rebind: 1
232992fdd1e7SBram Moolenaar    psaA.auto_rebind: 1
233092fdd1e7SBram Moolenaar    psaB.auto_rebind: 1
233192fdd1e7SBram Moolenaar    psaC.auto_rebind: 1
233292fdd1e7SBram Moolenaar  END
233392fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
233492fdd1e7SBram Moolenaar  %bw!
233592fdd1e7SBram Moolenaarendfunc
233692fdd1e7SBram Moolenaar
233792fdd1e7SBram Moolenaar" Test stdout/stderr
233892fdd1e7SBram Moolenaarfunc Test_python_stdin_stderr()
233992fdd1e7SBram Moolenaar  let caught_writeerr = 0
234092fdd1e7SBram Moolenaar  let caught_writelineerr = 0
234192fdd1e7SBram Moolenaar  redir => messages
234292fdd1e7SBram Moolenaar  py sys.stdout.write('abc8') ; sys.stdout.write('def')
234392fdd1e7SBram Moolenaar  try
234492fdd1e7SBram Moolenaar    py sys.stderr.write('abc9') ; sys.stderr.write('def')
234592fdd1e7SBram Moolenaar  catch /abc9def/
234692fdd1e7SBram Moolenaar    let caught_writeerr = 1
234792fdd1e7SBram Moolenaar  endtry
234892fdd1e7SBram Moolenaar  py sys.stdout.writelines(iter('abcA'))
234992fdd1e7SBram Moolenaar  try
235092fdd1e7SBram Moolenaar    py sys.stderr.writelines(iter('abcB'))
235192fdd1e7SBram Moolenaar  catch /abcB/
235292fdd1e7SBram Moolenaar    let caught_writelineerr = 1
235392fdd1e7SBram Moolenaar  endtry
235492fdd1e7SBram Moolenaar  redir END
235592fdd1e7SBram Moolenaar  call assert_equal("\nabc8def\nabcA", messages)
235692fdd1e7SBram Moolenaar  call assert_equal(1, caught_writeerr)
235792fdd1e7SBram Moolenaar  call assert_equal(1, caught_writelineerr)
235892fdd1e7SBram Moolenaarendfunc
235992fdd1e7SBram Moolenaar
236092fdd1e7SBram Moolenaar" Test subclassing
236192fdd1e7SBram Moolenaarfunc Test_python_subclass()
236292fdd1e7SBram Moolenaar  new
2363ab589463SBram Moolenaar  func Put(...)
236492fdd1e7SBram Moolenaar    return a:000
2365ab589463SBram Moolenaar  endfunc
236692fdd1e7SBram Moolenaar
236792fdd1e7SBram Moolenaar  py << trim EOF
236892fdd1e7SBram Moolenaar    class DupDict(vim.Dictionary):
236992fdd1e7SBram Moolenaar      def __setitem__(self, key, value):
237092fdd1e7SBram Moolenaar        super(DupDict, self).__setitem__(key, value)
237192fdd1e7SBram Moolenaar        super(DupDict, self).__setitem__('dup_' + key, value)
237292fdd1e7SBram Moolenaar    dd = DupDict()
237392fdd1e7SBram Moolenaar    dd['a'] = 'b'
237492fdd1e7SBram Moolenaar
237592fdd1e7SBram Moolenaar    class DupList(vim.List):
237692fdd1e7SBram Moolenaar      def __getitem__(self, idx):
237792fdd1e7SBram Moolenaar        return [super(DupList, self).__getitem__(idx)] * 2
237892fdd1e7SBram Moolenaar
237992fdd1e7SBram Moolenaar    dl = DupList()
238092fdd1e7SBram Moolenaar    dl2 = DupList(iter('abcC'))
238192fdd1e7SBram Moolenaar    dl.extend(dl2[0])
238292fdd1e7SBram Moolenaar
238392fdd1e7SBram Moolenaar    class DupFun(vim.Function):
238492fdd1e7SBram Moolenaar      def __call__(self, arg):
238592fdd1e7SBram Moolenaar        return super(DupFun, self).__call__(arg, arg)
238692fdd1e7SBram Moolenaar
238792fdd1e7SBram Moolenaar    df = DupFun('Put')
238892fdd1e7SBram Moolenaar  EOF
238992fdd1e7SBram Moolenaar
239092fdd1e7SBram Moolenaar  call assert_equal(['a', 'dup_a'], sort(keys(pyeval('dd'))))
239192fdd1e7SBram Moolenaar  call assert_equal(['a', 'a'], pyeval('dl'))
239292fdd1e7SBram Moolenaar  call assert_equal(['a', 'b', 'c', 'C'], pyeval('dl2'))
239392fdd1e7SBram Moolenaar  call assert_equal([2, 2], pyeval('df(2)'))
239492fdd1e7SBram Moolenaar  call assert_equal(1, pyeval('dl') is# pyeval('dl'))
239592fdd1e7SBram Moolenaar  call assert_equal(1, pyeval('dd') is# pyeval('dd'))
239692fdd1e7SBram Moolenaar  call assert_equal(function('Put'), pyeval('df'))
239792fdd1e7SBram Moolenaar  delfunction Put
239892fdd1e7SBram Moolenaar  py << trim EOF
239992fdd1e7SBram Moolenaar    del DupDict
240092fdd1e7SBram Moolenaar    del DupList
240192fdd1e7SBram Moolenaar    del DupFun
240292fdd1e7SBram Moolenaar    del dd
240392fdd1e7SBram Moolenaar    del dl
240492fdd1e7SBram Moolenaar    del dl2
240592fdd1e7SBram Moolenaar    del df
240692fdd1e7SBram Moolenaar  EOF
240792fdd1e7SBram Moolenaar  close!
240892fdd1e7SBram Moolenaarendfunc
240992fdd1e7SBram Moolenaar
241092fdd1e7SBram Moolenaar" Test chdir
241192fdd1e7SBram Moolenaarfunc Test_python_chdir()
241292fdd1e7SBram Moolenaar  new Xfile
241392fdd1e7SBram Moolenaar  py cb = vim.current.buffer
241492fdd1e7SBram Moolenaar  py << trim EOF
241592fdd1e7SBram Moolenaar    import os
241692fdd1e7SBram Moolenaar    fnamemodify = vim.Function('fnamemodify')
241792fdd1e7SBram Moolenaar    cb.append(fnamemodify('.', ':p:h:t'))
241892fdd1e7SBram Moolenaar    cb.append(vim.eval('@%'))
241992fdd1e7SBram Moolenaar    os.chdir('..')
242092fdd1e7SBram Moolenaar    path = fnamemodify('.', ':p:h:t')
24217d697960SBram Moolenaar    if path != 'src' and path != 'src2':
242292fdd1e7SBram Moolenaar      # Running tests from a shadow directory, so move up another level
242392fdd1e7SBram Moolenaar      # This will result in @% looking like shadow/testdir/Xfile, hence the
242492fdd1e7SBram Moolenaar      # extra fnamemodify
242592fdd1e7SBram Moolenaar      os.chdir('..')
242692fdd1e7SBram Moolenaar      cb.append(fnamemodify('.', ':p:h:t'))
242792fdd1e7SBram Moolenaar      cb.append(fnamemodify(vim.eval('@%'), ':s?^%s.??' % path).replace(os.path.sep, '/'))
242892fdd1e7SBram Moolenaar      os.chdir(path)
242992fdd1e7SBram Moolenaar      del path
243092fdd1e7SBram Moolenaar    else:
24317d697960SBram Moolenaar      # Also accept running from src2/testdir/ for MS-Windows CI.
24327d697960SBram Moolenaar      cb.append(fnamemodify('.', ':p:h:t').replace('src2', 'src'))
243392fdd1e7SBram Moolenaar      cb.append(vim.eval('@%').replace(os.path.sep, '/'))
243492fdd1e7SBram Moolenaar    os.chdir('testdir')
243592fdd1e7SBram Moolenaar    cb.append(fnamemodify('.', ':p:h:t'))
243692fdd1e7SBram Moolenaar    cb.append(vim.eval('@%'))
243792fdd1e7SBram Moolenaar    del fnamemodify
243892fdd1e7SBram Moolenaar  EOF
243992fdd1e7SBram Moolenaar  call assert_equal(['testdir', 'Xfile', 'src', 'testdir/Xfile', 'testdir',
244092fdd1e7SBram Moolenaar        \ 'Xfile'], getline(2, '$'))
244192fdd1e7SBram Moolenaar  close!
24420ab55d62SBram Moolenaar  call AssertException(["py vim.chdir(None)"], "Vim(python):TypeError:")
244392fdd1e7SBram Moolenaarendfunc
244492fdd1e7SBram Moolenaar
244592fdd1e7SBram Moolenaar" Test errors
244692fdd1e7SBram Moolenaarfunc Test_python_errors()
2447ab589463SBram Moolenaar  func F() dict
2448ab589463SBram Moolenaar  endfunc
244992fdd1e7SBram Moolenaar
2450ab589463SBram Moolenaar  func D()
2451ab589463SBram Moolenaar  endfunc
245292fdd1e7SBram Moolenaar
245392fdd1e7SBram Moolenaar  new
245492fdd1e7SBram Moolenaar  py cb = vim.current.buffer
245592fdd1e7SBram Moolenaar
245692fdd1e7SBram Moolenaar  py << trim EOF
245792fdd1e7SBram Moolenaar    d = vim.Dictionary()
245892fdd1e7SBram Moolenaar    ned = vim.Dictionary(foo='bar', baz='abcD')
245992fdd1e7SBram Moolenaar    dl = vim.Dictionary(a=1)
246092fdd1e7SBram Moolenaar    dl.locked = True
246192fdd1e7SBram Moolenaar    l = vim.List()
246292fdd1e7SBram Moolenaar    ll = vim.List('abcE')
246392fdd1e7SBram Moolenaar    ll.locked = True
246492fdd1e7SBram Moolenaar    nel = vim.List('abcO')
246592fdd1e7SBram Moolenaar    f = vim.Function('string')
246692fdd1e7SBram Moolenaar    fd = vim.Function('F')
246792fdd1e7SBram Moolenaar    fdel = vim.Function('D')
246892fdd1e7SBram Moolenaar    vim.command('delfunction D')
246992fdd1e7SBram Moolenaar
247092fdd1e7SBram Moolenaar    def subexpr_test(expr, name, subexprs):
247192fdd1e7SBram Moolenaar        cb.append('>>> Testing %s using %s' % (name, expr))
247292fdd1e7SBram Moolenaar        for subexpr in subexprs:
247392fdd1e7SBram Moolenaar            ee(expr % subexpr)
247492fdd1e7SBram Moolenaar        cb.append('<<< Finished')
247592fdd1e7SBram Moolenaar
247692fdd1e7SBram Moolenaar    def stringtochars_test(expr):
247792fdd1e7SBram Moolenaar        return subexpr_test(expr, 'StringToChars', (
247892fdd1e7SBram Moolenaar            '1',       # Fail type checks
247992fdd1e7SBram Moolenaar            'u"\\0"',  # Fail PyString_AsStringAndSize(bytes, , NULL) check
248092fdd1e7SBram Moolenaar            '"\\0"',   # Fail PyString_AsStringAndSize(object, , NULL) check
248192fdd1e7SBram Moolenaar        ))
248292fdd1e7SBram Moolenaar
248392fdd1e7SBram Moolenaar    class Mapping(object):
248492fdd1e7SBram Moolenaar        def __init__(self, d):
248592fdd1e7SBram Moolenaar            self.d = d
248692fdd1e7SBram Moolenaar
248792fdd1e7SBram Moolenaar        def __getitem__(self, key):
248892fdd1e7SBram Moolenaar            return self.d[key]
248992fdd1e7SBram Moolenaar
249092fdd1e7SBram Moolenaar        def keys(self):
249192fdd1e7SBram Moolenaar            return self.d.keys()
249292fdd1e7SBram Moolenaar
249392fdd1e7SBram Moolenaar        def items(self):
249492fdd1e7SBram Moolenaar            return self.d.items()
249592fdd1e7SBram Moolenaar
249692fdd1e7SBram Moolenaar    def convertfrompyobject_test(expr, recurse=True):
249792fdd1e7SBram Moolenaar        # pydict_to_tv
249892fdd1e7SBram Moolenaar        stringtochars_test(expr % '{%s : 1}')
249992fdd1e7SBram Moolenaar        if recurse:
250092fdd1e7SBram Moolenaar            convertfrompyobject_test(expr % '{"abcF" : %s}', False)
250192fdd1e7SBram Moolenaar        # pymap_to_tv
250292fdd1e7SBram Moolenaar        stringtochars_test(expr % 'Mapping({%s : 1})')
250392fdd1e7SBram Moolenaar        if recurse:
250492fdd1e7SBram Moolenaar            convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False)
250592fdd1e7SBram Moolenaar        # pyseq_to_tv
250692fdd1e7SBram Moolenaar        iter_test(expr)
250792fdd1e7SBram Moolenaar        return subexpr_test(expr, 'ConvertFromPyObject', (
250892fdd1e7SBram Moolenaar            'None',                 # Not conversible
250992fdd1e7SBram Moolenaar            '{"": 1}',              # Empty key not allowed
251092fdd1e7SBram Moolenaar            '{u"": 1}',             # Same, but with unicode object
251192fdd1e7SBram Moolenaar            'FailingMapping()',     #
251292fdd1e7SBram Moolenaar            'FailingMappingKey()',  #
251392fdd1e7SBram Moolenaar            'FailingNumber()',      #
251492fdd1e7SBram Moolenaar        ))
251592fdd1e7SBram Moolenaar
251692fdd1e7SBram Moolenaar    def convertfrompymapping_test(expr):
251792fdd1e7SBram Moolenaar        convertfrompyobject_test(expr)
251892fdd1e7SBram Moolenaar        return subexpr_test(expr, 'ConvertFromPyMapping', (
251992fdd1e7SBram Moolenaar            '[]',
252092fdd1e7SBram Moolenaar        ))
252192fdd1e7SBram Moolenaar
252292fdd1e7SBram Moolenaar    def iter_test(expr):
252392fdd1e7SBram Moolenaar        return subexpr_test(expr, '*Iter*', (
252492fdd1e7SBram Moolenaar            'FailingIter()',
252592fdd1e7SBram Moolenaar            'FailingIterNext()',
252692fdd1e7SBram Moolenaar        ))
252792fdd1e7SBram Moolenaar
252892fdd1e7SBram Moolenaar    def number_test(expr, natural=False, unsigned=False):
252992fdd1e7SBram Moolenaar        if natural:
253092fdd1e7SBram Moolenaar            unsigned = True
253192fdd1e7SBram Moolenaar        return subexpr_test(expr, 'NumberToLong', (
253292fdd1e7SBram Moolenaar            '[]',
253392fdd1e7SBram Moolenaar            'None',
253492fdd1e7SBram Moolenaar        ) + (unsigned and ('-1',) or ())
253592fdd1e7SBram Moolenaar        + (natural and ('0',) or ()))
253692fdd1e7SBram Moolenaar
253792fdd1e7SBram Moolenaar    class FailingTrue(object):
253892fdd1e7SBram Moolenaar        def __nonzero__(self):
253992fdd1e7SBram Moolenaar            raise NotImplementedError('bool')
254092fdd1e7SBram Moolenaar
254192fdd1e7SBram Moolenaar    class FailingIter(object):
254292fdd1e7SBram Moolenaar        def __iter__(self):
254392fdd1e7SBram Moolenaar            raise NotImplementedError('iter')
254492fdd1e7SBram Moolenaar
254592fdd1e7SBram Moolenaar    class FailingIterNext(object):
254692fdd1e7SBram Moolenaar        def __iter__(self):
254792fdd1e7SBram Moolenaar            return self
254892fdd1e7SBram Moolenaar
254992fdd1e7SBram Moolenaar        def next(self):
255092fdd1e7SBram Moolenaar            raise NotImplementedError('next')
255192fdd1e7SBram Moolenaar
255292fdd1e7SBram Moolenaar    class FailingIterNextN(object):
255392fdd1e7SBram Moolenaar        def __init__(self, n):
255492fdd1e7SBram Moolenaar            self.n = n
255592fdd1e7SBram Moolenaar
255692fdd1e7SBram Moolenaar        def __iter__(self):
255792fdd1e7SBram Moolenaar            return self
255892fdd1e7SBram Moolenaar
255992fdd1e7SBram Moolenaar        def next(self):
256092fdd1e7SBram Moolenaar            if self.n:
256192fdd1e7SBram Moolenaar                self.n -= 1
256292fdd1e7SBram Moolenaar                return 1
256392fdd1e7SBram Moolenaar            else:
256492fdd1e7SBram Moolenaar                raise NotImplementedError('next N')
256592fdd1e7SBram Moolenaar
256692fdd1e7SBram Moolenaar    class FailingMappingKey(object):
256792fdd1e7SBram Moolenaar        def __getitem__(self, item):
256892fdd1e7SBram Moolenaar            raise NotImplementedError('getitem:mappingkey')
256992fdd1e7SBram Moolenaar
257092fdd1e7SBram Moolenaar        def keys(self):
257192fdd1e7SBram Moolenaar            return list("abcH")
257292fdd1e7SBram Moolenaar
257392fdd1e7SBram Moolenaar    class FailingMapping(object):
257492fdd1e7SBram Moolenaar        def __getitem__(self):
257592fdd1e7SBram Moolenaar            raise NotImplementedError('getitem:mapping')
257692fdd1e7SBram Moolenaar
257792fdd1e7SBram Moolenaar        def keys(self):
257892fdd1e7SBram Moolenaar            raise NotImplementedError('keys')
257992fdd1e7SBram Moolenaar
258092fdd1e7SBram Moolenaar    class FailingList(list):
258192fdd1e7SBram Moolenaar        def __getitem__(self, idx):
258292fdd1e7SBram Moolenaar            if i == 2:
258392fdd1e7SBram Moolenaar                raise NotImplementedError('getitem:list')
258492fdd1e7SBram Moolenaar            else:
258592fdd1e7SBram Moolenaar                return super(FailingList, self).__getitem__(idx)
258692fdd1e7SBram Moolenaar
258792fdd1e7SBram Moolenaar    class NoArgsCall(object):
258892fdd1e7SBram Moolenaar        def __call__(self):
258992fdd1e7SBram Moolenaar            pass
259092fdd1e7SBram Moolenaar
259192fdd1e7SBram Moolenaar    class FailingCall(object):
259292fdd1e7SBram Moolenaar        def __call__(self, path):
259392fdd1e7SBram Moolenaar            raise NotImplementedError('call')
259492fdd1e7SBram Moolenaar
259592fdd1e7SBram Moolenaar    class FailingNumber(object):
259692fdd1e7SBram Moolenaar        def __int__(self):
259792fdd1e7SBram Moolenaar            raise NotImplementedError('int')
259892fdd1e7SBram Moolenaar
259992fdd1e7SBram Moolenaar    cb.append("> Output")
260092fdd1e7SBram Moolenaar    cb.append(">> OutputSetattr")
260192fdd1e7SBram Moolenaar    ee('del sys.stdout.softspace')
260292fdd1e7SBram Moolenaar    number_test('sys.stdout.softspace = %s', unsigned=True)
260392fdd1e7SBram Moolenaar    number_test('sys.stderr.softspace = %s', unsigned=True)
260492fdd1e7SBram Moolenaar    ee('assert sys.stdout.isatty()==False')
260592fdd1e7SBram Moolenaar    ee('assert sys.stdout.seekable()==False')
260692fdd1e7SBram Moolenaar    ee('sys.stdout.close()')
260792fdd1e7SBram Moolenaar    ee('sys.stdout.flush()')
260892fdd1e7SBram Moolenaar    ee('assert sys.stderr.isatty()==False')
260992fdd1e7SBram Moolenaar    ee('assert sys.stderr.seekable()==False')
261092fdd1e7SBram Moolenaar    ee('sys.stderr.close()')
261192fdd1e7SBram Moolenaar    ee('sys.stderr.flush()')
261292fdd1e7SBram Moolenaar    ee('sys.stdout.attr = None')
261392fdd1e7SBram Moolenaar    cb.append(">> OutputWrite")
261492fdd1e7SBram Moolenaar    ee('assert sys.stdout.writable()==True')
261592fdd1e7SBram Moolenaar    ee('assert sys.stdout.readable()==False')
261692fdd1e7SBram Moolenaar    ee('assert sys.stderr.writable()==True')
261792fdd1e7SBram Moolenaar    ee('assert sys.stderr.readable()==False')
261892fdd1e7SBram Moolenaar    ee('assert sys.stdout.closed()==False')
261992fdd1e7SBram Moolenaar    ee('assert sys.stderr.closed()==False')
262092fdd1e7SBram Moolenaar    ee('assert sys.stdout.errors=="strict"')
262192fdd1e7SBram Moolenaar    ee('assert sys.stderr.errors=="strict"')
262292fdd1e7SBram Moolenaar    ee('assert sys.stdout.encoding==sys.stderr.encoding')
262392fdd1e7SBram Moolenaar    ee('sys.stdout.write(None)')
262492fdd1e7SBram Moolenaar    cb.append(">> OutputWriteLines")
262592fdd1e7SBram Moolenaar    ee('sys.stdout.writelines(None)')
262692fdd1e7SBram Moolenaar    ee('sys.stdout.writelines([1])')
262792fdd1e7SBram Moolenaar    iter_test('sys.stdout.writelines(%s)')
262892fdd1e7SBram Moolenaar    cb.append("> VimCommand")
262992fdd1e7SBram Moolenaar    stringtochars_test('vim.command(%s)')
263092fdd1e7SBram Moolenaar    ee('vim.command("", 2)')
263192fdd1e7SBram Moolenaar    #! Not checked: vim->python exceptions translating: checked later
263292fdd1e7SBram Moolenaar    cb.append("> VimToPython")
263392fdd1e7SBram Moolenaar    #! Not checked: everything: needs errors in internal python functions
263492fdd1e7SBram Moolenaar    cb.append("> VimEval")
263592fdd1e7SBram Moolenaar    stringtochars_test('vim.eval(%s)')
263692fdd1e7SBram Moolenaar    ee('vim.eval("", FailingTrue())')
263792fdd1e7SBram Moolenaar    #! Not checked: everything: needs errors in internal python functions
263892fdd1e7SBram Moolenaar    cb.append("> VimEvalPy")
263992fdd1e7SBram Moolenaar    stringtochars_test('vim.bindeval(%s)')
264092fdd1e7SBram Moolenaar    ee('vim.eval("", 2)')
264192fdd1e7SBram Moolenaar    #! Not checked: vim->python exceptions translating: checked later
264292fdd1e7SBram Moolenaar    cb.append("> VimStrwidth")
264392fdd1e7SBram Moolenaar    stringtochars_test('vim.strwidth(%s)')
264492fdd1e7SBram Moolenaar    cb.append("> VimForeachRTP")
264592fdd1e7SBram Moolenaar    ee('vim.foreach_rtp(None)')
264692fdd1e7SBram Moolenaar    ee('vim.foreach_rtp(NoArgsCall())')
264792fdd1e7SBram Moolenaar    ee('vim.foreach_rtp(FailingCall())')
264892fdd1e7SBram Moolenaar    ee('vim.foreach_rtp(int, 2)')
264992fdd1e7SBram Moolenaar    cb.append('> import')
265092fdd1e7SBram Moolenaar    old_rtp = vim.options['rtp']
265192fdd1e7SBram Moolenaar    vim.options['rtp'] = os.getcwd().replace('\\', '\\\\').replace(',', '\\,')
265292fdd1e7SBram Moolenaar    ee('import xxx_no_such_module_xxx')
265392fdd1e7SBram Moolenaar    ee('import failing_import')
265492fdd1e7SBram Moolenaar    ee('import failing')
265592fdd1e7SBram Moolenaar    vim.options['rtp'] = old_rtp
265692fdd1e7SBram Moolenaar    del old_rtp
265792fdd1e7SBram Moolenaar    cb.append("> Options")
265892fdd1e7SBram Moolenaar    cb.append(">> OptionsItem")
265992fdd1e7SBram Moolenaar    ee('vim.options["abcQ"]')
266092fdd1e7SBram Moolenaar    ee('vim.options[""]')
266192fdd1e7SBram Moolenaar    stringtochars_test('vim.options[%s]')
266292fdd1e7SBram Moolenaar    cb.append(">> OptionsContains")
266392fdd1e7SBram Moolenaar    stringtochars_test('%s in vim.options')
266492fdd1e7SBram Moolenaar    cb.append("> Dictionary")
266592fdd1e7SBram Moolenaar    cb.append(">> DictionaryConstructor")
266692fdd1e7SBram Moolenaar    ee('vim.Dictionary("abcI")')
266792fdd1e7SBram Moolenaar    ##! Not checked: py_dict_alloc failure
266892fdd1e7SBram Moolenaar    cb.append(">> DictionarySetattr")
266992fdd1e7SBram Moolenaar    ee('del d.locked')
267092fdd1e7SBram Moolenaar    ee('d.locked = FailingTrue()')
267192fdd1e7SBram Moolenaar    ee('vim.vvars.locked = False')
267292fdd1e7SBram Moolenaar    ee('d.scope = True')
267392fdd1e7SBram Moolenaar    ee('d.xxx = True')
267492fdd1e7SBram Moolenaar    cb.append(">> _DictionaryItem")
267592fdd1e7SBram Moolenaar    ee('d.get("a", 2, 3)')
267692fdd1e7SBram Moolenaar    stringtochars_test('d.get(%s)')
267792fdd1e7SBram Moolenaar    ee('d.pop("a")')
267892fdd1e7SBram Moolenaar    ee('dl.pop("a")')
267992fdd1e7SBram Moolenaar    cb.append(">> DictionaryContains")
268092fdd1e7SBram Moolenaar    ee('"" in d')
268192fdd1e7SBram Moolenaar    ee('0 in d')
268292fdd1e7SBram Moolenaar    cb.append(">> DictionaryIterNext")
268392fdd1e7SBram Moolenaar    ee('for i in ned: ned["a"] = 1')
268492fdd1e7SBram Moolenaar    del i
268592fdd1e7SBram Moolenaar    cb.append(">> DictionaryAssItem")
268692fdd1e7SBram Moolenaar    ee('dl["b"] = 1')
268792fdd1e7SBram Moolenaar    stringtochars_test('d[%s] = 1')
268892fdd1e7SBram Moolenaar    convertfrompyobject_test('d["a"] = %s')
268992fdd1e7SBram Moolenaar    cb.append(">> DictionaryUpdate")
269092fdd1e7SBram Moolenaar    cb.append(">>> kwargs")
269192fdd1e7SBram Moolenaar    cb.append(">>> iter")
269292fdd1e7SBram Moolenaar    ee('d.update(FailingMapping())')
269392fdd1e7SBram Moolenaar    ee('d.update([FailingIterNext()])')
269492fdd1e7SBram Moolenaar    ee('d.update([FailingIterNextN(1)])')
269592fdd1e7SBram Moolenaar    iter_test('d.update(%s)')
269692fdd1e7SBram Moolenaar    convertfrompyobject_test('d.update(%s)')
269792fdd1e7SBram Moolenaar    stringtochars_test('d.update(((%s, 0),))')
269892fdd1e7SBram Moolenaar    convertfrompyobject_test('d.update((("a", %s),))')
269992fdd1e7SBram Moolenaar    cb.append(">> DictionaryPopItem")
270092fdd1e7SBram Moolenaar    ee('d.popitem(1, 2)')
270192fdd1e7SBram Moolenaar    cb.append(">> DictionaryHasKey")
270292fdd1e7SBram Moolenaar    ee('d.has_key()')
270392fdd1e7SBram Moolenaar    cb.append("> List")
270492fdd1e7SBram Moolenaar    cb.append(">> ListConstructor")
270592fdd1e7SBram Moolenaar    ee('vim.List(1, 2)')
270692fdd1e7SBram Moolenaar    ee('vim.List(a=1)')
270792fdd1e7SBram Moolenaar    iter_test('vim.List(%s)')
270892fdd1e7SBram Moolenaar    convertfrompyobject_test('vim.List([%s])')
270992fdd1e7SBram Moolenaar    cb.append(">> ListItem")
271092fdd1e7SBram Moolenaar    ee('l[1000]')
271192fdd1e7SBram Moolenaar    cb.append(">> ListAssItem")
271292fdd1e7SBram Moolenaar    ee('ll[1] = 2')
271392fdd1e7SBram Moolenaar    ee('l[1000] = 3')
271492fdd1e7SBram Moolenaar    cb.append(">> ListAssSlice")
271592fdd1e7SBram Moolenaar    ee('ll[1:100] = "abcJ"')
271692fdd1e7SBram Moolenaar    iter_test('l[:] = %s')
271792fdd1e7SBram Moolenaar    ee('nel[1:10:2]  = "abcK"')
271892fdd1e7SBram Moolenaar    cb.append(repr(tuple(nel)))
271992fdd1e7SBram Moolenaar    ee('nel[1:10:2]  = "a"')
272092fdd1e7SBram Moolenaar    cb.append(repr(tuple(nel)))
272192fdd1e7SBram Moolenaar    ee('nel[1:1:-1]  = "a"')
272292fdd1e7SBram Moolenaar    cb.append(repr(tuple(nel)))
272392fdd1e7SBram Moolenaar    ee('nel[:] = FailingIterNextN(2)')
272492fdd1e7SBram Moolenaar    cb.append(repr(tuple(nel)))
272592fdd1e7SBram Moolenaar    convertfrompyobject_test('l[:] = [%s]')
272692fdd1e7SBram Moolenaar    cb.append(">> ListConcatInPlace")
272792fdd1e7SBram Moolenaar    iter_test('l.extend(%s)')
272892fdd1e7SBram Moolenaar    convertfrompyobject_test('l.extend([%s])')
272992fdd1e7SBram Moolenaar    cb.append(">> ListSetattr")
273092fdd1e7SBram Moolenaar    ee('del l.locked')
273192fdd1e7SBram Moolenaar    ee('l.locked = FailingTrue()')
273292fdd1e7SBram Moolenaar    ee('l.xxx = True')
273392fdd1e7SBram Moolenaar    cb.append("> Function")
273492fdd1e7SBram Moolenaar    cb.append(">> FunctionConstructor")
273592fdd1e7SBram Moolenaar    cb.append(">>> FunctionConstructor")
273692fdd1e7SBram Moolenaar    ee('vim.Function("123")')
273792fdd1e7SBram Moolenaar    ee('vim.Function("xxx_non_existent_function_xxx")')
273892fdd1e7SBram Moolenaar    ee('vim.Function("xxx#non#existent#function#xxx")')
273992fdd1e7SBram Moolenaar    ee('vim.Function("xxx_non_existent_function_xxx2", args=[])')
274092fdd1e7SBram Moolenaar    ee('vim.Function("xxx_non_existent_function_xxx3", self={})')
274192fdd1e7SBram Moolenaar    ee('vim.Function("xxx_non_existent_function_xxx4", args=[], self={})')
274292fdd1e7SBram Moolenaar    cb.append(">>> FunctionNew")
274392fdd1e7SBram Moolenaar    ee('vim.Function("tr", self="abcFuncSelf")')
274492fdd1e7SBram Moolenaar    ee('vim.Function("tr", args=427423)')
274592fdd1e7SBram Moolenaar    ee('vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2")')
274692fdd1e7SBram Moolenaar    ee('vim.Function(self="abcFuncSelf2", args="abcFuncArgs2")')
274792fdd1e7SBram Moolenaar    ee('vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2")')
274892fdd1e7SBram Moolenaar    ee('vim.Function("tr", "")')
274992fdd1e7SBram Moolenaar    cb.append(">> FunctionCall")
275092fdd1e7SBram Moolenaar    convertfrompyobject_test('f(%s)')
275192fdd1e7SBram Moolenaar    convertfrompymapping_test('fd(self=%s)')
275292fdd1e7SBram Moolenaar    cb.append("> TabPage")
275392fdd1e7SBram Moolenaar    cb.append(">> TabPageAttr")
275492fdd1e7SBram Moolenaar    ee('vim.current.tabpage.xxx')
275592fdd1e7SBram Moolenaar    cb.append("> TabList")
275692fdd1e7SBram Moolenaar    cb.append(">> TabListItem")
275792fdd1e7SBram Moolenaar    ee('vim.tabpages[1000]')
275892fdd1e7SBram Moolenaar    cb.append("> Window")
275992fdd1e7SBram Moolenaar    cb.append(">> WindowAttr")
276092fdd1e7SBram Moolenaar    ee('vim.current.window.xxx')
276192fdd1e7SBram Moolenaar    cb.append(">> WindowSetattr")
276292fdd1e7SBram Moolenaar    ee('vim.current.window.buffer = 0')
276392fdd1e7SBram Moolenaar    ee('vim.current.window.cursor = (100000000, 100000000)')
276492fdd1e7SBram Moolenaar    ee('vim.current.window.cursor = True')
276592fdd1e7SBram Moolenaar    number_test('vim.current.window.height = %s', unsigned=True)
276692fdd1e7SBram Moolenaar    number_test('vim.current.window.width = %s', unsigned=True)
276792fdd1e7SBram Moolenaar    ee('vim.current.window.xxxxxx = True')
276892fdd1e7SBram Moolenaar    cb.append("> WinList")
276992fdd1e7SBram Moolenaar    cb.append(">> WinListItem")
277092fdd1e7SBram Moolenaar    ee('vim.windows[1000]')
277192fdd1e7SBram Moolenaar    cb.append("> Buffer")
277292fdd1e7SBram Moolenaar    cb.append(">> StringToLine (indirect)")
277392fdd1e7SBram Moolenaar    ee('vim.current.buffer[0] = "\\na"')
2774ab589463SBram Moolenaar    ee('vim.current.buffer[0] = u"\\na"')
277592fdd1e7SBram Moolenaar    cb.append(">> SetBufferLine (indirect)")
277692fdd1e7SBram Moolenaar    ee('vim.current.buffer[0] = True')
277792fdd1e7SBram Moolenaar    cb.append(">> SetBufferLineList (indirect)")
277892fdd1e7SBram Moolenaar    ee('vim.current.buffer[:] = True')
277992fdd1e7SBram Moolenaar    ee('vim.current.buffer[:] = ["\\na", "bc"]')
278092fdd1e7SBram Moolenaar    cb.append(">> InsertBufferLines (indirect)")
278192fdd1e7SBram Moolenaar    ee('vim.current.buffer.append(None)')
278292fdd1e7SBram Moolenaar    ee('vim.current.buffer.append(["\\na", "bc"])')
278392fdd1e7SBram Moolenaar    ee('vim.current.buffer.append("\\nbc")')
278492fdd1e7SBram Moolenaar    cb.append(">> RBItem")
278592fdd1e7SBram Moolenaar    ee('vim.current.buffer[100000000]')
278692fdd1e7SBram Moolenaar    cb.append(">> RBAsItem")
278792fdd1e7SBram Moolenaar    ee('vim.current.buffer[100000000] = ""')
278892fdd1e7SBram Moolenaar    cb.append(">> BufferAttr")
278992fdd1e7SBram Moolenaar    ee('vim.current.buffer.xxx')
279092fdd1e7SBram Moolenaar    cb.append(">> BufferSetattr")
279192fdd1e7SBram Moolenaar    ee('vim.current.buffer.name = True')
279292fdd1e7SBram Moolenaar    ee('vim.current.buffer.xxx = True')
279392fdd1e7SBram Moolenaar    cb.append(">> BufferMark")
279492fdd1e7SBram Moolenaar    ee('vim.current.buffer.mark(0)')
279592fdd1e7SBram Moolenaar    ee('vim.current.buffer.mark("abcM")')
279692fdd1e7SBram Moolenaar    ee('vim.current.buffer.mark("!")')
279792fdd1e7SBram Moolenaar    cb.append(">> BufferRange")
279892fdd1e7SBram Moolenaar    ee('vim.current.buffer.range(1, 2, 3)')
279992fdd1e7SBram Moolenaar    cb.append("> BufMap")
280092fdd1e7SBram Moolenaar    cb.append(">> BufMapItem")
280192fdd1e7SBram Moolenaar    ee('vim.buffers[100000000]')
280292fdd1e7SBram Moolenaar    number_test('vim.buffers[%s]', natural=True)
280392fdd1e7SBram Moolenaar    cb.append("> Current")
280492fdd1e7SBram Moolenaar    cb.append(">> CurrentGetattr")
280592fdd1e7SBram Moolenaar    ee('vim.current.xxx')
280692fdd1e7SBram Moolenaar    cb.append(">> CurrentSetattr")
280792fdd1e7SBram Moolenaar    ee('vim.current.line = True')
280892fdd1e7SBram Moolenaar    ee('vim.current.buffer = True')
280992fdd1e7SBram Moolenaar    ee('vim.current.window = True')
281092fdd1e7SBram Moolenaar    ee('vim.current.tabpage = True')
281192fdd1e7SBram Moolenaar    ee('vim.current.xxx = True')
281292fdd1e7SBram Moolenaar    del d
281392fdd1e7SBram Moolenaar    del ned
281492fdd1e7SBram Moolenaar    del dl
281592fdd1e7SBram Moolenaar    del l
281692fdd1e7SBram Moolenaar    del ll
281792fdd1e7SBram Moolenaar    del nel
281892fdd1e7SBram Moolenaar    del f
281992fdd1e7SBram Moolenaar    del fd
282092fdd1e7SBram Moolenaar    del fdel
282192fdd1e7SBram Moolenaar    del subexpr_test
282292fdd1e7SBram Moolenaar    del stringtochars_test
282392fdd1e7SBram Moolenaar    del Mapping
282492fdd1e7SBram Moolenaar    del convertfrompyobject_test
282592fdd1e7SBram Moolenaar    del convertfrompymapping_test
282692fdd1e7SBram Moolenaar    del iter_test
282792fdd1e7SBram Moolenaar    del number_test
282892fdd1e7SBram Moolenaar    del FailingTrue
282992fdd1e7SBram Moolenaar    del FailingIter
283092fdd1e7SBram Moolenaar    del FailingIterNext
283192fdd1e7SBram Moolenaar    del FailingIterNextN
283292fdd1e7SBram Moolenaar    del FailingMapping
283392fdd1e7SBram Moolenaar    del FailingMappingKey
283492fdd1e7SBram Moolenaar    del FailingList
283592fdd1e7SBram Moolenaar    del NoArgsCall
283692fdd1e7SBram Moolenaar    del FailingCall
283792fdd1e7SBram Moolenaar    del FailingNumber
283892fdd1e7SBram Moolenaar  EOF
283992fdd1e7SBram Moolenaar  delfunction F
284092fdd1e7SBram Moolenaar
284192fdd1e7SBram Moolenaar  let expected =<< trim END
284292fdd1e7SBram Moolenaar    > Output
284392fdd1e7SBram Moolenaar    >> OutputSetattr
284492fdd1e7SBram Moolenaar    del sys.stdout.softspace:AttributeError:('cannot delete OutputObject attributes',)
284592fdd1e7SBram Moolenaar    >>> Testing NumberToLong using sys.stdout.softspace = %s
284692fdd1e7SBram Moolenaar    sys.stdout.softspace = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
284792fdd1e7SBram Moolenaar    sys.stdout.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
284892fdd1e7SBram Moolenaar    sys.stdout.softspace = -1:ValueError:('number must be greater or equal to zero',)
284992fdd1e7SBram Moolenaar    <<< Finished
285092fdd1e7SBram Moolenaar    >>> Testing NumberToLong using sys.stderr.softspace = %s
285192fdd1e7SBram Moolenaar    sys.stderr.softspace = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
285292fdd1e7SBram Moolenaar    sys.stderr.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
285392fdd1e7SBram Moolenaar    sys.stderr.softspace = -1:ValueError:('number must be greater or equal to zero',)
285492fdd1e7SBram Moolenaar    <<< Finished
285592fdd1e7SBram Moolenaar    assert sys.stdout.isatty()==False:NOT FAILED
285692fdd1e7SBram Moolenaar    assert sys.stdout.seekable()==False:NOT FAILED
285792fdd1e7SBram Moolenaar    sys.stdout.close():NOT FAILED
285892fdd1e7SBram Moolenaar    sys.stdout.flush():NOT FAILED
285992fdd1e7SBram Moolenaar    assert sys.stderr.isatty()==False:NOT FAILED
286092fdd1e7SBram Moolenaar    assert sys.stderr.seekable()==False:NOT FAILED
286192fdd1e7SBram Moolenaar    sys.stderr.close():NOT FAILED
286292fdd1e7SBram Moolenaar    sys.stderr.flush():NOT FAILED
286392fdd1e7SBram Moolenaar    sys.stdout.attr = None:AttributeError:('invalid attribute: attr',)
286492fdd1e7SBram Moolenaar    >> OutputWrite
286592fdd1e7SBram Moolenaar    assert sys.stdout.writable()==True:NOT FAILED
286692fdd1e7SBram Moolenaar    assert sys.stdout.readable()==False:NOT FAILED
286792fdd1e7SBram Moolenaar    assert sys.stderr.writable()==True:NOT FAILED
286892fdd1e7SBram Moolenaar    assert sys.stderr.readable()==False:NOT FAILED
286992fdd1e7SBram Moolenaar    assert sys.stdout.closed()==False:NOT FAILED
287092fdd1e7SBram Moolenaar    assert sys.stderr.closed()==False:NOT FAILED
287192fdd1e7SBram Moolenaar    assert sys.stdout.errors=="strict":NOT FAILED
287292fdd1e7SBram Moolenaar    assert sys.stderr.errors=="strict":NOT FAILED
287392fdd1e7SBram Moolenaar    assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED
287492fdd1e7SBram Moolenaar    sys.stdout.write(None):TypeError:('coercing to Unicode: need string or buffer, NoneType found',)
287592fdd1e7SBram Moolenaar    >> OutputWriteLines
287692fdd1e7SBram Moolenaar    sys.stdout.writelines(None):TypeError:("'NoneType' object is not iterable",)
287792fdd1e7SBram Moolenaar    sys.stdout.writelines([1]):TypeError:('coercing to Unicode: need string or buffer, int found',)
287892fdd1e7SBram Moolenaar    >>> Testing *Iter* using sys.stdout.writelines(%s)
287992fdd1e7SBram Moolenaar    sys.stdout.writelines(FailingIter()):NotImplementedError:('iter',)
288092fdd1e7SBram Moolenaar    sys.stdout.writelines(FailingIterNext()):NotImplementedError:('next',)
288192fdd1e7SBram Moolenaar    <<< Finished
288292fdd1e7SBram Moolenaar    > VimCommand
288392fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.command(%s)
288492fdd1e7SBram Moolenaar    vim.command(1):TypeError:('expected str() or unicode() instance, but got int',)
288592fdd1e7SBram Moolenaar    vim.command(u"\0"):TypeError:('expected string without null bytes',)
288692fdd1e7SBram Moolenaar    vim.command("\0"):TypeError:('expected string without null bytes',)
288792fdd1e7SBram Moolenaar    <<< Finished
288892fdd1e7SBram Moolenaar    vim.command("", 2):TypeError:('command() takes exactly one argument (2 given)',)
288992fdd1e7SBram Moolenaar    > VimToPython
289092fdd1e7SBram Moolenaar    > VimEval
289192fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.eval(%s)
289292fdd1e7SBram Moolenaar    vim.eval(1):TypeError:('expected str() or unicode() instance, but got int',)
289392fdd1e7SBram Moolenaar    vim.eval(u"\0"):TypeError:('expected string without null bytes',)
289492fdd1e7SBram Moolenaar    vim.eval("\0"):TypeError:('expected string without null bytes',)
289592fdd1e7SBram Moolenaar    <<< Finished
289692fdd1e7SBram Moolenaar    vim.eval("", FailingTrue()):TypeError:('function takes exactly 1 argument (2 given)',)
289792fdd1e7SBram Moolenaar    > VimEvalPy
289892fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.bindeval(%s)
289992fdd1e7SBram Moolenaar    vim.bindeval(1):TypeError:('expected str() or unicode() instance, but got int',)
290092fdd1e7SBram Moolenaar    vim.bindeval(u"\0"):TypeError:('expected string without null bytes',)
290192fdd1e7SBram Moolenaar    vim.bindeval("\0"):TypeError:('expected string without null bytes',)
290292fdd1e7SBram Moolenaar    <<< Finished
290392fdd1e7SBram Moolenaar    vim.eval("", 2):TypeError:('function takes exactly 1 argument (2 given)',)
290492fdd1e7SBram Moolenaar    > VimStrwidth
290592fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.strwidth(%s)
290692fdd1e7SBram Moolenaar    vim.strwidth(1):TypeError:('expected str() or unicode() instance, but got int',)
290792fdd1e7SBram Moolenaar    vim.strwidth(u"\0"):TypeError:('expected string without null bytes',)
290892fdd1e7SBram Moolenaar    vim.strwidth("\0"):TypeError:('expected string without null bytes',)
290992fdd1e7SBram Moolenaar    <<< Finished
291092fdd1e7SBram Moolenaar    > VimForeachRTP
291192fdd1e7SBram Moolenaar    vim.foreach_rtp(None):TypeError:("'NoneType' object is not callable",)
291292fdd1e7SBram Moolenaar    vim.foreach_rtp(NoArgsCall()):TypeError:('__call__() takes exactly 1 argument (2 given)',)
291392fdd1e7SBram Moolenaar    vim.foreach_rtp(FailingCall()):NotImplementedError:('call',)
291492fdd1e7SBram Moolenaar    vim.foreach_rtp(int, 2):TypeError:('foreach_rtp() takes exactly one argument (2 given)',)
291592fdd1e7SBram Moolenaar    > import
291692fdd1e7SBram Moolenaar    import xxx_no_such_module_xxx:ImportError:('No module named xxx_no_such_module_xxx',)
291792fdd1e7SBram Moolenaar    import failing_import:ImportError:()
291892fdd1e7SBram Moolenaar    import failing:NotImplementedError:()
291992fdd1e7SBram Moolenaar    > Options
292092fdd1e7SBram Moolenaar    >> OptionsItem
292192fdd1e7SBram Moolenaar    vim.options["abcQ"]:KeyError:('abcQ',)
292292fdd1e7SBram Moolenaar    vim.options[""]:ValueError:('empty keys are not allowed',)
292392fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.options[%s]
292492fdd1e7SBram Moolenaar    vim.options[1]:TypeError:('expected str() or unicode() instance, but got int',)
292592fdd1e7SBram Moolenaar    vim.options[u"\0"]:TypeError:('expected string without null bytes',)
292692fdd1e7SBram Moolenaar    vim.options["\0"]:TypeError:('expected string without null bytes',)
292792fdd1e7SBram Moolenaar    <<< Finished
292892fdd1e7SBram Moolenaar    >> OptionsContains
292992fdd1e7SBram Moolenaar    >>> Testing StringToChars using %s in vim.options
293092fdd1e7SBram Moolenaar    1 in vim.options:TypeError:('expected str() or unicode() instance, but got int',)
293192fdd1e7SBram Moolenaar    u"\0" in vim.options:TypeError:('expected string without null bytes',)
293292fdd1e7SBram Moolenaar    "\0" in vim.options:TypeError:('expected string without null bytes',)
293392fdd1e7SBram Moolenaar    <<< Finished
293492fdd1e7SBram Moolenaar    > Dictionary
293592fdd1e7SBram Moolenaar    >> DictionaryConstructor
293692fdd1e7SBram Moolenaar    vim.Dictionary("abcI"):ValueError:('expected sequence element of size 2, but got sequence of size 1',)
293792fdd1e7SBram Moolenaar    >> DictionarySetattr
293892fdd1e7SBram Moolenaar    del d.locked:AttributeError:('cannot delete vim.Dictionary attributes',)
293992fdd1e7SBram Moolenaar    d.locked = FailingTrue():NotImplementedError:('bool',)
294092fdd1e7SBram Moolenaar    vim.vvars.locked = False:TypeError:('cannot modify fixed dictionary',)
294192fdd1e7SBram Moolenaar    d.scope = True:AttributeError:('cannot set attribute scope',)
294292fdd1e7SBram Moolenaar    d.xxx = True:AttributeError:('cannot set attribute xxx',)
294392fdd1e7SBram Moolenaar    >> _DictionaryItem
294492fdd1e7SBram Moolenaar    d.get("a", 2, 3):TypeError:('function takes at most 2 arguments (3 given)',)
294592fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.get(%s)
294692fdd1e7SBram Moolenaar    d.get(1):TypeError:('expected str() or unicode() instance, but got int',)
294792fdd1e7SBram Moolenaar    d.get(u"\0"):TypeError:('expected string without null bytes',)
294892fdd1e7SBram Moolenaar    d.get("\0"):TypeError:('expected string without null bytes',)
294992fdd1e7SBram Moolenaar    <<< Finished
295092fdd1e7SBram Moolenaar    d.pop("a"):KeyError:('a',)
295192fdd1e7SBram Moolenaar    dl.pop("a"):error:('dictionary is locked',)
295292fdd1e7SBram Moolenaar    >> DictionaryContains
295392fdd1e7SBram Moolenaar    "" in d:ValueError:('empty keys are not allowed',)
295492fdd1e7SBram Moolenaar    0 in d:TypeError:('expected str() or unicode() instance, but got int',)
295592fdd1e7SBram Moolenaar    >> DictionaryIterNext
295692fdd1e7SBram Moolenaar    for i in ned: ned["a"] = 1:RuntimeError:('hashtab changed during iteration',)
295792fdd1e7SBram Moolenaar    >> DictionaryAssItem
295892fdd1e7SBram Moolenaar    dl["b"] = 1:error:('dictionary is locked',)
295992fdd1e7SBram Moolenaar    >>> Testing StringToChars using d[%s] = 1
296092fdd1e7SBram Moolenaar    d[1] = 1:TypeError:('expected str() or unicode() instance, but got int',)
296192fdd1e7SBram Moolenaar    d[u"\0"] = 1:TypeError:('expected string without null bytes',)
296292fdd1e7SBram Moolenaar    d["\0"] = 1:TypeError:('expected string without null bytes',)
296392fdd1e7SBram Moolenaar    <<< Finished
296492fdd1e7SBram Moolenaar    >>> Testing StringToChars using d["a"] = {%s : 1}
296592fdd1e7SBram Moolenaar    d["a"] = {1 : 1}:TypeError:('expected str() or unicode() instance, but got int',)
296692fdd1e7SBram Moolenaar    d["a"] = {u"\0" : 1}:TypeError:('expected string without null bytes',)
296792fdd1e7SBram Moolenaar    d["a"] = {"\0" : 1}:TypeError:('expected string without null bytes',)
296892fdd1e7SBram Moolenaar    <<< Finished
296992fdd1e7SBram Moolenaar    >>> Testing StringToChars using d["a"] = {"abcF" : {%s : 1}}
297092fdd1e7SBram Moolenaar    d["a"] = {"abcF" : {1 : 1}}:TypeError:('expected str() or unicode() instance, but got int',)
297192fdd1e7SBram Moolenaar    d["a"] = {"abcF" : {u"\0" : 1}}:TypeError:('expected string without null bytes',)
297292fdd1e7SBram Moolenaar    d["a"] = {"abcF" : {"\0" : 1}}:TypeError:('expected string without null bytes',)
297392fdd1e7SBram Moolenaar    <<< Finished
297492fdd1e7SBram Moolenaar    >>> Testing StringToChars using d["a"] = {"abcF" : Mapping({%s : 1})}
297592fdd1e7SBram Moolenaar    d["a"] = {"abcF" : Mapping({1 : 1})}:TypeError:('expected str() or unicode() instance, but got int',)
297692fdd1e7SBram Moolenaar    d["a"] = {"abcF" : Mapping({u"\0" : 1})}:TypeError:('expected string without null bytes',)
297792fdd1e7SBram Moolenaar    d["a"] = {"abcF" : Mapping({"\0" : 1})}:TypeError:('expected string without null bytes',)
297892fdd1e7SBram Moolenaar    <<< Finished
297992fdd1e7SBram Moolenaar    >>> Testing *Iter* using d["a"] = {"abcF" : %s}
298092fdd1e7SBram Moolenaar    d["a"] = {"abcF" : FailingIter()}:TypeError:('unable to convert FailingIter to a Vim structure',)
298192fdd1e7SBram Moolenaar    d["a"] = {"abcF" : FailingIterNext()}:NotImplementedError:('next',)
298292fdd1e7SBram Moolenaar    <<< Finished
298392fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d["a"] = {"abcF" : %s}
298492fdd1e7SBram Moolenaar    d["a"] = {"abcF" : None}:NOT FAILED
298592fdd1e7SBram Moolenaar    d["a"] = {"abcF" : {"": 1}}:ValueError:('empty keys are not allowed',)
298692fdd1e7SBram Moolenaar    d["a"] = {"abcF" : {u"": 1}}:ValueError:('empty keys are not allowed',)
298792fdd1e7SBram Moolenaar    d["a"] = {"abcF" : FailingMapping()}:NotImplementedError:('keys',)
298892fdd1e7SBram Moolenaar    d["a"] = {"abcF" : FailingMappingKey()}:NotImplementedError:('getitem:mappingkey',)
298992fdd1e7SBram Moolenaar    d["a"] = {"abcF" : FailingNumber()}:TypeError:('long() argument must be a string or a number',)
299092fdd1e7SBram Moolenaar    <<< Finished
299192fdd1e7SBram Moolenaar    >>> Testing StringToChars using d["a"] = Mapping({%s : 1})
299292fdd1e7SBram Moolenaar    d["a"] = Mapping({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
299392fdd1e7SBram Moolenaar    d["a"] = Mapping({u"\0" : 1}):TypeError:('expected string without null bytes',)
299492fdd1e7SBram Moolenaar    d["a"] = Mapping({"\0" : 1}):TypeError:('expected string without null bytes',)
299592fdd1e7SBram Moolenaar    <<< Finished
299692fdd1e7SBram Moolenaar    >>> Testing StringToChars using d["a"] = Mapping({"abcG" : {%s : 1}})
299792fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
299892fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
299992fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
300092fdd1e7SBram Moolenaar    <<< Finished
300192fdd1e7SBram Moolenaar    >>> Testing StringToChars using d["a"] = Mapping({"abcG" : Mapping({%s : 1})})
300292fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
300392fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
300492fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
300592fdd1e7SBram Moolenaar    <<< Finished
300692fdd1e7SBram Moolenaar    >>> Testing *Iter* using d["a"] = Mapping({"abcG" : %s})
300792fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
300892fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : FailingIterNext()}):NotImplementedError:('next',)
300992fdd1e7SBram Moolenaar    <<< Finished
301092fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d["a"] = Mapping({"abcG" : %s})
301192fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : None}):NOT FAILED
301292fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : {"": 1}}):ValueError:('empty keys are not allowed',)
301392fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : {u"": 1}}):ValueError:('empty keys are not allowed',)
301492fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : FailingMapping()}):NotImplementedError:('keys',)
301592fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
301692fdd1e7SBram Moolenaar    d["a"] = Mapping({"abcG" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
301792fdd1e7SBram Moolenaar    <<< Finished
301892fdd1e7SBram Moolenaar    >>> Testing *Iter* using d["a"] = %s
301992fdd1e7SBram Moolenaar    d["a"] = FailingIter():TypeError:('unable to convert FailingIter to a Vim structure',)
302092fdd1e7SBram Moolenaar    d["a"] = FailingIterNext():NotImplementedError:('next',)
302192fdd1e7SBram Moolenaar    <<< Finished
302292fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d["a"] = %s
302392fdd1e7SBram Moolenaar    d["a"] = None:NOT FAILED
302492fdd1e7SBram Moolenaar    d["a"] = {"": 1}:ValueError:('empty keys are not allowed',)
302592fdd1e7SBram Moolenaar    d["a"] = {u"": 1}:ValueError:('empty keys are not allowed',)
302692fdd1e7SBram Moolenaar    d["a"] = FailingMapping():NotImplementedError:('keys',)
302792fdd1e7SBram Moolenaar    d["a"] = FailingMappingKey():NotImplementedError:('getitem:mappingkey',)
302892fdd1e7SBram Moolenaar    d["a"] = FailingNumber():TypeError:('long() argument must be a string or a number',)
302992fdd1e7SBram Moolenaar    <<< Finished
303092fdd1e7SBram Moolenaar    >> DictionaryUpdate
303192fdd1e7SBram Moolenaar    >>> kwargs
303292fdd1e7SBram Moolenaar    >>> iter
303392fdd1e7SBram Moolenaar    d.update(FailingMapping()):NotImplementedError:('keys',)
303492fdd1e7SBram Moolenaar    d.update([FailingIterNext()]):NotImplementedError:('next',)
303592fdd1e7SBram Moolenaar    d.update([FailingIterNextN(1)]):NotImplementedError:('next N',)
303692fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update(%s)
303792fdd1e7SBram Moolenaar    d.update(FailingIter()):NotImplementedError:('iter',)
303892fdd1e7SBram Moolenaar    d.update(FailingIterNext()):NotImplementedError:('next',)
303992fdd1e7SBram Moolenaar    <<< Finished
304092fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update({%s : 1})
304192fdd1e7SBram Moolenaar    d.update({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
304292fdd1e7SBram Moolenaar    d.update({u"\0" : 1}):TypeError:('expected string without null bytes',)
304392fdd1e7SBram Moolenaar    d.update({"\0" : 1}):TypeError:('expected string without null bytes',)
304492fdd1e7SBram Moolenaar    <<< Finished
304592fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update({"abcF" : {%s : 1}})
304692fdd1e7SBram Moolenaar    d.update({"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
304792fdd1e7SBram Moolenaar    d.update({"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
304892fdd1e7SBram Moolenaar    d.update({"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
304992fdd1e7SBram Moolenaar    <<< Finished
305092fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update({"abcF" : Mapping({%s : 1})})
305192fdd1e7SBram Moolenaar    d.update({"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
305292fdd1e7SBram Moolenaar    d.update({"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
305392fdd1e7SBram Moolenaar    d.update({"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
305492fdd1e7SBram Moolenaar    <<< Finished
305592fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update({"abcF" : %s})
305692fdd1e7SBram Moolenaar    d.update({"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
305792fdd1e7SBram Moolenaar    d.update({"abcF" : FailingIterNext()}):NotImplementedError:('next',)
305892fdd1e7SBram Moolenaar    <<< Finished
305992fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d.update({"abcF" : %s})
306092fdd1e7SBram Moolenaar    d.update({"abcF" : None}):NOT FAILED
306192fdd1e7SBram Moolenaar    d.update({"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
306292fdd1e7SBram Moolenaar    d.update({"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
306392fdd1e7SBram Moolenaar    d.update({"abcF" : FailingMapping()}):NotImplementedError:('keys',)
306492fdd1e7SBram Moolenaar    d.update({"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
306592fdd1e7SBram Moolenaar    d.update({"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
306692fdd1e7SBram Moolenaar    <<< Finished
306792fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update(Mapping({%s : 1}))
306892fdd1e7SBram Moolenaar    d.update(Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
306992fdd1e7SBram Moolenaar    d.update(Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
307092fdd1e7SBram Moolenaar    d.update(Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
307192fdd1e7SBram Moolenaar    <<< Finished
307292fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update(Mapping({"abcG" : {%s : 1}}))
307392fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
307492fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
307592fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
307692fdd1e7SBram Moolenaar    <<< Finished
307792fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update(Mapping({"abcG" : Mapping({%s : 1})}))
307892fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
307992fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
308092fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
308192fdd1e7SBram Moolenaar    <<< Finished
308292fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update(Mapping({"abcG" : %s}))
308392fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
308492fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
308592fdd1e7SBram Moolenaar    <<< Finished
308692fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d.update(Mapping({"abcG" : %s}))
308792fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : None})):NOT FAILED
308892fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
308992fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
309092fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
309192fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
309292fdd1e7SBram Moolenaar    d.update(Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
309392fdd1e7SBram Moolenaar    <<< Finished
309492fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update(%s)
309592fdd1e7SBram Moolenaar    d.update(FailingIter()):NotImplementedError:('iter',)
309692fdd1e7SBram Moolenaar    d.update(FailingIterNext()):NotImplementedError:('next',)
309792fdd1e7SBram Moolenaar    <<< Finished
309892fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d.update(%s)
309992fdd1e7SBram Moolenaar    d.update(None):TypeError:("'NoneType' object is not iterable",)
310092fdd1e7SBram Moolenaar    d.update({"": 1}):ValueError:('empty keys are not allowed',)
310192fdd1e7SBram Moolenaar    d.update({u"": 1}):ValueError:('empty keys are not allowed',)
310292fdd1e7SBram Moolenaar    d.update(FailingMapping()):NotImplementedError:('keys',)
310392fdd1e7SBram Moolenaar    d.update(FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
310492fdd1e7SBram Moolenaar    d.update(FailingNumber()):TypeError:("'FailingNumber' object is not iterable",)
310592fdd1e7SBram Moolenaar    <<< Finished
310692fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update(((%s, 0),))
310792fdd1e7SBram Moolenaar    d.update(((1, 0),)):TypeError:('expected str() or unicode() instance, but got int',)
310892fdd1e7SBram Moolenaar    d.update(((u"\0", 0),)):TypeError:('expected string without null bytes',)
310992fdd1e7SBram Moolenaar    d.update((("\0", 0),)):TypeError:('expected string without null bytes',)
311092fdd1e7SBram Moolenaar    <<< Finished
311192fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update((("a", {%s : 1}),))
311292fdd1e7SBram Moolenaar    d.update((("a", {1 : 1}),)):TypeError:('expected str() or unicode() instance, but got int',)
311392fdd1e7SBram Moolenaar    d.update((("a", {u"\0" : 1}),)):TypeError:('expected string without null bytes',)
311492fdd1e7SBram Moolenaar    d.update((("a", {"\0" : 1}),)):TypeError:('expected string without null bytes',)
311592fdd1e7SBram Moolenaar    <<< Finished
311692fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update((("a", {"abcF" : {%s : 1}}),))
311792fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : {1 : 1}}),)):TypeError:('expected str() or unicode() instance, but got int',)
311892fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : {u"\0" : 1}}),)):TypeError:('expected string without null bytes',)
311992fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : {"\0" : 1}}),)):TypeError:('expected string without null bytes',)
312092fdd1e7SBram Moolenaar    <<< Finished
312192fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update((("a", {"abcF" : Mapping({%s : 1})}),))
312292fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : Mapping({1 : 1})}),)):TypeError:('expected str() or unicode() instance, but got int',)
312392fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : Mapping({u"\0" : 1})}),)):TypeError:('expected string without null bytes',)
312492fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : Mapping({"\0" : 1})}),)):TypeError:('expected string without null bytes',)
312592fdd1e7SBram Moolenaar    <<< Finished
312692fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update((("a", {"abcF" : %s}),))
312792fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : FailingIter()}),)):TypeError:('unable to convert FailingIter to a Vim structure',)
312892fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : FailingIterNext()}),)):NotImplementedError:('next',)
312992fdd1e7SBram Moolenaar    <<< Finished
313092fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d.update((("a", {"abcF" : %s}),))
313192fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : None}),)):error:("failed to add key 'a' to dictionary",)
313292fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : {"": 1}}),)):ValueError:('empty keys are not allowed',)
313392fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : {u"": 1}}),)):ValueError:('empty keys are not allowed',)
313492fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : FailingMapping()}),)):NotImplementedError:('keys',)
313592fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : FailingMappingKey()}),)):NotImplementedError:('getitem:mappingkey',)
313692fdd1e7SBram Moolenaar    d.update((("a", {"abcF" : FailingNumber()}),)):TypeError:('long() argument must be a string or a number',)
313792fdd1e7SBram Moolenaar    <<< Finished
313892fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update((("a", Mapping({%s : 1})),))
313992fdd1e7SBram Moolenaar    d.update((("a", Mapping({1 : 1})),)):TypeError:('expected str() or unicode() instance, but got int',)
314092fdd1e7SBram Moolenaar    d.update((("a", Mapping({u"\0" : 1})),)):TypeError:('expected string without null bytes',)
314192fdd1e7SBram Moolenaar    d.update((("a", Mapping({"\0" : 1})),)):TypeError:('expected string without null bytes',)
314292fdd1e7SBram Moolenaar    <<< Finished
314392fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : {%s : 1}})),))
314492fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : {1 : 1}})),)):TypeError:('expected str() or unicode() instance, but got int',)
314592fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : {u"\0" : 1}})),)):TypeError:('expected string without null bytes',)
314692fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : {"\0" : 1}})),)):TypeError:('expected string without null bytes',)
314792fdd1e7SBram Moolenaar    <<< Finished
314892fdd1e7SBram Moolenaar    >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : Mapping({%s : 1})})),))
314992fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : Mapping({1 : 1})})),)):TypeError:('expected str() or unicode() instance, but got int',)
315092fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : Mapping({u"\0" : 1})})),)):TypeError:('expected string without null bytes',)
315192fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : Mapping({"\0" : 1})})),)):TypeError:('expected string without null bytes',)
315292fdd1e7SBram Moolenaar    <<< Finished
315392fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update((("a", Mapping({"abcG" : %s})),))
315492fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : FailingIter()})),)):TypeError:('unable to convert FailingIter to a Vim structure',)
315592fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : FailingIterNext()})),)):NotImplementedError:('next',)
315692fdd1e7SBram Moolenaar    <<< Finished
315792fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d.update((("a", Mapping({"abcG" : %s})),))
315892fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : None})),)):error:("failed to add key 'a' to dictionary",)
315992fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : {"": 1}})),)):ValueError:('empty keys are not allowed',)
316092fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : {u"": 1}})),)):ValueError:('empty keys are not allowed',)
316192fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : FailingMapping()})),)):NotImplementedError:('keys',)
316292fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : FailingMappingKey()})),)):NotImplementedError:('getitem:mappingkey',)
316392fdd1e7SBram Moolenaar    d.update((("a", Mapping({"abcG" : FailingNumber()})),)):TypeError:('long() argument must be a string or a number',)
316492fdd1e7SBram Moolenaar    <<< Finished
316592fdd1e7SBram Moolenaar    >>> Testing *Iter* using d.update((("a", %s),))
316692fdd1e7SBram Moolenaar    d.update((("a", FailingIter()),)):TypeError:('unable to convert FailingIter to a Vim structure',)
316792fdd1e7SBram Moolenaar    d.update((("a", FailingIterNext()),)):NotImplementedError:('next',)
316892fdd1e7SBram Moolenaar    <<< Finished
316992fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using d.update((("a", %s),))
317092fdd1e7SBram Moolenaar    d.update((("a", None),)):error:("failed to add key 'a' to dictionary",)
317192fdd1e7SBram Moolenaar    d.update((("a", {"": 1}),)):ValueError:('empty keys are not allowed',)
317292fdd1e7SBram Moolenaar    d.update((("a", {u"": 1}),)):ValueError:('empty keys are not allowed',)
317392fdd1e7SBram Moolenaar    d.update((("a", FailingMapping()),)):NotImplementedError:('keys',)
317492fdd1e7SBram Moolenaar    d.update((("a", FailingMappingKey()),)):NotImplementedError:('getitem:mappingkey',)
317592fdd1e7SBram Moolenaar    d.update((("a", FailingNumber()),)):TypeError:('long() argument must be a string or a number',)
317692fdd1e7SBram Moolenaar    <<< Finished
317792fdd1e7SBram Moolenaar    >> DictionaryPopItem
317892fdd1e7SBram Moolenaar    d.popitem(1, 2):TypeError:('popitem() takes no arguments (2 given)',)
317992fdd1e7SBram Moolenaar    >> DictionaryHasKey
318092fdd1e7SBram Moolenaar    d.has_key():TypeError:('has_key() takes exactly one argument (0 given)',)
318192fdd1e7SBram Moolenaar    > List
318292fdd1e7SBram Moolenaar    >> ListConstructor
318392fdd1e7SBram Moolenaar    vim.List(1, 2):TypeError:('function takes at most 1 argument (2 given)',)
318492fdd1e7SBram Moolenaar    vim.List(a=1):TypeError:('list constructor does not accept keyword arguments',)
318592fdd1e7SBram Moolenaar    >>> Testing *Iter* using vim.List(%s)
318692fdd1e7SBram Moolenaar    vim.List(FailingIter()):NotImplementedError:('iter',)
318792fdd1e7SBram Moolenaar    vim.List(FailingIterNext()):NotImplementedError:('next',)
318892fdd1e7SBram Moolenaar    <<< Finished
318992fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.List([{%s : 1}])
319092fdd1e7SBram Moolenaar    vim.List([{1 : 1}]):TypeError:('expected str() or unicode() instance, but got int',)
319192fdd1e7SBram Moolenaar    vim.List([{u"\0" : 1}]):TypeError:('expected string without null bytes',)
319292fdd1e7SBram Moolenaar    vim.List([{"\0" : 1}]):TypeError:('expected string without null bytes',)
319392fdd1e7SBram Moolenaar    <<< Finished
319492fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.List([{"abcF" : {%s : 1}}])
319592fdd1e7SBram Moolenaar    vim.List([{"abcF" : {1 : 1}}]):TypeError:('expected str() or unicode() instance, but got int',)
319692fdd1e7SBram Moolenaar    vim.List([{"abcF" : {u"\0" : 1}}]):TypeError:('expected string without null bytes',)
319792fdd1e7SBram Moolenaar    vim.List([{"abcF" : {"\0" : 1}}]):TypeError:('expected string without null bytes',)
319892fdd1e7SBram Moolenaar    <<< Finished
319992fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.List([{"abcF" : Mapping({%s : 1})}])
320092fdd1e7SBram Moolenaar    vim.List([{"abcF" : Mapping({1 : 1})}]):TypeError:('expected str() or unicode() instance, but got int',)
320192fdd1e7SBram Moolenaar    vim.List([{"abcF" : Mapping({u"\0" : 1})}]):TypeError:('expected string without null bytes',)
320292fdd1e7SBram Moolenaar    vim.List([{"abcF" : Mapping({"\0" : 1})}]):TypeError:('expected string without null bytes',)
320392fdd1e7SBram Moolenaar    <<< Finished
320492fdd1e7SBram Moolenaar    >>> Testing *Iter* using vim.List([{"abcF" : %s}])
320592fdd1e7SBram Moolenaar    vim.List([{"abcF" : FailingIter()}]):TypeError:('unable to convert FailingIter to a Vim structure',)
320692fdd1e7SBram Moolenaar    vim.List([{"abcF" : FailingIterNext()}]):NotImplementedError:('next',)
320792fdd1e7SBram Moolenaar    <<< Finished
320892fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using vim.List([{"abcF" : %s}])
320992fdd1e7SBram Moolenaar    vim.List([{"abcF" : None}]):NOT FAILED
321092fdd1e7SBram Moolenaar    vim.List([{"abcF" : {"": 1}}]):ValueError:('empty keys are not allowed',)
321192fdd1e7SBram Moolenaar    vim.List([{"abcF" : {u"": 1}}]):ValueError:('empty keys are not allowed',)
321292fdd1e7SBram Moolenaar    vim.List([{"abcF" : FailingMapping()}]):NotImplementedError:('keys',)
321392fdd1e7SBram Moolenaar    vim.List([{"abcF" : FailingMappingKey()}]):NotImplementedError:('getitem:mappingkey',)
321492fdd1e7SBram Moolenaar    vim.List([{"abcF" : FailingNumber()}]):TypeError:('long() argument must be a string or a number',)
321592fdd1e7SBram Moolenaar    <<< Finished
321692fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.List([Mapping({%s : 1})])
321792fdd1e7SBram Moolenaar    vim.List([Mapping({1 : 1})]):TypeError:('expected str() or unicode() instance, but got int',)
321892fdd1e7SBram Moolenaar    vim.List([Mapping({u"\0" : 1})]):TypeError:('expected string without null bytes',)
321992fdd1e7SBram Moolenaar    vim.List([Mapping({"\0" : 1})]):TypeError:('expected string without null bytes',)
322092fdd1e7SBram Moolenaar    <<< Finished
322192fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.List([Mapping({"abcG" : {%s : 1}})])
322292fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : {1 : 1}})]):TypeError:('expected str() or unicode() instance, but got int',)
322392fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : {u"\0" : 1}})]):TypeError:('expected string without null bytes',)
322492fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : {"\0" : 1}})]):TypeError:('expected string without null bytes',)
322592fdd1e7SBram Moolenaar    <<< Finished
322692fdd1e7SBram Moolenaar    >>> Testing StringToChars using vim.List([Mapping({"abcG" : Mapping({%s : 1})})])
322792fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : Mapping({1 : 1})})]):TypeError:('expected str() or unicode() instance, but got int',)
322892fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : Mapping({u"\0" : 1})})]):TypeError:('expected string without null bytes',)
322992fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : Mapping({"\0" : 1})})]):TypeError:('expected string without null bytes',)
323092fdd1e7SBram Moolenaar    <<< Finished
323192fdd1e7SBram Moolenaar    >>> Testing *Iter* using vim.List([Mapping({"abcG" : %s})])
323292fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : FailingIter()})]):TypeError:('unable to convert FailingIter to a Vim structure',)
323392fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : FailingIterNext()})]):NotImplementedError:('next',)
323492fdd1e7SBram Moolenaar    <<< Finished
323592fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using vim.List([Mapping({"abcG" : %s})])
323692fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : None})]):NOT FAILED
323792fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : {"": 1}})]):ValueError:('empty keys are not allowed',)
323892fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : {u"": 1}})]):ValueError:('empty keys are not allowed',)
323992fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : FailingMapping()})]):NotImplementedError:('keys',)
324092fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : FailingMappingKey()})]):NotImplementedError:('getitem:mappingkey',)
324192fdd1e7SBram Moolenaar    vim.List([Mapping({"abcG" : FailingNumber()})]):TypeError:('long() argument must be a string or a number',)
324292fdd1e7SBram Moolenaar    <<< Finished
324392fdd1e7SBram Moolenaar    >>> Testing *Iter* using vim.List([%s])
324492fdd1e7SBram Moolenaar    vim.List([FailingIter()]):TypeError:('unable to convert FailingIter to a Vim structure',)
324592fdd1e7SBram Moolenaar    vim.List([FailingIterNext()]):NotImplementedError:('next',)
324692fdd1e7SBram Moolenaar    <<< Finished
324792fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using vim.List([%s])
324892fdd1e7SBram Moolenaar    vim.List([None]):NOT FAILED
324992fdd1e7SBram Moolenaar    vim.List([{"": 1}]):ValueError:('empty keys are not allowed',)
325092fdd1e7SBram Moolenaar    vim.List([{u"": 1}]):ValueError:('empty keys are not allowed',)
325192fdd1e7SBram Moolenaar    vim.List([FailingMapping()]):NotImplementedError:('keys',)
325292fdd1e7SBram Moolenaar    vim.List([FailingMappingKey()]):NotImplementedError:('getitem:mappingkey',)
325392fdd1e7SBram Moolenaar    vim.List([FailingNumber()]):TypeError:('long() argument must be a string or a number',)
325492fdd1e7SBram Moolenaar    <<< Finished
325592fdd1e7SBram Moolenaar    >> ListItem
325692fdd1e7SBram Moolenaar    l[1000]:IndexError:('list index out of range',)
325792fdd1e7SBram Moolenaar    >> ListAssItem
325892fdd1e7SBram Moolenaar    ll[1] = 2:error:('list is locked',)
325992fdd1e7SBram Moolenaar    l[1000] = 3:IndexError:('list index out of range',)
326092fdd1e7SBram Moolenaar    >> ListAssSlice
326192fdd1e7SBram Moolenaar    ll[1:100] = "abcJ":error:('list is locked',)
326292fdd1e7SBram Moolenaar    >>> Testing *Iter* using l[:] = %s
326392fdd1e7SBram Moolenaar    l[:] = FailingIter():NotImplementedError:('iter',)
326492fdd1e7SBram Moolenaar    l[:] = FailingIterNext():NotImplementedError:('next',)
326592fdd1e7SBram Moolenaar    <<< Finished
326692fdd1e7SBram Moolenaar    nel[1:10:2]  = "abcK":ValueError:('attempt to assign sequence of size greater than 2 to extended slice',)
326792fdd1e7SBram Moolenaar    ('a', 'b', 'c', 'O')
326892fdd1e7SBram Moolenaar    nel[1:10:2]  = "a":ValueError:('attempt to assign sequence of size 1 to extended slice of size 2',)
326992fdd1e7SBram Moolenaar    ('a', 'b', 'c', 'O')
327092fdd1e7SBram Moolenaar    nel[1:1:-1]  = "a":ValueError:('attempt to assign sequence of size greater than 0 to extended slice',)
327192fdd1e7SBram Moolenaar    ('a', 'b', 'c', 'O')
327292fdd1e7SBram Moolenaar    nel[:] = FailingIterNextN(2):NotImplementedError:('next N',)
327392fdd1e7SBram Moolenaar    ('a', 'b', 'c', 'O')
327492fdd1e7SBram Moolenaar    >>> Testing StringToChars using l[:] = [{%s : 1}]
327592fdd1e7SBram Moolenaar    l[:] = [{1 : 1}]:TypeError:('expected str() or unicode() instance, but got int',)
327692fdd1e7SBram Moolenaar    l[:] = [{u"\0" : 1}]:TypeError:('expected string without null bytes',)
327792fdd1e7SBram Moolenaar    l[:] = [{"\0" : 1}]:TypeError:('expected string without null bytes',)
327892fdd1e7SBram Moolenaar    <<< Finished
327992fdd1e7SBram Moolenaar    >>> Testing StringToChars using l[:] = [{"abcF" : {%s : 1}}]
328092fdd1e7SBram Moolenaar    l[:] = [{"abcF" : {1 : 1}}]:TypeError:('expected str() or unicode() instance, but got int',)
328192fdd1e7SBram Moolenaar    l[:] = [{"abcF" : {u"\0" : 1}}]:TypeError:('expected string without null bytes',)
328292fdd1e7SBram Moolenaar    l[:] = [{"abcF" : {"\0" : 1}}]:TypeError:('expected string without null bytes',)
328392fdd1e7SBram Moolenaar    <<< Finished
328492fdd1e7SBram Moolenaar    >>> Testing StringToChars using l[:] = [{"abcF" : Mapping({%s : 1})}]
328592fdd1e7SBram Moolenaar    l[:] = [{"abcF" : Mapping({1 : 1})}]:TypeError:('expected str() or unicode() instance, but got int',)
328692fdd1e7SBram Moolenaar    l[:] = [{"abcF" : Mapping({u"\0" : 1})}]:TypeError:('expected string without null bytes',)
328792fdd1e7SBram Moolenaar    l[:] = [{"abcF" : Mapping({"\0" : 1})}]:TypeError:('expected string without null bytes',)
328892fdd1e7SBram Moolenaar    <<< Finished
328992fdd1e7SBram Moolenaar    >>> Testing *Iter* using l[:] = [{"abcF" : %s}]
329092fdd1e7SBram Moolenaar    l[:] = [{"abcF" : FailingIter()}]:TypeError:('unable to convert FailingIter to a Vim structure',)
329192fdd1e7SBram Moolenaar    l[:] = [{"abcF" : FailingIterNext()}]:NotImplementedError:('next',)
329292fdd1e7SBram Moolenaar    <<< Finished
329392fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using l[:] = [{"abcF" : %s}]
329492fdd1e7SBram Moolenaar    l[:] = [{"abcF" : None}]:NOT FAILED
329592fdd1e7SBram Moolenaar    l[:] = [{"abcF" : {"": 1}}]:ValueError:('empty keys are not allowed',)
329692fdd1e7SBram Moolenaar    l[:] = [{"abcF" : {u"": 1}}]:ValueError:('empty keys are not allowed',)
329792fdd1e7SBram Moolenaar    l[:] = [{"abcF" : FailingMapping()}]:NotImplementedError:('keys',)
329892fdd1e7SBram Moolenaar    l[:] = [{"abcF" : FailingMappingKey()}]:NotImplementedError:('getitem:mappingkey',)
329992fdd1e7SBram Moolenaar    l[:] = [{"abcF" : FailingNumber()}]:TypeError:('long() argument must be a string or a number',)
330092fdd1e7SBram Moolenaar    <<< Finished
330192fdd1e7SBram Moolenaar    >>> Testing StringToChars using l[:] = [Mapping({%s : 1})]
330292fdd1e7SBram Moolenaar    l[:] = [Mapping({1 : 1})]:TypeError:('expected str() or unicode() instance, but got int',)
330392fdd1e7SBram Moolenaar    l[:] = [Mapping({u"\0" : 1})]:TypeError:('expected string without null bytes',)
330492fdd1e7SBram Moolenaar    l[:] = [Mapping({"\0" : 1})]:TypeError:('expected string without null bytes',)
330592fdd1e7SBram Moolenaar    <<< Finished
330692fdd1e7SBram Moolenaar    >>> Testing StringToChars using l[:] = [Mapping({"abcG" : {%s : 1}})]
330792fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : {1 : 1}})]:TypeError:('expected str() or unicode() instance, but got int',)
330892fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : {u"\0" : 1}})]:TypeError:('expected string without null bytes',)
330992fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : {"\0" : 1}})]:TypeError:('expected string without null bytes',)
331092fdd1e7SBram Moolenaar    <<< Finished
331192fdd1e7SBram Moolenaar    >>> Testing StringToChars using l[:] = [Mapping({"abcG" : Mapping({%s : 1})})]
331292fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : Mapping({1 : 1})})]:TypeError:('expected str() or unicode() instance, but got int',)
331392fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : Mapping({u"\0" : 1})})]:TypeError:('expected string without null bytes',)
331492fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : Mapping({"\0" : 1})})]:TypeError:('expected string without null bytes',)
331592fdd1e7SBram Moolenaar    <<< Finished
331692fdd1e7SBram Moolenaar    >>> Testing *Iter* using l[:] = [Mapping({"abcG" : %s})]
331792fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : FailingIter()})]:TypeError:('unable to convert FailingIter to a Vim structure',)
331892fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : FailingIterNext()})]:NotImplementedError:('next',)
331992fdd1e7SBram Moolenaar    <<< Finished
332092fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using l[:] = [Mapping({"abcG" : %s})]
332192fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : None})]:NOT FAILED
332292fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : {"": 1}})]:ValueError:('empty keys are not allowed',)
332392fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : {u"": 1}})]:ValueError:('empty keys are not allowed',)
332492fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : FailingMapping()})]:NotImplementedError:('keys',)
332592fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : FailingMappingKey()})]:NotImplementedError:('getitem:mappingkey',)
332692fdd1e7SBram Moolenaar    l[:] = [Mapping({"abcG" : FailingNumber()})]:TypeError:('long() argument must be a string or a number',)
332792fdd1e7SBram Moolenaar    <<< Finished
332892fdd1e7SBram Moolenaar    >>> Testing *Iter* using l[:] = [%s]
332992fdd1e7SBram Moolenaar    l[:] = [FailingIter()]:TypeError:('unable to convert FailingIter to a Vim structure',)
333092fdd1e7SBram Moolenaar    l[:] = [FailingIterNext()]:NotImplementedError:('next',)
333192fdd1e7SBram Moolenaar    <<< Finished
333292fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using l[:] = [%s]
333392fdd1e7SBram Moolenaar    l[:] = [None]:NOT FAILED
333492fdd1e7SBram Moolenaar    l[:] = [{"": 1}]:ValueError:('empty keys are not allowed',)
333592fdd1e7SBram Moolenaar    l[:] = [{u"": 1}]:ValueError:('empty keys are not allowed',)
333692fdd1e7SBram Moolenaar    l[:] = [FailingMapping()]:NotImplementedError:('keys',)
333792fdd1e7SBram Moolenaar    l[:] = [FailingMappingKey()]:NotImplementedError:('getitem:mappingkey',)
333892fdd1e7SBram Moolenaar    l[:] = [FailingNumber()]:TypeError:('long() argument must be a string or a number',)
333992fdd1e7SBram Moolenaar    <<< Finished
334092fdd1e7SBram Moolenaar    >> ListConcatInPlace
334192fdd1e7SBram Moolenaar    >>> Testing *Iter* using l.extend(%s)
334292fdd1e7SBram Moolenaar    l.extend(FailingIter()):NotImplementedError:('iter',)
334392fdd1e7SBram Moolenaar    l.extend(FailingIterNext()):NotImplementedError:('next',)
334492fdd1e7SBram Moolenaar    <<< Finished
334592fdd1e7SBram Moolenaar    >>> Testing StringToChars using l.extend([{%s : 1}])
334692fdd1e7SBram Moolenaar    l.extend([{1 : 1}]):TypeError:('expected str() or unicode() instance, but got int',)
334792fdd1e7SBram Moolenaar    l.extend([{u"\0" : 1}]):TypeError:('expected string without null bytes',)
334892fdd1e7SBram Moolenaar    l.extend([{"\0" : 1}]):TypeError:('expected string without null bytes',)
334992fdd1e7SBram Moolenaar    <<< Finished
335092fdd1e7SBram Moolenaar    >>> Testing StringToChars using l.extend([{"abcF" : {%s : 1}}])
335192fdd1e7SBram Moolenaar    l.extend([{"abcF" : {1 : 1}}]):TypeError:('expected str() or unicode() instance, but got int',)
335292fdd1e7SBram Moolenaar    l.extend([{"abcF" : {u"\0" : 1}}]):TypeError:('expected string without null bytes',)
335392fdd1e7SBram Moolenaar    l.extend([{"abcF" : {"\0" : 1}}]):TypeError:('expected string without null bytes',)
335492fdd1e7SBram Moolenaar    <<< Finished
335592fdd1e7SBram Moolenaar    >>> Testing StringToChars using l.extend([{"abcF" : Mapping({%s : 1})}])
335692fdd1e7SBram Moolenaar    l.extend([{"abcF" : Mapping({1 : 1})}]):TypeError:('expected str() or unicode() instance, but got int',)
335792fdd1e7SBram Moolenaar    l.extend([{"abcF" : Mapping({u"\0" : 1})}]):TypeError:('expected string without null bytes',)
335892fdd1e7SBram Moolenaar    l.extend([{"abcF" : Mapping({"\0" : 1})}]):TypeError:('expected string without null bytes',)
335992fdd1e7SBram Moolenaar    <<< Finished
336092fdd1e7SBram Moolenaar    >>> Testing *Iter* using l.extend([{"abcF" : %s}])
336192fdd1e7SBram Moolenaar    l.extend([{"abcF" : FailingIter()}]):TypeError:('unable to convert FailingIter to a Vim structure',)
336292fdd1e7SBram Moolenaar    l.extend([{"abcF" : FailingIterNext()}]):NotImplementedError:('next',)
336392fdd1e7SBram Moolenaar    <<< Finished
336492fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using l.extend([{"abcF" : %s}])
336592fdd1e7SBram Moolenaar    l.extend([{"abcF" : None}]):NOT FAILED
336692fdd1e7SBram Moolenaar    l.extend([{"abcF" : {"": 1}}]):ValueError:('empty keys are not allowed',)
336792fdd1e7SBram Moolenaar    l.extend([{"abcF" : {u"": 1}}]):ValueError:('empty keys are not allowed',)
336892fdd1e7SBram Moolenaar    l.extend([{"abcF" : FailingMapping()}]):NotImplementedError:('keys',)
336992fdd1e7SBram Moolenaar    l.extend([{"abcF" : FailingMappingKey()}]):NotImplementedError:('getitem:mappingkey',)
337092fdd1e7SBram Moolenaar    l.extend([{"abcF" : FailingNumber()}]):TypeError:('long() argument must be a string or a number',)
337192fdd1e7SBram Moolenaar    <<< Finished
337292fdd1e7SBram Moolenaar    >>> Testing StringToChars using l.extend([Mapping({%s : 1})])
337392fdd1e7SBram Moolenaar    l.extend([Mapping({1 : 1})]):TypeError:('expected str() or unicode() instance, but got int',)
337492fdd1e7SBram Moolenaar    l.extend([Mapping({u"\0" : 1})]):TypeError:('expected string without null bytes',)
337592fdd1e7SBram Moolenaar    l.extend([Mapping({"\0" : 1})]):TypeError:('expected string without null bytes',)
337692fdd1e7SBram Moolenaar    <<< Finished
337792fdd1e7SBram Moolenaar    >>> Testing StringToChars using l.extend([Mapping({"abcG" : {%s : 1}})])
337892fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : {1 : 1}})]):TypeError:('expected str() or unicode() instance, but got int',)
337992fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : {u"\0" : 1}})]):TypeError:('expected string without null bytes',)
338092fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : {"\0" : 1}})]):TypeError:('expected string without null bytes',)
338192fdd1e7SBram Moolenaar    <<< Finished
338292fdd1e7SBram Moolenaar    >>> Testing StringToChars using l.extend([Mapping({"abcG" : Mapping({%s : 1})})])
338392fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : Mapping({1 : 1})})]):TypeError:('expected str() or unicode() instance, but got int',)
338492fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : Mapping({u"\0" : 1})})]):TypeError:('expected string without null bytes',)
338592fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : Mapping({"\0" : 1})})]):TypeError:('expected string without null bytes',)
338692fdd1e7SBram Moolenaar    <<< Finished
338792fdd1e7SBram Moolenaar    >>> Testing *Iter* using l.extend([Mapping({"abcG" : %s})])
338892fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : FailingIter()})]):TypeError:('unable to convert FailingIter to a Vim structure',)
338992fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : FailingIterNext()})]):NotImplementedError:('next',)
339092fdd1e7SBram Moolenaar    <<< Finished
339192fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using l.extend([Mapping({"abcG" : %s})])
339292fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : None})]):NOT FAILED
339392fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : {"": 1}})]):ValueError:('empty keys are not allowed',)
339492fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : {u"": 1}})]):ValueError:('empty keys are not allowed',)
339592fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : FailingMapping()})]):NotImplementedError:('keys',)
339692fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : FailingMappingKey()})]):NotImplementedError:('getitem:mappingkey',)
339792fdd1e7SBram Moolenaar    l.extend([Mapping({"abcG" : FailingNumber()})]):TypeError:('long() argument must be a string or a number',)
339892fdd1e7SBram Moolenaar    <<< Finished
339992fdd1e7SBram Moolenaar    >>> Testing *Iter* using l.extend([%s])
340092fdd1e7SBram Moolenaar    l.extend([FailingIter()]):TypeError:('unable to convert FailingIter to a Vim structure',)
340192fdd1e7SBram Moolenaar    l.extend([FailingIterNext()]):NotImplementedError:('next',)
340292fdd1e7SBram Moolenaar    <<< Finished
340392fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using l.extend([%s])
340492fdd1e7SBram Moolenaar    l.extend([None]):NOT FAILED
340592fdd1e7SBram Moolenaar    l.extend([{"": 1}]):ValueError:('empty keys are not allowed',)
340692fdd1e7SBram Moolenaar    l.extend([{u"": 1}]):ValueError:('empty keys are not allowed',)
340792fdd1e7SBram Moolenaar    l.extend([FailingMapping()]):NotImplementedError:('keys',)
340892fdd1e7SBram Moolenaar    l.extend([FailingMappingKey()]):NotImplementedError:('getitem:mappingkey',)
340992fdd1e7SBram Moolenaar    l.extend([FailingNumber()]):TypeError:('long() argument must be a string or a number',)
341092fdd1e7SBram Moolenaar    <<< Finished
341192fdd1e7SBram Moolenaar    >> ListSetattr
341292fdd1e7SBram Moolenaar    del l.locked:AttributeError:('cannot delete vim.List attributes',)
341392fdd1e7SBram Moolenaar    l.locked = FailingTrue():NotImplementedError:('bool',)
341492fdd1e7SBram Moolenaar    l.xxx = True:AttributeError:('cannot set attribute xxx',)
341592fdd1e7SBram Moolenaar    > Function
341692fdd1e7SBram Moolenaar    >> FunctionConstructor
341792fdd1e7SBram Moolenaar    >>> FunctionConstructor
341892fdd1e7SBram Moolenaar    vim.Function("123"):ValueError:('unnamed function 123 does not exist',)
341992fdd1e7SBram Moolenaar    vim.Function("xxx_non_existent_function_xxx"):ValueError:('function xxx_non_existent_function_xxx does not exist',)
342092fdd1e7SBram Moolenaar    vim.Function("xxx#non#existent#function#xxx"):NOT FAILED
342192fdd1e7SBram Moolenaar    vim.Function("xxx_non_existent_function_xxx2", args=[]):ValueError:('function xxx_non_existent_function_xxx2 does not exist',)
342292fdd1e7SBram Moolenaar    vim.Function("xxx_non_existent_function_xxx3", self={}):ValueError:('function xxx_non_existent_function_xxx3 does not exist',)
342392fdd1e7SBram Moolenaar    vim.Function("xxx_non_existent_function_xxx4", args=[], self={}):ValueError:('function xxx_non_existent_function_xxx4 does not exist',)
342492fdd1e7SBram Moolenaar    >>> FunctionNew
342592fdd1e7SBram Moolenaar    vim.Function("tr", self="abcFuncSelf"):TypeError:('unable to convert str to a Vim dictionary',)
342692fdd1e7SBram Moolenaar    vim.Function("tr", args=427423):TypeError:('unable to convert int to a Vim list',)
342792fdd1e7SBram Moolenaar    vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
342892fdd1e7SBram Moolenaar    vim.Function(self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
342992fdd1e7SBram Moolenaar    vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
343092fdd1e7SBram Moolenaar    vim.Function("tr", ""):TypeError:('function takes exactly 1 argument (2 given)',)
343192fdd1e7SBram Moolenaar    >> FunctionCall
343292fdd1e7SBram Moolenaar    >>> Testing StringToChars using f({%s : 1})
343392fdd1e7SBram Moolenaar    f({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
343492fdd1e7SBram Moolenaar    f({u"\0" : 1}):TypeError:('expected string without null bytes',)
343592fdd1e7SBram Moolenaar    f({"\0" : 1}):TypeError:('expected string without null bytes',)
343692fdd1e7SBram Moolenaar    <<< Finished
343792fdd1e7SBram Moolenaar    >>> Testing StringToChars using f({"abcF" : {%s : 1}})
343892fdd1e7SBram Moolenaar    f({"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
343992fdd1e7SBram Moolenaar    f({"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
344092fdd1e7SBram Moolenaar    f({"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
344192fdd1e7SBram Moolenaar    <<< Finished
344292fdd1e7SBram Moolenaar    >>> Testing StringToChars using f({"abcF" : Mapping({%s : 1})})
344392fdd1e7SBram Moolenaar    f({"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
344492fdd1e7SBram Moolenaar    f({"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
344592fdd1e7SBram Moolenaar    f({"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
344692fdd1e7SBram Moolenaar    <<< Finished
344792fdd1e7SBram Moolenaar    >>> Testing *Iter* using f({"abcF" : %s})
344892fdd1e7SBram Moolenaar    f({"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
344992fdd1e7SBram Moolenaar    f({"abcF" : FailingIterNext()}):NotImplementedError:('next',)
345092fdd1e7SBram Moolenaar    <<< Finished
345192fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using f({"abcF" : %s})
345292fdd1e7SBram Moolenaar    f({"abcF" : None}):NOT FAILED
345392fdd1e7SBram Moolenaar    f({"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
345492fdd1e7SBram Moolenaar    f({"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
345592fdd1e7SBram Moolenaar    f({"abcF" : FailingMapping()}):NotImplementedError:('keys',)
345692fdd1e7SBram Moolenaar    f({"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
345792fdd1e7SBram Moolenaar    f({"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
345892fdd1e7SBram Moolenaar    <<< Finished
345992fdd1e7SBram Moolenaar    >>> Testing StringToChars using f(Mapping({%s : 1}))
346092fdd1e7SBram Moolenaar    f(Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
346192fdd1e7SBram Moolenaar    f(Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
346292fdd1e7SBram Moolenaar    f(Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
346392fdd1e7SBram Moolenaar    <<< Finished
346492fdd1e7SBram Moolenaar    >>> Testing StringToChars using f(Mapping({"abcG" : {%s : 1}}))
346592fdd1e7SBram Moolenaar    f(Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
346692fdd1e7SBram Moolenaar    f(Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
346792fdd1e7SBram Moolenaar    f(Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
346892fdd1e7SBram Moolenaar    <<< Finished
346992fdd1e7SBram Moolenaar    >>> Testing StringToChars using f(Mapping({"abcG" : Mapping({%s : 1})}))
347092fdd1e7SBram Moolenaar    f(Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
347192fdd1e7SBram Moolenaar    f(Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
347292fdd1e7SBram Moolenaar    f(Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
347392fdd1e7SBram Moolenaar    <<< Finished
347492fdd1e7SBram Moolenaar    >>> Testing *Iter* using f(Mapping({"abcG" : %s}))
347592fdd1e7SBram Moolenaar    f(Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
347692fdd1e7SBram Moolenaar    f(Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
347792fdd1e7SBram Moolenaar    <<< Finished
347892fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using f(Mapping({"abcG" : %s}))
347992fdd1e7SBram Moolenaar    f(Mapping({"abcG" : None})):NOT FAILED
348092fdd1e7SBram Moolenaar    f(Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
348192fdd1e7SBram Moolenaar    f(Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
348292fdd1e7SBram Moolenaar    f(Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
348392fdd1e7SBram Moolenaar    f(Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
348492fdd1e7SBram Moolenaar    f(Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
348592fdd1e7SBram Moolenaar    <<< Finished
348692fdd1e7SBram Moolenaar    >>> Testing *Iter* using f(%s)
348792fdd1e7SBram Moolenaar    f(FailingIter()):TypeError:('unable to convert FailingIter to a Vim structure',)
348892fdd1e7SBram Moolenaar    f(FailingIterNext()):NotImplementedError:('next',)
348992fdd1e7SBram Moolenaar    <<< Finished
349092fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using f(%s)
349192fdd1e7SBram Moolenaar    f(None):NOT FAILED
349292fdd1e7SBram Moolenaar    f({"": 1}):ValueError:('empty keys are not allowed',)
349392fdd1e7SBram Moolenaar    f({u"": 1}):ValueError:('empty keys are not allowed',)
349492fdd1e7SBram Moolenaar    f(FailingMapping()):NotImplementedError:('keys',)
349592fdd1e7SBram Moolenaar    f(FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
349692fdd1e7SBram Moolenaar    f(FailingNumber()):TypeError:('long() argument must be a string or a number',)
349792fdd1e7SBram Moolenaar    <<< Finished
349892fdd1e7SBram Moolenaar    >>> Testing StringToChars using fd(self={%s : 1})
349992fdd1e7SBram Moolenaar    fd(self={1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
350092fdd1e7SBram Moolenaar    fd(self={u"\0" : 1}):TypeError:('expected string without null bytes',)
350192fdd1e7SBram Moolenaar    fd(self={"\0" : 1}):TypeError:('expected string without null bytes',)
350292fdd1e7SBram Moolenaar    <<< Finished
350392fdd1e7SBram Moolenaar    >>> Testing StringToChars using fd(self={"abcF" : {%s : 1}})
350492fdd1e7SBram Moolenaar    fd(self={"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
350592fdd1e7SBram Moolenaar    fd(self={"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
350692fdd1e7SBram Moolenaar    fd(self={"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
350792fdd1e7SBram Moolenaar    <<< Finished
350892fdd1e7SBram Moolenaar    >>> Testing StringToChars using fd(self={"abcF" : Mapping({%s : 1})})
350992fdd1e7SBram Moolenaar    fd(self={"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
351092fdd1e7SBram Moolenaar    fd(self={"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
351192fdd1e7SBram Moolenaar    fd(self={"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
351292fdd1e7SBram Moolenaar    <<< Finished
351392fdd1e7SBram Moolenaar    >>> Testing *Iter* using fd(self={"abcF" : %s})
351492fdd1e7SBram Moolenaar    fd(self={"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
351592fdd1e7SBram Moolenaar    fd(self={"abcF" : FailingIterNext()}):NotImplementedError:('next',)
351692fdd1e7SBram Moolenaar    <<< Finished
351792fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using fd(self={"abcF" : %s})
351892fdd1e7SBram Moolenaar    fd(self={"abcF" : None}):NOT FAILED
351992fdd1e7SBram Moolenaar    fd(self={"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
352092fdd1e7SBram Moolenaar    fd(self={"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
352192fdd1e7SBram Moolenaar    fd(self={"abcF" : FailingMapping()}):NotImplementedError:('keys',)
352292fdd1e7SBram Moolenaar    fd(self={"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
352392fdd1e7SBram Moolenaar    fd(self={"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
352492fdd1e7SBram Moolenaar    <<< Finished
352592fdd1e7SBram Moolenaar    >>> Testing StringToChars using fd(self=Mapping({%s : 1}))
352692fdd1e7SBram Moolenaar    fd(self=Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
352792fdd1e7SBram Moolenaar    fd(self=Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
352892fdd1e7SBram Moolenaar    fd(self=Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
352992fdd1e7SBram Moolenaar    <<< Finished
353092fdd1e7SBram Moolenaar    >>> Testing StringToChars using fd(self=Mapping({"abcG" : {%s : 1}}))
353192fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
353292fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
353392fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
353492fdd1e7SBram Moolenaar    <<< Finished
353592fdd1e7SBram Moolenaar    >>> Testing StringToChars using fd(self=Mapping({"abcG" : Mapping({%s : 1})}))
353692fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
353792fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
353892fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
353992fdd1e7SBram Moolenaar    <<< Finished
354092fdd1e7SBram Moolenaar    >>> Testing *Iter* using fd(self=Mapping({"abcG" : %s}))
354192fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
354292fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
354392fdd1e7SBram Moolenaar    <<< Finished
354492fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using fd(self=Mapping({"abcG" : %s}))
354592fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : None})):NOT FAILED
354692fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
354792fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
354892fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
354992fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
355092fdd1e7SBram Moolenaar    fd(self=Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
355192fdd1e7SBram Moolenaar    <<< Finished
355292fdd1e7SBram Moolenaar    >>> Testing *Iter* using fd(self=%s)
355392fdd1e7SBram Moolenaar    fd(self=FailingIter()):TypeError:('unable to convert FailingIter to a Vim dictionary',)
355492fdd1e7SBram Moolenaar    fd(self=FailingIterNext()):TypeError:('unable to convert FailingIterNext to a Vim dictionary',)
355592fdd1e7SBram Moolenaar    <<< Finished
355692fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyObject using fd(self=%s)
355792fdd1e7SBram Moolenaar    fd(self=None):TypeError:('unable to convert NoneType to a Vim dictionary',)
355892fdd1e7SBram Moolenaar    fd(self={"": 1}):ValueError:('empty keys are not allowed',)
355992fdd1e7SBram Moolenaar    fd(self={u"": 1}):ValueError:('empty keys are not allowed',)
356092fdd1e7SBram Moolenaar    fd(self=FailingMapping()):NotImplementedError:('keys',)
356192fdd1e7SBram Moolenaar    fd(self=FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
356292fdd1e7SBram Moolenaar    fd(self=FailingNumber()):TypeError:('unable to convert FailingNumber to a Vim dictionary',)
356392fdd1e7SBram Moolenaar    <<< Finished
356492fdd1e7SBram Moolenaar    >>> Testing ConvertFromPyMapping using fd(self=%s)
356592fdd1e7SBram Moolenaar    fd(self=[]):TypeError:('unable to convert list to a Vim dictionary',)
356692fdd1e7SBram Moolenaar    <<< Finished
356792fdd1e7SBram Moolenaar    > TabPage
356892fdd1e7SBram Moolenaar    >> TabPageAttr
356992fdd1e7SBram Moolenaar    vim.current.tabpage.xxx:AttributeError:('xxx',)
357092fdd1e7SBram Moolenaar    > TabList
357192fdd1e7SBram Moolenaar    >> TabListItem
357292fdd1e7SBram Moolenaar    vim.tabpages[1000]:IndexError:('no such tab page',)
357392fdd1e7SBram Moolenaar    > Window
357492fdd1e7SBram Moolenaar    >> WindowAttr
357592fdd1e7SBram Moolenaar    vim.current.window.xxx:AttributeError:('xxx',)
357692fdd1e7SBram Moolenaar    >> WindowSetattr
357792fdd1e7SBram Moolenaar    vim.current.window.buffer = 0:TypeError:('readonly attribute: buffer',)
357892fdd1e7SBram Moolenaar    vim.current.window.cursor = (100000000, 100000000):error:('cursor position outside buffer',)
357992fdd1e7SBram Moolenaar    vim.current.window.cursor = True:TypeError:('argument must be 2-item sequence, not bool',)
358092fdd1e7SBram Moolenaar    >>> Testing NumberToLong using vim.current.window.height = %s
358192fdd1e7SBram Moolenaar    vim.current.window.height = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
358292fdd1e7SBram Moolenaar    vim.current.window.height = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
358392fdd1e7SBram Moolenaar    vim.current.window.height = -1:ValueError:('number must be greater or equal to zero',)
358492fdd1e7SBram Moolenaar    <<< Finished
358592fdd1e7SBram Moolenaar    >>> Testing NumberToLong using vim.current.window.width = %s
358692fdd1e7SBram Moolenaar    vim.current.window.width = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
358792fdd1e7SBram Moolenaar    vim.current.window.width = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
358892fdd1e7SBram Moolenaar    vim.current.window.width = -1:ValueError:('number must be greater or equal to zero',)
358992fdd1e7SBram Moolenaar    <<< Finished
359092fdd1e7SBram Moolenaar    vim.current.window.xxxxxx = True:AttributeError:('xxxxxx',)
359192fdd1e7SBram Moolenaar    > WinList
359292fdd1e7SBram Moolenaar    >> WinListItem
359392fdd1e7SBram Moolenaar    vim.windows[1000]:IndexError:('no such window',)
359492fdd1e7SBram Moolenaar    > Buffer
359592fdd1e7SBram Moolenaar    >> StringToLine (indirect)
359692fdd1e7SBram Moolenaar    vim.current.buffer[0] = "\na":error:('string cannot contain newlines',)
3597ab589463SBram Moolenaar    vim.current.buffer[0] = u"\na":error:('string cannot contain newlines',)
359892fdd1e7SBram Moolenaar    >> SetBufferLine (indirect)
359992fdd1e7SBram Moolenaar    vim.current.buffer[0] = True:TypeError:('bad argument type for built-in operation',)
360092fdd1e7SBram Moolenaar    >> SetBufferLineList (indirect)
360192fdd1e7SBram Moolenaar    vim.current.buffer[:] = True:TypeError:('bad argument type for built-in operation',)
360292fdd1e7SBram Moolenaar    vim.current.buffer[:] = ["\na", "bc"]:error:('string cannot contain newlines',)
360392fdd1e7SBram Moolenaar    >> InsertBufferLines (indirect)
360492fdd1e7SBram Moolenaar    vim.current.buffer.append(None):TypeError:('bad argument type for built-in operation',)
360592fdd1e7SBram Moolenaar    vim.current.buffer.append(["\na", "bc"]):error:('string cannot contain newlines',)
360692fdd1e7SBram Moolenaar    vim.current.buffer.append("\nbc"):error:('string cannot contain newlines',)
360792fdd1e7SBram Moolenaar    >> RBItem
360892fdd1e7SBram Moolenaar    vim.current.buffer[100000000]:IndexError:('line number out of range',)
360992fdd1e7SBram Moolenaar    >> RBAsItem
361092fdd1e7SBram Moolenaar    vim.current.buffer[100000000] = "":IndexError:('line number out of range',)
361192fdd1e7SBram Moolenaar    >> BufferAttr
361292fdd1e7SBram Moolenaar    vim.current.buffer.xxx:AttributeError:('xxx',)
361392fdd1e7SBram Moolenaar    >> BufferSetattr
361492fdd1e7SBram Moolenaar    vim.current.buffer.name = True:TypeError:('expected str() or unicode() instance, but got bool',)
361592fdd1e7SBram Moolenaar    vim.current.buffer.xxx = True:AttributeError:('xxx',)
361692fdd1e7SBram Moolenaar    >> BufferMark
361792fdd1e7SBram Moolenaar    vim.current.buffer.mark(0):TypeError:('expected str() or unicode() instance, but got int',)
361892fdd1e7SBram Moolenaar    vim.current.buffer.mark("abcM"):ValueError:('mark name must be a single character',)
361992fdd1e7SBram Moolenaar    vim.current.buffer.mark("!"):error:('invalid mark name',)
362092fdd1e7SBram Moolenaar    >> BufferRange
362192fdd1e7SBram Moolenaar    vim.current.buffer.range(1, 2, 3):TypeError:('function takes exactly 2 arguments (3 given)',)
362292fdd1e7SBram Moolenaar    > BufMap
362392fdd1e7SBram Moolenaar    >> BufMapItem
362492fdd1e7SBram Moolenaar    vim.buffers[100000000]:KeyError:(100000000,)
362592fdd1e7SBram Moolenaar    >>> Testing NumberToLong using vim.buffers[%s]
362692fdd1e7SBram Moolenaar    vim.buffers[[]]:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
362792fdd1e7SBram Moolenaar    vim.buffers[None]:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
362892fdd1e7SBram Moolenaar    vim.buffers[-1]:ValueError:('number must be greater than zero',)
362992fdd1e7SBram Moolenaar    vim.buffers[0]:ValueError:('number must be greater than zero',)
363092fdd1e7SBram Moolenaar    <<< Finished
363192fdd1e7SBram Moolenaar    > Current
363292fdd1e7SBram Moolenaar    >> CurrentGetattr
363392fdd1e7SBram Moolenaar    vim.current.xxx:AttributeError:('xxx',)
363492fdd1e7SBram Moolenaar    >> CurrentSetattr
363592fdd1e7SBram Moolenaar    vim.current.line = True:TypeError:('bad argument type for built-in operation',)
363692fdd1e7SBram Moolenaar    vim.current.buffer = True:TypeError:('expected vim.Buffer object, but got bool',)
363792fdd1e7SBram Moolenaar    vim.current.window = True:TypeError:('expected vim.Window object, but got bool',)
363892fdd1e7SBram Moolenaar    vim.current.tabpage = True:TypeError:('expected vim.TabPage object, but got bool',)
363992fdd1e7SBram Moolenaar    vim.current.xxx = True:AttributeError:('xxx',)
364092fdd1e7SBram Moolenaar  END
364192fdd1e7SBram Moolenaar
364292fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
364392fdd1e7SBram Moolenaar  close!
364492fdd1e7SBram Moolenaarendfunc
364592fdd1e7SBram Moolenaar
364692fdd1e7SBram Moolenaar" Test import
364792fdd1e7SBram Moolenaarfunc Test_python_import()
364892fdd1e7SBram Moolenaar  new
364992fdd1e7SBram Moolenaar  py cb = vim.current.buffer
365092fdd1e7SBram Moolenaar
365192fdd1e7SBram Moolenaar  py << trim EOF
365292fdd1e7SBram Moolenaar    sys.path.insert(0, os.path.join(os.getcwd(), 'python_before'))
365392fdd1e7SBram Moolenaar    sys.path.append(os.path.join(os.getcwd(), 'python_after'))
365492fdd1e7SBram Moolenaar    vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\')
365592fdd1e7SBram Moolenaar    l = []
365692fdd1e7SBram Moolenaar    def callback(path):
365792fdd1e7SBram Moolenaar        l.append(path[-len('/testdir'):].replace(os.path.sep, '/'))
365892fdd1e7SBram Moolenaar    vim.foreach_rtp(callback)
365992fdd1e7SBram Moolenaar    cb.append(repr(l))
366092fdd1e7SBram Moolenaar    del l
366192fdd1e7SBram Moolenaar    def callback(path):
366292fdd1e7SBram Moolenaar        return path[-len('/testdir'):].replace(os.path.sep, '/')
366392fdd1e7SBram Moolenaar    cb.append(repr(vim.foreach_rtp(callback)))
366492fdd1e7SBram Moolenaar    del callback
366592fdd1e7SBram Moolenaar    from module import dir as d
366692fdd1e7SBram Moolenaar    from modulex import ddir
366792fdd1e7SBram Moolenaar    cb.append(d + ',' + ddir)
366892fdd1e7SBram Moolenaar    import before
366992fdd1e7SBram Moolenaar    cb.append(before.dir)
367092fdd1e7SBram Moolenaar    import after
367192fdd1e7SBram Moolenaar    cb.append(after.dir)
367292fdd1e7SBram Moolenaar    import topmodule as tm
367392fdd1e7SBram Moolenaar    import topmodule.submodule as tms
367492fdd1e7SBram Moolenaar    import topmodule.submodule.subsubmodule.subsubsubmodule as tmsss
367592fdd1e7SBram Moolenaar    cb.append(tm.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/__init__.py'):])
367692fdd1e7SBram Moolenaar    cb.append(tms.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/__init__.py'):])
367792fdd1e7SBram Moolenaar    cb.append(tmsss.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/subsubmodule/subsubsubmodule.py'):])
3678ab589463SBram Moolenaar
367992fdd1e7SBram Moolenaar    del before
368092fdd1e7SBram Moolenaar    del after
368192fdd1e7SBram Moolenaar    del d
368292fdd1e7SBram Moolenaar    del ddir
368392fdd1e7SBram Moolenaar    del tm
368492fdd1e7SBram Moolenaar    del tms
368592fdd1e7SBram Moolenaar    del tmsss
368692fdd1e7SBram Moolenaar  EOF
368792fdd1e7SBram Moolenaar
368892fdd1e7SBram Moolenaar  let expected =<< trim END
368992fdd1e7SBram Moolenaar    ['/testdir']
369092fdd1e7SBram Moolenaar    '/testdir'
369192fdd1e7SBram Moolenaar    2,xx
369292fdd1e7SBram Moolenaar    before
369392fdd1e7SBram Moolenaar    after
369492fdd1e7SBram Moolenaar    pythonx/topmodule/__init__.py
369592fdd1e7SBram Moolenaar    pythonx/topmodule/submodule/__init__.py
369692fdd1e7SBram Moolenaar    pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py
369792fdd1e7SBram Moolenaar  END
369892fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
369992fdd1e7SBram Moolenaar  close!
3700ab589463SBram Moolenaar
37018e7d6223SBram Moolenaar  " Try to import a non-existing module with a dot (.)
3702ab589463SBram Moolenaar  call AssertException(['py import a.b.c'], 'ImportError:')
370392fdd1e7SBram Moolenaarendfunc
370492fdd1e7SBram Moolenaar
370592fdd1e7SBram Moolenaar" Test exceptions
370692fdd1e7SBram Moolenaarfunc Test_python_exception()
3707ab589463SBram Moolenaar  func Exe(e)
370892fdd1e7SBram Moolenaar    execute a:e
3709ab589463SBram Moolenaar  endfunc
371092fdd1e7SBram Moolenaar
371192fdd1e7SBram Moolenaar  new
371292fdd1e7SBram Moolenaar  py cb = vim.current.buffer
371392fdd1e7SBram Moolenaar
371492fdd1e7SBram Moolenaar  py << trim EOF
371592fdd1e7SBram Moolenaar    Exe = vim.bindeval('function("Exe")')
371692fdd1e7SBram Moolenaar    ee('vim.command("throw \'abcN\'")')
371792fdd1e7SBram Moolenaar    ee('Exe("throw \'def\'")')
371892fdd1e7SBram Moolenaar    ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
371992fdd1e7SBram Moolenaar    ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
372092fdd1e7SBram Moolenaar    ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
372192fdd1e7SBram Moolenaar    ee('vim.eval("xxx_unknown_function_xxx()")')
372292fdd1e7SBram Moolenaar    ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
372392fdd1e7SBram Moolenaar    del Exe
372492fdd1e7SBram Moolenaar  EOF
372592fdd1e7SBram Moolenaar  delfunction Exe
372692fdd1e7SBram Moolenaar
372792fdd1e7SBram Moolenaar  let expected =<< trim END
372892fdd1e7SBram Moolenaar    vim.command("throw 'abcN'"):error:('abcN',)
372992fdd1e7SBram Moolenaar    Exe("throw 'def'"):error:('def',)
373092fdd1e7SBram Moolenaar    vim.eval("Exe('throw ''ghi''')"):error:('ghi',)
373192fdd1e7SBram Moolenaar    vim.eval("Exe('echoerr ''jkl''')"):error:('Vim(echoerr):jkl',)
373292fdd1e7SBram Moolenaar    vim.eval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)
373392fdd1e7SBram Moolenaar    vim.eval("xxx_unknown_function_xxx()"):error:('Vim:E117: Unknown function: xxx_unknown_function_xxx',)
373492fdd1e7SBram Moolenaar    vim.bindeval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)
373592fdd1e7SBram Moolenaar  END
373692fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
373792fdd1e7SBram Moolenaar  close!
373892fdd1e7SBram Moolenaarendfunc
373992fdd1e7SBram Moolenaar
374092fdd1e7SBram Moolenaar" Regression: interrupting vim.command propagates to next vim.command
374192fdd1e7SBram Moolenaarfunc Test_python_keyboard_interrupt()
374292fdd1e7SBram Moolenaar  new
374392fdd1e7SBram Moolenaar  py cb = vim.current.buffer
374492fdd1e7SBram Moolenaar  py << trim EOF
374592fdd1e7SBram Moolenaar    def test_keyboard_interrupt():
374692fdd1e7SBram Moolenaar        try:
374792fdd1e7SBram Moolenaar            vim.command('while 1 | endwhile')
374892fdd1e7SBram Moolenaar        except KeyboardInterrupt:
374992fdd1e7SBram Moolenaar            cb.append('Caught KeyboardInterrupt')
375092fdd1e7SBram Moolenaar        except Exception:
375192fdd1e7SBram Moolenaar            cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
375292fdd1e7SBram Moolenaar        else:
375392fdd1e7SBram Moolenaar            cb.append('!!!!!!!! No exception')
375492fdd1e7SBram Moolenaar        try:
375592fdd1e7SBram Moolenaar            vim.command('$ put =\'Running :put\'')
375692fdd1e7SBram Moolenaar        except KeyboardInterrupt:
375792fdd1e7SBram Moolenaar            cb.append('!!!!!!!! Caught KeyboardInterrupt')
375892fdd1e7SBram Moolenaar        except Exception:
375992fdd1e7SBram Moolenaar            cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
376092fdd1e7SBram Moolenaar        else:
376192fdd1e7SBram Moolenaar            cb.append('No exception')
376292fdd1e7SBram Moolenaar  EOF
376392fdd1e7SBram Moolenaar
376492fdd1e7SBram Moolenaar  debuggreedy
376592fdd1e7SBram Moolenaar  call inputsave()
376692fdd1e7SBram Moolenaar  call feedkeys("s\ns\ns\ns\nq\n")
376792fdd1e7SBram Moolenaar  redir => output
376892fdd1e7SBram Moolenaar  debug silent! py test_keyboard_interrupt()
376992fdd1e7SBram Moolenaar  redir END
377092fdd1e7SBram Moolenaar  0 debuggreedy
377192fdd1e7SBram Moolenaar  call inputrestore()
377292fdd1e7SBram Moolenaar  py del test_keyboard_interrupt
377392fdd1e7SBram Moolenaar
377492fdd1e7SBram Moolenaar  let expected =<< trim END
377592fdd1e7SBram Moolenaar    Caught KeyboardInterrupt
377692fdd1e7SBram Moolenaar    Running :put
377792fdd1e7SBram Moolenaar    No exception
377892fdd1e7SBram Moolenaar  END
377992fdd1e7SBram Moolenaar  call assert_equal(expected, getline(2, '$'))
378092fdd1e7SBram Moolenaar  call assert_equal('', output)
378192fdd1e7SBram Moolenaar  close!
378292fdd1e7SBram Moolenaarendfunc
378392fdd1e7SBram Moolenaar
37842e2f52a4SBram Moolenaarfunc Test_python_non_utf8_string()
37852e2f52a4SBram Moolenaar  smap <Esc>@ <A-@>
37862e2f52a4SBram Moolenaar  python vim.command('redir => _tmp_smaps | smap | redir END')
37872e2f52a4SBram Moolenaar  python vim.eval('_tmp_smaps').splitlines()
37882e2f52a4SBram Moolenaar  sunmap <Esc>@
37892e2f52a4SBram Moolenaarendfunc
37902e2f52a4SBram Moolenaar
37916c2b7b80SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
3792