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