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