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