To: vim_dev@googlegroups.com Subject: Patch 8.2.1123 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1123 Problem: Python 3 test is old style. Solution: Turn into new style test. (Yegappan Lakshmanan, closes #6385) Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms, src/testdir/test87.in, src/testdir/test87.ok, src/testdir/test_python2.vim, src/testdir/test_python3.vim *** ../vim-8.2.1122/src/Makefile 2020-07-03 18:00:00.293531826 +0200 --- src/Makefile 2020-07-03 21:13:42.672591840 +0200 *************** *** 2308,2314 **** test42 test44 test49 \ test52 test59 \ test70 \ - test87 \ test99: cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE) --- 2308,2313 ---- *** ../vim-8.2.1122/src/testdir/Make_all.mak 2020-07-03 18:00:00.293531826 +0200 --- src/testdir/Make_all.mak 2020-07-03 21:13:42.672591840 +0200 *************** *** 20,34 **** # Tests that run on most systems, but not on Amiga. SCRIPTS_MORE1 = \ ! test52.out \ ! test87.out ! # Tests that run on most systems, but not on Amiga and DOS/Windows. SCRIPTS_MORE2 = \ test49.out - # Tests that run on most systems, but not on VMS SCRIPTS_MORE4 = \ test59.out --- 20,31 ---- # Tests that run on most systems, but not on Amiga. SCRIPTS_MORE1 = \ ! test52.out # Tests that run on most systems, but not on Amiga and DOS/Windows. SCRIPTS_MORE2 = \ test49.out # Tests that run on most systems, but not on VMS SCRIPTS_MORE4 = \ test59.out *************** *** 36,42 **** # Tests specifically for MS-Windows. SCRIPTS_WIN32 = - # Tests for the GUI. SCRIPTS_GUI = --- 33,38 ---- *************** *** 309,315 **** test_alot_utf8 \ test_alot - # Test targets that use runtest.vim. # Keep test_alot*.res as the last one, sort the others. # test_largefile.res is omitted, it uses too much resources to run on CI. --- 305,310 ---- *** ../vim-8.2.1122/src/testdir/Make_vms.mms 2020-07-03 18:00:00.293531826 +0200 --- src/testdir/Make_vms.mms 2020-07-03 21:15:11.916328885 +0200 *************** *** 4,10 **** # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # ! # Last change: 2019 May 31 # # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. # Edit the lines in the Configuration section below to select. --- 4,10 ---- # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # ! # Last change: 2020 Jul 03 # # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. # Edit the lines in the Configuration section below to select. *************** *** 115,124 **** SCRIPT_GDIFF = test47.out .ENDIF - .IFDEF HAVE_PYTHON - SCRIPT_PYTHON = test87.out - .ENDIF - .in.out : -@ !clean up before doing the test -@ if "''F$SEARCH("test.out.*")'" .NES. "" then delete/noconfirm/nolog test.out.* --- 115,120 ---- *************** *** 140,146 **** -@ if "''F$SEARCH("Xtest.*")'" .NES. "" then delete/noconfirm/nolog Xtest.*.* all : clean nolog $(START_WITH) $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_WIN) $(SCRIPT_SPELL) $(SCRIPT_ODS5) \ ! $(SCRIPT_GDIFF) $(SCRIPT_MZSCH) $(SCRIPT_LUA) $(SCRIPT_PYTHON) nolog -@ write sys$output " " -@ write sys$output "-----------------------------------------------" -@ write sys$output " All done" --- 136,142 ---- -@ if "''F$SEARCH("Xtest.*")'" .NES. "" then delete/noconfirm/nolog Xtest.*.* all : clean nolog $(START_WITH) $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_WIN) $(SCRIPT_SPELL) $(SCRIPT_ODS5) \ ! $(SCRIPT_GDIFF) $(SCRIPT_MZSCH) $(SCRIPT_LUA) nolog -@ write sys$output " " -@ write sys$output "-----------------------------------------------" -@ write sys$output " All done" *** ../vim-8.2.1122/src/testdir/test87.in 2020-04-14 20:15:45.284566193 +0200 --- src/testdir/test87.in 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,1725 **** - Tests for various python features. vim: set ft=vim : - - STARTTEST - :so small.vim - :set noswapfile - :if !has('python3') || !has('quickfix') | e! test.ok | wq! test.out | endif - :lang C - :fun Test() - :py3 import vim - :py3 cb = vim.current.buffer - :let l = [] - :py3 l=vim.bindeval('l') - :py3 f=vim.bindeval('function("strlen")') - :" Extending List directly with different types - :py3 l+=[1, "as'd", [1, 2, f, {'a': 1}]] - :$put =string(l) - :$put =string(l[-1]) - :try - : $put =string(l[-4]) - :catch - : $put =v:exception[:13] - :endtry - :" List assignment - :py3 l[0]=0 - :$put =string(l) - :py3 l[-2]=f - :$put =string(l) - :" - :" Extending Dictionary directly with different types - :let d = {} - :fun d.f() - : return 1 - :endfun - py3 << trim EOF - d=vim.bindeval('d') - d['1']='asd' - d.update() # Must not do anything, including throwing errors - d.update(b=[1, 2, f]) - d.update((('-1', {'a': 1}),)) - d.update({'0': -1}) - dk = d.keys() - dv = d.values() - di = d.items() - dk.sort(key=repr) - dv.sort(key=repr) - di.sort(key=repr) - EOF - :$put =py3eval('d[''f''](self={})') - :$put =py3eval('repr(dk)') - :$put =substitute(py3eval('repr(dv)'),'0x\x\+','','g') - :$put =substitute(py3eval('repr(di)'),'0x\x\+','','g') - :for [key, Val] in sort(items(d)) - : $put =string(key) . ' : ' . string(Val) - : unlet key Val - :endfor - :py3 del dk - :py3 del di - :py3 del dv - :" - :" removing items with del - :py3 del l[2] - :$put =string(l) - :let l = range(8) - :py3 l=vim.bindeval('l') - :try - : py3 del l[:3] - : py3 del l[1:] - :catch - : $put =v:exception - :endtry - :$put =string(l) - :" - :py3 del d['-1'] - :py3 del d['f'] - :$put =string(py3eval('d.get(''b'', 1)')) - :$put =string(py3eval('d.pop(''b'')')) - :$put =string(py3eval('d.get(''b'', 1)')) - :$put =string(py3eval('d.pop(''1'', 2)')) - :$put =string(py3eval('d.pop(''1'', 2)')) - :$put =py3eval('repr(d.has_key(''0''))') - :$put =py3eval('repr(d.has_key(''1''))') - :$put =py3eval('repr(''0'' in d)') - :$put =py3eval('repr(''1'' in d)') - :$put =py3eval('repr(list(iter(d)))') - :$put =string(d) - :$put =py3eval('repr(d.popitem())') - :$put =py3eval('repr(d.get(''0''))') - :$put =py3eval('repr(list(iter(d)))') - :" - :" removing items out of range: silently skip items that don't exist - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :" The following two ranges delete nothing as they match empty list: - :py3 del l[2:1] - :$put =string(l) - :py3 del l[2:2] - :$put =string(l) - :py3 del l[2:3] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[2:4] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[2:5] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[2:6] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :" The following two ranges delete nothing as they match empty list: - :py3 del l[-1:2] - :$put =string(l) - :py3 del l[-2:2] - :$put =string(l) - :py3 del l[-3:2] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[-4:2] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[-5:2] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[-6:2] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[::2] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[3:0:-2] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 del l[2:4:-2] - :$put =string(l) - :" - :" Slice assignment to a list - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[0:0]=['a'] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[1:2]=['b'] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[2:4]=['c'] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[4:4]=['d'] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[-1:2]=['e'] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[-10:2]=['f'] - :$put =string(l) - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :py3 l[2:-10]=['g'] - :$put =string(l) - :let l = [] - :py3 l=vim.bindeval('l') - :py3 l[0:0]=['h'] - :$put =string(l) - :let l = range(8) - :py3 l=vim.bindeval('l') - :py3 l[2:6:2] = [10, 20] - :$put =string(l) - :let l = range(8) - :py3 l=vim.bindeval('l') - :py3 l[6:2:-2] = [10, 20] - :$put =string(l) - :let l = range(8) - :py3 l=vim.bindeval('l') - :py3 l[6:2] = () - :$put =string(l) - :let l = range(8) - :py3 l=vim.bindeval('l') - :py3 l[6:2:1] = () - :$put =string(l) - :let l = range(8) - :py3 l=vim.bindeval('l') - :py3 l[2:2:1] = () - :$put =string(l) - :" - :" Locked variables - :let l = [0, 1, 2, 3] - :py3 l=vim.bindeval('l') - :lockvar! l - py3 << trim EOF - def emsg(ei): - return ei[0].__name__ + ':' + repr(ei[1].args) - - try: - l[2]='i' - except vim.error: - cb.append('l[2] threw vim.error: ' + emsg(sys.exc_info())) - EOF - :$put =string(l) - :unlockvar! l - :" - :" Function calls - py3 << trim EOF - import sys - import re - - py33_type_error_pattern = re.compile('^__call__\(\) takes (\d+) positional argument but (\d+) were given$') - py37_exception_repr = re.compile(r'([^\(\),])(\)+)$') - - def ee(expr, g=globals(), l=locals()): - cb = vim.current.buffer - try: - try: - exec(expr, g, l) - except Exception as e: - 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."): - msg = repr((e.__class__, AttributeError(str(e)[str(e).rfind(" '") + 2:-1]))) - elif sys.version_info >= (3, 3) and e.__class__ is ImportError and str(e).find('No module named \'') >= 0: - msg = repr((e.__class__, ImportError(str(e).replace("'", '')))) - elif sys.version_info >= (3, 6) and e.__class__ is ModuleNotFoundError: - # Python 3.6 gives ModuleNotFoundError, change it to an ImportError - msg = repr((ImportError, ImportError(str(e).replace("'", '')))) - elif sys.version_info >= (3, 3) and e.__class__ is TypeError: - m = py33_type_error_pattern.search(str(e)) - if m: - msg = '__call__() takes exactly {0} positional argument ({1} given)'.format(m.group(1), m.group(2)) - msg = repr((e.__class__, TypeError(msg))) - else: - msg = repr((e.__class__, e)) - # Messages changed with Python 3.6, change new to old. - newmsg1 = """'argument must be str, bytes or bytearray, not None'""" - oldmsg1 = '''"Can't convert 'NoneType' object to str implicitly"''' - if msg.find(newmsg1) > -1: - msg = msg.replace(newmsg1, oldmsg1) - newmsg2 = """'argument must be str, bytes or bytearray, not int'""" - oldmsg2 = '''"Can't convert 'int' object to str implicitly"''' - if msg.find(newmsg2) > -1: - msg = msg.replace(newmsg2, oldmsg2) - elif sys.version_info >= (3, 5) and e.__class__ is ValueError and str(e) == 'embedded null byte': - msg = repr((TypeError, TypeError('expected bytes with no null'))) - else: - msg = repr((e.__class__, e)) - # Some Python versions say can't, others cannot. - if msg.find('can\'t') > -1: - msg = msg.replace('can\'t', 'cannot') - # Some Python versions use single quote, some double quote - if msg.find('"cannot ') > -1: - msg = msg.replace('"cannot ', '\'cannot ') - if msg.find(' attributes"') > -1: - msg = msg.replace(' attributes"', ' attributes\'') - if sys.version_info >= (3, 7): - msg = py37_exception_repr.sub(r'\1,\2', msg) - cb.append(expr + ':' + msg) - else: - cb.append(expr + ':NOT FAILED') - except Exception as e: - msg = repr((e.__class__, e)) - if sys.version_info >= (3, 7): - msg = py37_exception_repr.sub(r'\1,\2', msg) - cb.append(expr + '::' + msg) - EOF - :fun New(...) - : return ['NewStart']+a:000+['NewEnd'] - :endfun - :fun DictNew(...) dict - : return ['DictNewStart']+a:000+['DictNewEnd', self] - :endfun - :let l=[function('New'), function('DictNew')] - :py3 l=vim.bindeval('l') - :py3 l.extend(list(l[0](1, 2, 3))) - :$put =string(l) - :py3 l.extend(list(l[1](1, 2, 3, self={'a': 'b'}))) - :$put =string(l) - :py3 l+=[l[0].name] - :$put =string(l) - :py3 ee('l[1](1, 2, 3)') - :py3 f=l[0] - :delfunction New - :py3 ee('f(1, 2, 3)') - :if has('float') - : let l=[0.0] - : py3 l=vim.bindeval('l') - : py3 l.extend([0.0]) - : $put =string(l) - :else - : $put ='[0.0, 0.0]' - :endif - :let messages=[] - :delfunction DictNew - py3 << trim EOF - import sys - d=vim.bindeval('{}') - m=vim.bindeval('messages') - def em(expr, g=globals(), l=locals()): - try: - exec(expr, g, l) - except Exception as e: - if sys.version_info >= (3, 5) and e.__class__ is ValueError and str(e) == 'embedded null byte': - m.extend([TypeError.__name__]) - else: - m.extend([e.__class__.__name__]) - - em('d["abc1"]') - em('d["abc1"]="\\0"') - em('d["abc1"]=vim') - em('d[""]=1') - em('d["a\\0b"]=1') - em('d[b"a\\0b"]=1') - - em('d.pop("abc1")') - em('d.popitem()') - del em - del m - EOF - :$put =messages - :unlet messages - :" locked and scope attributes - :let d={} | let dl={} | lockvar dl - :for s in split("d dl v: g:") - : let name=tr(s, ':', 's') - : execute 'py3 '.name.'=vim.bindeval("'.s.'")' - : let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".py3eval(name.".".v:val)'), ';') - : $put =toput - :endfor - :silent! let d.abc2=1 - :silent! let dl.abc3=1 - :py3 d.locked=True - :py3 dl.locked=False - :silent! let d.def=1 - :silent! let dl.def=1 - :put ='d:'.string(d) - :put ='dl:'.string(dl) - :unlet d dl - : - :let l=[] | let ll=[] | lockvar ll - :for s in split("l ll") - : let name=tr(s, ':', 's') - : execute 'py3 '.name.'=vim.bindeval("'.s.'")' - : let toput=s.' : locked:'.py3eval(name.'.locked') - : $put =toput - :endfor - :silent! call extend(l, [0]) - :silent! call extend(ll, [0]) - :py3 l.locked=True - :py3 ll.locked=False - :silent! call extend(l, [1]) - :silent! call extend(ll, [1]) - :put ='l:'.string(l) - :put ='ll:'.string(ll) - :unlet l ll - :" - :" py3eval() - :let l=py3eval('[0, 1, 2]') - :$put =string(l) - :let d=py3eval('{"a": "b", "c": 1, "d": ["e"]}') - :$put =sort(items(d)) - :let v:errmsg = '' - :$put ='py3eval(\"None\") = ' . py3eval('None') . v:errmsg - :if has('float') - : let f=py3eval('0.0') - : $put =string(f) - :else - : $put ='0.0' - :endif - :" Invalid values: - :for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim'] - : try - : let v=py3eval(e) - : catch - : let toput=e.":\t".v:exception[:13] - : $put =toput - : endtry - :endfor - :" - :" threading - :let l = [0] - :py3 l=vim.bindeval('l') - py3 << trim EOF - import threading - import time - - class T(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - self.t = 0 - self.running = True - - def run(self): - while self.running: - self.t += 1 - time.sleep(0.1) - - t = T() - del T - t.start() - EOF - :sleep 1 - :py3 t.running = False - :py3 t.join() - :" Check if the background thread is working. Count should be 10, but on a - :" busy system (AppVeyor) it can be much lower. - :py3 l[0] = t.t > 4 - :py3 del time - :py3 del threading - :py3 del t - :$put =string(l) - :" - :" settrace - :let l = [] - :py3 l=vim.bindeval('l') - py3 << trim EOF - import sys - - def traceit(frame, event, arg): - global l - if event == "line": - l += [frame.f_lineno] - return traceit - - def trace_main(): - for i in range(5): - pass - EOF - :py3 sys.settrace(traceit) - :py3 trace_main() - :py3 sys.settrace(None) - :py3 del traceit - :py3 del trace_main - :$put =string(l) - :" - :" Slice - :py3 ll = vim.bindeval('[0, 1, 2, 3, 4, 5]') - :py3 l = ll[:4] - :$put =string(py3eval('l')) - :py3 l = ll[2:] - :$put =string(py3eval('l')) - :py3 l = ll[:-4] - :$put =string(py3eval('l')) - :py3 l = ll[-2:] - :$put =string(py3eval('l')) - :py3 l = ll[2:4] - :$put =string(py3eval('l')) - :py3 l = ll[4:2] - :$put =string(py3eval('l')) - :py3 l = ll[-4:-2] - :$put =string(py3eval('l')) - :py3 l = ll[-2:-4] - :$put =string(py3eval('l')) - :py3 l = ll[:] - :$put =string(py3eval('l')) - :py3 l = ll[0:6] - :$put =string(py3eval('l')) - :py3 l = ll[-10:10] - :$put =string(py3eval('l')) - :py3 l = ll[4:2:-1] - :$put =string(py3eval('l')) - :py3 l = ll[::2] - :$put =string(py3eval('l')) - :py3 l = ll[4:2:1] - :$put =string(py3eval('l')) - :py3 del l - :" - :" Vars - :let g:foo = 'bac' - :let w:abc3 = 'def' - :let b:baz = 'bar' - :let t:bar = 'jkl' - :try - : throw "Abc" - :catch - : put =py3eval('vim.vvars[''exception'']') - :endtry - :put =py3eval('vim.vars[''foo'']') - :put =py3eval('vim.current.window.vars[''abc3'']') - :put =py3eval('vim.current.buffer.vars[''baz'']') - :put =py3eval('vim.current.tabpage.vars[''bar'']') - :" - :" Options - :" paste: boolean, global - :" previewheight number, global - :" operatorfunc: string, global - :" number: boolean, window-local - :" numberwidth: number, window-local - :" colorcolumn: string, window-local - :" statusline: string, window-local/global - :" autoindent: boolean, buffer-local - :" shiftwidth: number, buffer-local - :" omnifunc: string, buffer-local - :" preserveindent: boolean, buffer-local/global - :" path: string, buffer-local/global - :let g:bufs=[bufnr('%')] - :new - :let g:bufs+=[bufnr('%')] - :vnew - :let g:bufs+=[bufnr('%')] - :wincmd j - :vnew - :let g:bufs+=[bufnr('%')] - :wincmd l - :fun RecVars(opt) - : let gval =string(eval('&g:'.a:opt)) - : let wvals=join(map(range(1, 4), 'v:val.":".string(getwinvar(v:val, "&".a:opt))')) - : let bvals=join(map(copy(g:bufs), 'v:val.":".string(getbufvar(v:val, "&".a:opt))')) - : put =' G: '.gval - : put =' W: '.wvals - : put =' B: '.wvals - :endfun - py3 << trim EOF - def e(s, g=globals(), l=locals()): - try: - exec(s, g, l) - except Exception as e: - vim.command('return ' + repr(e.__class__.__name__)) - - def ev(s, g=globals(), l=locals()): - try: - return eval(s, g, l) - except Exception as e: - vim.command('let exc=' + repr(e.__class__.__name__)) - return 0 - EOF - :fun E(s) - : python3 e(vim.eval('a:s')) - :endfun - :fun Ev(s) - : let r=py3eval('ev(vim.eval("a:s"))') - : if exists('exc') - : throw exc - : endif - : return r - :endfun - :py3 gopts1=vim.options - :py3 wopts1=vim.windows[2].options - :py3 wopts2=vim.windows[0].options - :py3 wopts3=vim.windows[1].options - :py3 bopts1=vim.buffers[vim.bindeval("g:bufs")[2]].options - :py3 bopts2=vim.buffers[vim.bindeval("g:bufs")[1]].options - :py3 bopts3=vim.buffers[vim.bindeval("g:bufs")[0]].options - :$put ='wopts iters equal: '.py3eval('list(wopts1) == list(wopts2)') - :$put ='bopts iters equal: '.py3eval('list(bopts1) == list(bopts2)') - :py3 gset=set(iter(gopts1)) - :py3 wset=set(iter(wopts1)) - :py3 bset=set(iter(bopts1)) - :set path=.,..,, - :let lst=[] - :let lst+=[['paste', 1, 0, 1, 2, 1, 1, 0 ]] - :let lst+=[['previewheight', 5, 1, 6, 'a', 0, 1, 0 ]] - :let lst+=[['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0 ]] - :let lst+=[['number', 0, 1, 1, 0, 1, 0, 1 ]] - :let lst+=[['numberwidth', 2, 3, 5, -100, 0, 0, 1 ]] - :let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1 ]] - :let lst+=[['statusline', '1', '2', '4', 0, 0, 1, 1 ]] - :let lst+=[['autoindent', 0, 1, 1, 2, 1, 0, 2 ]] - :let lst+=[['shiftwidth', 0, 2, 1, 3, 0, 0, 2 ]] - :let lst+=[['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2 ]] - :let lst+=[['preserveindent', 0, 1, 1, 2, 1, 1, 2 ]] - :let lst+=[['path', '.,,', ',,', '.', 0, 0, 1, 2 ]] - :for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst - : py3 oname=vim.eval('oname') - : py3 oval1=vim.bindeval('oval1') - : py3 oval2=vim.bindeval('oval2') - : py3 oval3=vim.bindeval('oval3') - : if invval is 0 || invval is 1 - : py3 invval=bool(vim.bindeval('invval')) - : else - : py3 invval=vim.bindeval('invval') - : endif - : if bool - : py3 oval1=bool(oval1) - : py3 oval2=bool(oval2) - : py3 oval3=bool(oval3) - : endif - : put ='>>> '.oname - : $put =' g/w/b:'.py3eval('oname in gset').'/'.py3eval('oname in wset').'/'.py3eval('oname in bset') - : $put =' g/w/b (in):'.py3eval('oname in gopts1').'/'.py3eval('oname in wopts1').'/'.py3eval('oname in bopts1') - : for v in ['gopts1', 'wopts1', 'bopts1'] - : try - : put =' p/'.v.': '.Ev('repr('.v.'['''.oname.'''])') - : catch - : put =' p/'.v.'! '.v:exception - : endtry - : let r=E(v.'['''.oname.''']=invval') - : if r isnot 0 - : put =' inv: '.string(invval).'! '.r - : endif - : for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3']) - : let val=substitute(vv, '^.opts', 'oval', '') - : let r=E(vv.'['''.oname.''']='.val) - : if r isnot 0 - : put =' '.vv.'! '.r - : endif - : endfor - : endfor - : call RecVars(oname) - : for v in ['wopts3', 'bopts3'] - : let r=E('del '.v.'["'.oname.'"]') - : if r isnot 0 - : put =' del '.v.'! '.r - : endif - : endfor - : call RecVars(oname) - :endfor - :delfunction RecVars - :delfunction E - :delfunction Ev - :py3 del ev - :py3 del e - :only - :for buf in g:bufs[1:] - : execute 'bwipeout!' buf - :endfor - :py3 del gopts1 - :py3 del wopts1 - :py3 del wopts2 - :py3 del wopts3 - :py3 del bopts1 - :py3 del bopts2 - :py3 del bopts3 - :py3 del oval1 - :py3 del oval2 - :py3 del oval3 - :py3 del oname - :py3 del invval - :" - :" Test buffer object - :vnew - :put ='First line' - :put ='Second line' - :put ='Third line' - :1 delete _ - :py3 b=vim.current.buffer - :wincmd w - :mark a - :augroup BUFS - : autocmd BufFilePost * python3 cb.append(vim.eval('expand("")') + ':BufFilePost:' + vim.eval('bufnr("%")')) - : autocmd BufFilePre * python3 cb.append(vim.eval('expand("")') + ':BufFilePre:' + vim.eval('bufnr("%")')) - :augroup END - py3 << trim EOF - # Tests BufferAppend and BufferItem - cb.append(b[0]) - # Tests BufferSlice and BufferAssSlice - cb.append('abc5') # Will be overwritten - cb[-1:] = b[:-2] - # Test BufferLength and BufferAssSlice - cb.append('def') # Will not be overwritten - cb[len(cb):] = b[:] - # Test BufferAssItem and BufferMark - cb.append('ghi') # Will be overwritten - cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1])) - # Test BufferRepr - cb.append(repr(cb) + repr(b)) - # Modify foreign buffer - b.append('foo') - b[0]='bar' - b[0:0]=['baz'] - vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number) - # Test assigning to name property - import os - old_name = cb.name - cb.name = 'foo' - cb.append(cb.name[-11:].replace(os.path.sep, '/')) - b.name = 'bar' - cb.append(b.name[-11:].replace(os.path.sep, '/')) - cb.name = old_name - cb.append(cb.name[-17:].replace(os.path.sep, '/')) - del old_name - # Test CheckBuffer - for _b in vim.buffers: - if _b is not cb: - vim.command('bwipeout! ' + str(_b.number)) - del _b - cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid))) - for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")'): - try: - exec(expr) - except vim.error: - pass - else: - # Usually a SEGV here - # Should not happen in any case - cb.append('No exception for ' + expr) - vim.command('cd .') - del b - EOF - :" - :" Test vim.buffers object - :set hidden - :edit a - :buffer # - :edit b - :buffer # - :edit c - :buffer # - py3 << trim EOF - # Check GCing iterator that was not fully exhausted - i = iter(vim.buffers) - cb.append('i:' + str(next(i))) - # and also check creating more than one iterator at a time - i2 = iter(vim.buffers) - cb.append('i2:' + str(next(i2))) - cb.append('i:' + str(next(i))) - # The following should trigger GC and not cause any problems - del i - del i2 - i3 = iter(vim.buffers) - cb.append('i3:' + str(next(i3))) - del i3 - - prevnum = 0 - for b in vim.buffers: - # Check buffer order - if prevnum >= b.number: - cb.append('!!! Buffer numbers not in strictly ascending order') - # Check indexing: vim.buffers[number].number == number - cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + '=' + repr(b)) - prevnum = b.number - del prevnum - - cb.append(str(len(vim.buffers))) - - bnums = list(map(lambda b: b.number, vim.buffers))[1:] - - # Test wiping out buffer with existing iterator - i4 = iter(vim.buffers) - cb.append('i4:' + str(next(i4))) - vim.command('bwipeout! ' + str(bnums.pop(0))) - try: - next(i4) - except vim.error: - pass - else: - cb.append('!!!! No vim.error') - i4 = iter(vim.buffers) - vim.command('bwipeout! ' + str(bnums.pop(-1))) - vim.command('bwipeout! ' + str(bnums.pop(-1))) - cb.append('i4:' + str(next(i4))) - try: - next(i4) - except StopIteration: - cb.append('StopIteration') - del i4 - del bnums - EOF - :" - :" Test vim.{tabpage,window}list and vim.{tabpage,window} objects - :tabnew 0 - :tabnew 1 - :vnew a.1 - :tabnew 2 - :vnew a.2 - :vnew b.2 - :vnew c.2 - py3 << trim EOF - cb.append('Number of tabs: ' + str(len(vim.tabpages))) - cb.append('Current tab pages:') - - def W(w): - if '(unknown)' in repr(w): - return '' - else: - return repr(w) - - def Cursor(w, start=len(cb)): - if w.buffer is cb: - return repr((start - w.cursor[0], w.cursor[1])) - else: - return repr(w.cursor) - - for t in vim.tabpages: - cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window)) - cb.append(' Windows:') - for w in t.windows: - cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w)) - # Other values depend on the size of the terminal, so they are checked partly: - for attr in ('height', 'row', 'width', 'col'): - try: - aval = getattr(w, attr) - if type(aval) is not int: - raise TypeError - if aval < 0: - raise ValueError - except Exception as e: - cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + e.__class__.__name__) - del aval - del attr - w.cursor = (len(w.buffer), 0) - del W - del Cursor - cb.append('Number of windows in current tab page: ' + str(len(vim.windows))) - if list(vim.windows) != list(vim.current.tabpage.windows): - cb.append('!!!!!! Windows differ') - EOF - :" - :" Test vim.current - py3 << trim EOF - def H(o): - return repr(o) - cb.append('Current tab page: ' + repr(vim.current.tabpage)) - cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window)) - cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer)) - del H - # Assigning: fails - try: - vim.current.window = vim.tabpages[0].window - except ValueError: - cb.append('ValueError at assigning foreign tab window') - - for attr in ('window', 'tabpage', 'buffer'): - try: - setattr(vim.current, attr, None) - except TypeError: - cb.append('Type error at assigning None to vim.current.' + attr) - del attr - - # Assigning: success - vim.current.tabpage = vim.tabpages[-2] - vim.current.buffer = cb - vim.current.window = vim.windows[0] - vim.current.window.cursor = (len(vim.current.buffer), 0) - cb.append('Current tab page: ' + repr(vim.current.tabpage)) - cb.append('Current window: ' + repr(vim.current.window)) - cb.append('Current buffer: ' + repr(vim.current.buffer)) - cb.append('Current line: ' + repr(vim.current.line)) - ws = list(vim.windows) - ts = list(vim.tabpages) - for b in vim.buffers: - if b is not cb: - vim.command('bwipeout! ' + str(b.number)) - del b - cb.append('w.valid: ' + repr([w.valid for w in ws])) - cb.append('t.valid: ' + repr([t.valid for t in ts])) - del w - del t - del ts - del ws - EOF - :tabonly! - :only! - :" - :" Test types - py3 << trim EOF - for expr, attr in ( - ('vim.vars', 'Dictionary'), - ('vim.options', 'Options'), - ('vim.bindeval("{}")', 'Dictionary'), - ('vim.bindeval("[]")', 'List'), - ('vim.bindeval("function(\'tr\')")', 'Function'), - ('vim.current.buffer', 'Buffer'), - ('vim.current.range', 'Range'), - ('vim.current.window', 'Window'), - ('vim.current.tabpage', 'TabPage'), - ): - cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr))) - del expr - del attr - EOF - :" - :" Test __dir__() method - py3 << trim EOF - for name, o in ( - ('current', vim.current), - ('buffer', vim.current.buffer), - ('window', vim.current.window), - ('tabpage', vim.current.tabpage), - ('range', vim.current.range), - ('dictionary', vim.bindeval('{}')), - ('list', vim.bindeval('[]')), - ('function', vim.bindeval('function("tr")')), - ('output', sys.stdout), - ): - cb.append(name + ':' + ','.join(dir(o))) - del name - del o - EOF - :" - :" Test vim.*.__new__ - :$put =string(py3eval('vim.Dictionary({})')) - :$put =string(py3eval('vim.Dictionary(a=1)')) - :$put =string(py3eval('vim.Dictionary(((''a'', 1),))')) - :$put =string(py3eval('vim.List()')) - :$put =string(py3eval('vim.List(iter(''abc7''))')) - :$put =string(py3eval('vim.Function(''tr'')')) - :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4])')) - :$put =string(py3eval('vim.Function(''tr'', args=[])')) - :$put =string(py3eval('vim.Function(''tr'', self={})')) - :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], self={})')) - :$put ='auto_rebind' - :$put =string(py3eval('vim.Function(''tr'', auto_rebind=False)')) - :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) - :$put =string(py3eval('vim.Function(''tr'', args=[], auto_rebind=False)')) - :$put =string(py3eval('vim.Function(''tr'', self={}, auto_rebind=False)')) - :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)')) - :" - :" Test vim.Function - :function Args(...) - : return a:000 - :endfunction - :function SelfArgs(...) dict - : return [a:000, self] - :endfunction - :" The following four lines should not crash - :let Pt = function('tr', [[]], {'l': []}) - :py3 Pt = vim.bindeval('Pt') - :unlet Pt - :py3 del Pt - py3 << trim EOF - def ecall(out_prefix, func, *args, **kwargs): - line = out_prefix + ': ' - try: - ret = func(*args, **kwargs) - except Exception: - line += '!exception: ' + emsg(sys.exc_info()) - else: - line += '!result: ' + str(vim.Function('string')(ret), 'utf-8') - cb.append(line) - a = vim.Function('Args') - pa1 = vim.Function('Args', args=['abcArgsPA1']) - pa2 = vim.Function('Args', args=[]) - pa3 = vim.Function('Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'}) - pa4 = vim.Function('Args', self={'abcSelfPA4': 'abcSelfPA4Val'}) - cb.append('a: ' + repr(a)) - cb.append('pa1: ' + repr(pa1)) - cb.append('pa2: ' + repr(pa2)) - cb.append('pa3: ' + repr(pa3)) - cb.append('pa4: ' + repr(pa4)) - sa = vim.Function('SelfArgs') - psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1']) - psa2 = vim.Function('SelfArgs', args=[]) - psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) - psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) - psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0) - psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=()) - psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[]) - psa8 = vim.Function('SelfArgs', auto_rebind=False) - psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True) - psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1) - psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'}) - psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC']) - cb.append('sa: ' + repr(sa)) - cb.append('psa1: ' + repr(psa1)) - cb.append('psa2: ' + repr(psa2)) - cb.append('psa3: ' + repr(psa3)) - cb.append('psa4: ' + repr(psa4)) - cb.append('psa5: ' + repr(psa5)) - cb.append('psa6: ' + repr(psa6)) - cb.append('psa7: ' + repr(psa7)) - cb.append('psa8: ' + repr(psa8)) - cb.append('psa9: ' + repr(psa9)) - cb.append('psaA: ' + repr(psaA)) - cb.append('psaB: ' + repr(psaB)) - cb.append('psaC: ' + repr(psaC)) - - psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) - psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] - psar.self['rec'] = psar - psar.self['self'] = psar.self - psar.self['args'] = psar.args - - try: - cb.append('psar: ' + repr(psar)) - except Exception: - cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info())) - EOF - :$put ='s(a): '.string(py3eval('a')) - :$put ='s(pa1): '.string(py3eval('pa1')) - :$put ='s(pa2): '.string(py3eval('pa2')) - :$put ='s(pa3): '.string(py3eval('pa3')) - :$put ='s(pa4): '.string(py3eval('pa4')) - :$put ='s(sa): '.string(py3eval('sa')) - :$put ='s(psa1): '.string(py3eval('psa1')) - :$put ='s(psa2): '.string(py3eval('psa2')) - :$put ='s(psa3): '.string(py3eval('psa3')) - :$put ='s(psa4): '.string(py3eval('psa4')) - :$put ='s(psa5): '.string(py3eval('psa5')) - :$put ='s(psa6): '.string(py3eval('psa6')) - :$put ='s(psa7): '.string(py3eval('psa7')) - :$put ='s(psa8): '.string(py3eval('psa8')) - :$put ='s(psa9): '.string(py3eval('psa9')) - :$put ='s(psaA): '.string(py3eval('psaA')) - :$put ='s(psaB): '.string(py3eval('psaB')) - :$put ='s(psaC): '.string(py3eval('psaC')) - : - :for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] - : let d = {'f': py3eval(v)} - : $put ='d.'.v.'(): '.string(d.f()) - :endfor - : - :py3 ecall('a()', a, ) - :py3 ecall('pa1()', pa1, ) - :py3 ecall('pa2()', pa2, ) - :py3 ecall('pa3()', pa3, ) - :py3 ecall('pa4()', pa4, ) - :py3 ecall('sa()', sa, ) - :py3 ecall('psa1()', psa1, ) - :py3 ecall('psa2()', psa2, ) - :py3 ecall('psa3()', psa3, ) - :py3 ecall('psa4()', psa4, ) - : - :py3 ecall('a(42, 43)', a, 42, 43) - :py3 ecall('pa1(42, 43)', pa1, 42, 43) - :py3 ecall('pa2(42, 43)', pa2, 42, 43) - :py3 ecall('pa3(42, 43)', pa3, 42, 43) - :py3 ecall('pa4(42, 43)', pa4, 42, 43) - :py3 ecall('sa(42, 43)', sa, 42, 43) - :py3 ecall('psa1(42, 43)', psa1, 42, 43) - :py3 ecall('psa2(42, 43)', psa2, 42, 43) - :py3 ecall('psa3(42, 43)', psa3, 42, 43) - :py3 ecall('psa4(42, 43)', psa4, 42, 43) - : - :py3 ecall('a(42, self={"20": 1})', a, 42, self={'20': 1}) - :py3 ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1}) - :py3 ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1}) - :py3 ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1}) - :py3 ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1}) - :py3 ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1}) - :py3 ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1}) - :py3 ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1}) - :py3 ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1}) - :py3 ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1}) - : - :py3 ecall('a(self={"20": 1})', a, self={'20': 1}) - :py3 ecall('pa1(self={"20": 1})', pa1, self={'20': 1}) - :py3 ecall('pa2(self={"20": 1})', pa2, self={'20': 1}) - :py3 ecall('pa3(self={"20": 1})', pa3, self={'20': 1}) - :py3 ecall('pa4(self={"20": 1})', pa4, self={'20': 1}) - :py3 ecall('sa(self={"20": 1})', sa, self={'20': 1}) - :py3 ecall('psa1(self={"20": 1})', psa1, self={'20': 1}) - :py3 ecall('psa2(self={"20": 1})', psa2, self={'20': 1}) - :py3 ecall('psa3(self={"20": 1})', psa3, self={'20': 1}) - :py3 ecall('psa4(self={"20": 1})', psa4, self={'20': 1}) - py3 << trim EOF - def s(v): - if v is None: - return repr(v) - else: - return str(vim.Function('string')(v), 'utf-8') - - cb.append('a.args: ' + s(a.args)) - cb.append('pa1.args: ' + s(pa1.args)) - cb.append('pa2.args: ' + s(pa2.args)) - cb.append('pa3.args: ' + s(pa3.args)) - cb.append('pa4.args: ' + s(pa4.args)) - cb.append('sa.args: ' + s(sa.args)) - cb.append('psa1.args: ' + s(psa1.args)) - cb.append('psa2.args: ' + s(psa2.args)) - cb.append('psa3.args: ' + s(psa3.args)) - cb.append('psa4.args: ' + s(psa4.args)) - - cb.append('a.self: ' + s(a.self)) - cb.append('pa1.self: ' + s(pa1.self)) - cb.append('pa2.self: ' + s(pa2.self)) - cb.append('pa3.self: ' + s(pa3.self)) - cb.append('pa4.self: ' + s(pa4.self)) - cb.append('sa.self: ' + s(sa.self)) - cb.append('psa1.self: ' + s(psa1.self)) - cb.append('psa2.self: ' + s(psa2.self)) - cb.append('psa3.self: ' + s(psa3.self)) - cb.append('psa4.self: ' + s(psa4.self)) - - cb.append('a.name: ' + s(a.name)) - cb.append('pa1.name: ' + s(pa1.name)) - cb.append('pa2.name: ' + s(pa2.name)) - cb.append('pa3.name: ' + s(pa3.name)) - cb.append('pa4.name: ' + s(pa4.name)) - cb.append('sa.name: ' + s(sa.name)) - cb.append('psa1.name: ' + s(psa1.name)) - cb.append('psa2.name: ' + s(psa2.name)) - cb.append('psa3.name: ' + s(psa3.name)) - cb.append('psa4.name: ' + s(psa4.name)) - - cb.append('a.auto_rebind: ' + s(a.auto_rebind)) - cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) - cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) - cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind)) - cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind)) - cb.append('sa.auto_rebind: ' + s(sa.auto_rebind)) - cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind)) - cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind)) - cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind)) - cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind)) - cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind)) - cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind)) - cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind)) - cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind)) - cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind)) - cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) - cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) - cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) - - del s - - del a - del pa1 - del pa2 - del pa3 - del pa4 - del sa - del psa1 - del psa2 - del psa3 - del psa4 - del psa5 - del psa6 - del psa7 - del psa8 - del psa9 - del psaA - del psaB - del psaC - del psar - - del ecall - EOF - :" - :" Test stdout/stderr - :redir => messages - :py3 sys.stdout.write('abc8') ; sys.stdout.write('def') - :py3 sys.stderr.write('abc9') ; sys.stderr.write('def') - :py3 sys.stdout.writelines(iter('abcA')) - :py3 sys.stderr.writelines(iter('abcB')) - :redir END - :$put =string(substitute(messages, '\d\+', '', 'g')) - :" Test subclassing - :fun Put(...) - : $put =string(a:000) - : return a:000 - :endfun - py3 << trim EOF - class DupDict(vim.Dictionary): - def __setitem__(self, key, value): - super(DupDict, self).__setitem__(key, value) - super(DupDict, self).__setitem__('dup_' + key, value) - dd = DupDict() - dd['a'] = 'b' - - class DupList(vim.List): - def __getitem__(self, idx): - return [super(DupList, self).__getitem__(idx)] * 2 - - dl = DupList() - dl2 = DupList(iter('abcC')) - dl.extend(dl2[0]) - - class DupFun(vim.Function): - def __call__(self, arg): - return super(DupFun, self).__call__(arg, arg) - - df = DupFun('Put') - EOF - :$put =string(sort(keys(py3eval('dd')))) - :$put =string(py3eval('dl')) - :$put =string(py3eval('dl2')) - :$put =string(py3eval('df(2)')) - :$put =string(py3eval('dl') is# py3eval('dl')) - :$put =string(py3eval('dd') is# py3eval('dd')) - :$put =string(py3eval('df')) - :delfunction Put - py3 << trim EOF - del DupDict - del DupList - del DupFun - del dd - del dl - del dl2 - del df - EOF - :" - :" Test chdir - py3 << trim EOF - import os - fnamemodify = vim.Function('fnamemodify') - cb.append(str(fnamemodify('.', ':p:h:t'))) - cb.append(vim.eval('@%')) - os.chdir('..') - path = fnamemodify('.', ':p:h:t') - if path != b'src': - # Running tests from a shadow directory, so move up another level - # This will result in @% looking like shadow/testdir/test87.in, hence the - # slicing to remove the leading path and path separator - os.chdir('..') - cb.append(str(fnamemodify('.', ':p:h:t'))) - cb.append(vim.eval('@%')[len(path)+1:].replace(os.path.sep, '/')) - os.chdir(path) - else: - cb.append(str(fnamemodify('.', ':p:h:t'))) - cb.append(vim.eval('@%').replace(os.path.sep, '/')) - del path - os.chdir('testdir') - cb.append(str(fnamemodify('.', ':p:h:t'))) - cb.append(vim.eval('@%')) - del fnamemodify - EOF - :" - :" Test errors - :fun F() dict - :endfun - :fun D() - :endfun - py3 << trim EOF - d = vim.Dictionary() - ned = vim.Dictionary(foo='bar', baz='abcD') - dl = vim.Dictionary(a=1) - dl.locked = True - l = vim.List() - ll = vim.List('abcE') - ll.locked = True - nel = vim.List('abcO') - f = vim.Function('string') - fd = vim.Function('F') - fdel = vim.Function('D') - vim.command('delfunction D') - - def subexpr_test(expr, name, subexprs): - cb.append('>>> Testing %s using %s' % (name, expr)) - for subexpr in subexprs: - ee(expr % subexpr) - cb.append('<<< Finished') - - def stringtochars_test(expr): - return subexpr_test(expr, 'StringToChars', ( - '1', # Fail type checks - 'b"\\0"', # Fail PyString_AsStringAndSize(object, , NULL) check - '"\\0"', # Fail PyString_AsStringAndSize(bytes, , NULL) check - )) - - class Mapping(object): - def __init__(self, d): - self.d = d - - def __getitem__(self, key): - return self.d[key] - - def keys(self): - return self.d.keys() - - def items(self): - return self.d.items() - - def convertfrompyobject_test(expr, recurse=True): - # pydict_to_tv - stringtochars_test(expr % '{%s : 1}') - if recurse: - convertfrompyobject_test(expr % '{"abcF" : %s}', False) - # pymap_to_tv - stringtochars_test(expr % 'Mapping({%s : 1})') - if recurse: - convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False) - # pyseq_to_tv - iter_test(expr) - return subexpr_test(expr, 'ConvertFromPyObject', ( - 'None', # Not conversible - '{b"": 1}', # Empty key not allowed - '{"": 1}', # Same, but with unicode object - 'FailingMapping()', # - 'FailingMappingKey()', # - 'FailingNumber()', # - )) - - def convertfrompymapping_test(expr): - convertfrompyobject_test(expr) - return subexpr_test(expr, 'ConvertFromPyMapping', ( - '[]', - )) - - def iter_test(expr): - return subexpr_test(expr, '*Iter*', ( - 'FailingIter()', - 'FailingIterNext()', - )) - - def number_test(expr, natural=False, unsigned=False): - if natural: - unsigned = True - return subexpr_test(expr, 'NumberToLong', ( - '[]', - 'None', - ) + (('-1',) if unsigned else ()) - + (('0',) if natural else ())) - - class FailingTrue(object): - def __bool__(self): - raise NotImplementedError('bool') - - class FailingIter(object): - def __iter__(self): - raise NotImplementedError('iter') - - class FailingIterNext(object): - def __iter__(self): - return self - - def __next__(self): - raise NotImplementedError('next') - - class FailingIterNextN(object): - def __init__(self, n): - self.n = n - - def __iter__(self): - return self - - def __next__(self): - if self.n: - self.n -= 1 - return 1 - else: - raise NotImplementedError('next N') - - class FailingMappingKey(object): - def __getitem__(self, item): - raise NotImplementedError('getitem:mappingkey') - - def keys(self): - return list("abcH") - - class FailingMapping(object): - def __getitem__(self): - raise NotImplementedError('getitem:mapping') - - def keys(self): - raise NotImplementedError('keys') - - class FailingList(list): - def __getitem__(self, idx): - if i == 2: - raise NotImplementedError('getitem:list') - else: - return super(FailingList, self).__getitem__(idx) - - class NoArgsCall(object): - def __call__(self): - pass - - class FailingCall(object): - def __call__(self, path): - raise NotImplementedError('call') - - class FailingNumber(object): - def __int__(self): - raise NotImplementedError('int') - - cb.append("> Output") - cb.append(">> OutputSetattr") - ee('del sys.stdout.softspace') - number_test('sys.stdout.softspace = %s', unsigned=True) - number_test('sys.stderr.softspace = %s', unsigned=True) - ee('assert sys.stdout.isatty()==False') - ee('assert sys.stdout.seekable()==False') - ee('sys.stdout.close()') - ee('sys.stdout.flush()') - ee('assert sys.stderr.isatty()==False') - ee('assert sys.stderr.seekable()==False') - ee('sys.stderr.close()') - ee('sys.stderr.flush()') - ee('sys.stdout.attr = None') - cb.append(">> OutputWrite") - ee('assert sys.stdout.writable()==True') - ee('assert sys.stdout.readable()==False') - ee('assert sys.stderr.writable()==True') - ee('assert sys.stderr.readable()==False') - ee('assert sys.stdout.closed()==False') - ee('assert sys.stderr.closed()==False') - ee('assert sys.stdout.errors=="strict"') - ee('assert sys.stderr.errors=="strict"') - ee('assert sys.stdout.encoding==sys.stderr.encoding') - ee('sys.stdout.write(None)') - cb.append(">> OutputWriteLines") - ee('sys.stdout.writelines(None)') - ee('sys.stdout.writelines([1])') - iter_test('sys.stdout.writelines(%s)') - cb.append("> VimCommand") - stringtochars_test('vim.command(%s)') - ee('vim.command("", 2)') - #! Not checked: vim->python exceptions translating: checked later - cb.append("> VimToPython") - #! Not checked: everything: needs errors in internal python functions - cb.append("> VimEval") - stringtochars_test('vim.eval(%s)') - ee('vim.eval("", FailingTrue())') - #! Not checked: everything: needs errors in internal python functions - cb.append("> VimEvalPy") - stringtochars_test('vim.bindeval(%s)') - ee('vim.eval("", 2)') - #! Not checked: vim->python exceptions translating: checked later - cb.append("> VimStrwidth") - stringtochars_test('vim.strwidth(%s)') - cb.append("> VimForeachRTP") - ee('vim.foreach_rtp(None)') - ee('vim.foreach_rtp(NoArgsCall())') - ee('vim.foreach_rtp(FailingCall())') - ee('vim.foreach_rtp(int, 2)') - cb.append('> import') - old_rtp = vim.options['rtp'] - vim.options['rtp'] = os.getcwd().replace('\\', '\\\\').replace(',', '\\,') - ee('import xxx_no_such_module_xxx') - ee('import failing_import') - ee('import failing') - vim.options['rtp'] = old_rtp - del old_rtp - cb.append("> Options") - cb.append(">> OptionsItem") - ee('vim.options["abcQ"]') - ee('vim.options[""]') - stringtochars_test('vim.options[%s]') - cb.append(">> OptionsContains") - stringtochars_test('%s in vim.options') - cb.append("> Dictionary") - cb.append(">> DictionaryConstructor") - ee('vim.Dictionary("abcI")') - ##! Not checked: py_dict_alloc failure - cb.append(">> DictionarySetattr") - ee('del d.locked') - ee('d.locked = FailingTrue()') - ee('vim.vvars.locked = False') - ee('d.scope = True') - ee('d.xxx = True') - cb.append(">> _DictionaryItem") - ee('d.get("a", 2, 3)') - stringtochars_test('d.get(%s)') - ee('d.pop("a")') - ee('dl.pop("a")') - cb.append(">> DictionaryContains") - ee('"" in d') - ee('0 in d') - cb.append(">> DictionaryIterNext") - ee('for i in ned: ned["a"] = 1') - del i - cb.append(">> DictionaryAssItem") - ee('dl["b"] = 1') - stringtochars_test('d[%s] = 1') - convertfrompyobject_test('d["a"] = %s') - cb.append(">> DictionaryUpdate") - cb.append(">>> kwargs") - cb.append(">>> iter") - ee('d.update(FailingMapping())') - ee('d.update([FailingIterNext()])') - ee('d.update([FailingIterNextN(1)])') - iter_test('d.update(%s)') - convertfrompyobject_test('d.update(%s)') - stringtochars_test('d.update(((%s, 0),))') - convertfrompyobject_test('d.update((("a", %s),))') - cb.append(">> DictionaryPopItem") - ee('d.popitem(1, 2)') - cb.append(">> DictionaryHasKey") - ee('d.has_key()') - cb.append("> List") - cb.append(">> ListConstructor") - ee('vim.List(1, 2)') - ee('vim.List(a=1)') - iter_test('vim.List(%s)') - convertfrompyobject_test('vim.List([%s])') - cb.append(">> ListItem") - ee('l[1000]') - cb.append(">> ListAssItem") - ee('ll[1] = 2') - ee('l[1000] = 3') - cb.append(">> ListAssSlice") - ee('ll[1:100] = "abcJ"') - iter_test('l[:] = %s') - ee('nel[1:10:2] = "abcK"') - cb.append(repr(tuple(nel))) - ee('nel[1:10:2] = "a"') - cb.append(repr(tuple(nel))) - ee('nel[1:1:-1] = "a"') - cb.append(repr(tuple(nel))) - ee('nel[:] = FailingIterNextN(2)') - cb.append(repr(tuple(nel))) - convertfrompyobject_test('l[:] = [%s]') - cb.append(">> ListConcatInPlace") - iter_test('l.extend(%s)') - convertfrompyobject_test('l.extend([%s])') - cb.append(">> ListSetattr") - ee('del l.locked') - ee('l.locked = FailingTrue()') - ee('l.xxx = True') - cb.append("> Function") - cb.append(">> FunctionConstructor") - cb.append(">>> FunctionConstructor") - ee('vim.Function("123")') - ee('vim.Function("xxx_non_existent_function_xxx")') - ee('vim.Function("xxx#non#existent#function#xxx")') - ee('vim.Function("xxx_non_existent_function_xxx2", args=[])') - ee('vim.Function("xxx_non_existent_function_xxx3", self={})') - ee('vim.Function("xxx_non_existent_function_xxx4", args=[], self={})') - cb.append(">>> FunctionNew") - ee('vim.Function("tr", self="abcFuncSelf")') - ee('vim.Function("tr", args=427423)') - ee('vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2")') - ee('vim.Function(self="abcFuncSelf2", args="abcFuncArgs2")') - ee('vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2")') - ee('vim.Function("tr", "")') - cb.append(">> FunctionCall") - convertfrompyobject_test('f(%s)') - convertfrompymapping_test('fd(self=%s)') - cb.append("> TabPage") - cb.append(">> TabPageAttr") - ee('vim.current.tabpage.xxx') - cb.append("> TabList") - cb.append(">> TabListItem") - ee('vim.tabpages[1000]') - cb.append("> Window") - cb.append(">> WindowAttr") - ee('vim.current.window.xxx') - cb.append(">> WindowSetattr") - ee('vim.current.window.buffer = 0') - ee('vim.current.window.cursor = (100000000, 100000000)') - ee('vim.current.window.cursor = True') - number_test('vim.current.window.height = %s', unsigned=True) - number_test('vim.current.window.width = %s', unsigned=True) - ee('vim.current.window.xxxxxx = True') - cb.append("> WinList") - cb.append(">> WinListItem") - ee('vim.windows[1000]') - cb.append("> Buffer") - cb.append(">> StringToLine (indirect)") - ee('vim.current.buffer[0] = "\\na"') - ee('vim.current.buffer[0] = b"\\na"') - cb.append(">> SetBufferLine (indirect)") - ee('vim.current.buffer[0] = True') - cb.append(">> SetBufferLineList (indirect)") - ee('vim.current.buffer[:] = True') - ee('vim.current.buffer[:] = ["\\na", "bc"]') - cb.append(">> InsertBufferLines (indirect)") - ee('vim.current.buffer.append(None)') - ee('vim.current.buffer.append(["\\na", "bc"])') - ee('vim.current.buffer.append("\\nbc")') - cb.append(">> RBItem") - ee('vim.current.buffer[100000000]') - cb.append(">> RBAsItem") - ee('vim.current.buffer[100000000] = ""') - cb.append(">> BufferAttr") - ee('vim.current.buffer.xxx') - cb.append(">> BufferSetattr") - ee('vim.current.buffer.name = True') - ee('vim.current.buffer.xxx = True') - cb.append(">> BufferMark") - ee('vim.current.buffer.mark(0)') - ee('vim.current.buffer.mark("abcM")') - ee('vim.current.buffer.mark("!")') - cb.append(">> BufferRange") - ee('vim.current.buffer.range(1, 2, 3)') - cb.append("> BufMap") - cb.append(">> BufMapItem") - ee('vim.buffers[100000000]') - number_test('vim.buffers[%s]', natural=True) - cb.append("> Current") - cb.append(">> CurrentGetattr") - ee('vim.current.xxx') - cb.append(">> CurrentSetattr") - ee('vim.current.line = True') - ee('vim.current.buffer = True') - ee('vim.current.window = True') - ee('vim.current.tabpage = True') - ee('vim.current.xxx = True') - del d - del ned - del dl - del l - del ll - del nel - del f - del fd - del fdel - del subexpr_test - del stringtochars_test - del Mapping - del convertfrompyobject_test - del convertfrompymapping_test - del iter_test - del number_test - del FailingTrue - del FailingIter - del FailingIterNext - del FailingIterNextN - del FailingMapping - del FailingMappingKey - del FailingList - del NoArgsCall - del FailingCall - del FailingNumber - EOF - :delfunction F - :" - :" Test import - py3 << trim EOF - sys.path.insert(0, os.path.join(os.getcwd(), 'python_before')) - sys.path.append(os.path.join(os.getcwd(), 'python_after')) - vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\') - l = [] - def callback(path): - l.append(os.path.relpath(path)) - vim.foreach_rtp(callback) - cb.append(repr(l)) - del l - def callback(path): - return os.path.relpath(path) - cb.append(repr(vim.foreach_rtp(callback))) - del callback - from module import dir as d - from modulex import ddir - cb.append(d + ',' + ddir) - import before - cb.append(before.dir) - import after - cb.append(after.dir) - import topmodule as tm - import topmodule.submodule as tms - import topmodule.submodule.subsubmodule.subsubsubmodule as tmsss - cb.append(tm.__file__.replace(os.path.sep, '/')[-len('modulex/topmodule/__init__.py'):]) - cb.append(tms.__file__.replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/__init__.py'):]) - cb.append(tmsss.__file__.replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/subsubmodule/subsubsubmodule.py'):]) - del before - del after - del d - del ddir - del tm - del tms - del tmsss - EOF - :" - :" Test exceptions - :fun Exe(e) - : execute a:e - :endfun - py3 << trim EOF - Exe = vim.bindeval('function("Exe")') - ee('vim.command("throw \'abcN\'")') - ee('Exe("throw \'def\'")') - ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")') - ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")') - ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")') - ee('vim.eval("xxx_unknown_function_xxx()")') - ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")') - del Exe - EOF - :delfunction Exe - :" - :" Regression: interrupting vim.command propagates to next vim.command - py3 << trim EOF - def test_keyboard_interrupt(): - try: - vim.command('while 1 | endwhile') - except KeyboardInterrupt: - cb.append('Caught KeyboardInterrupt') - except Exception: - cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info())) - else: - cb.append('!!!!!!!! No exception') - try: - vim.command('$ put =\'Running :put\'') - except KeyboardInterrupt: - cb.append('!!!!!!!! Caught KeyboardInterrupt') - except Exception: - cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info())) - else: - cb.append('No exception') - EOF - :debuggreedy - :call inputsave() - :call feedkeys("s\ns\ns\ns\nq\n") - :redir => output - :debug silent! py3 test_keyboard_interrupt() - :redir END - :0 debuggreedy - :call inputrestore() - :silent $put =output - :unlet output - :py3 del test_keyboard_interrupt - :" - :" Cleanup - py3 << trim EOF - del cb - del ee - del emsg - del sys - del os - del vim - EOF - :endfun - :" - :fun RunTest() - :let checkrefs = !empty($PYTHONDUMPREFS) - :let start = getline(1, '$') - :for i in range(checkrefs ? 10 : 1) - : if i != 0 - : %d _ - : call setline(1, start) - : endif - : call Test() - : if i == 0 - : let result = getline(1, '$') - : endif - :endfor - :if checkrefs - : %d _ - : call setline(1, result) - :endif - :endfun - :" - :call RunTest() - :delfunction RunTest - :delfunction Test - :call garbagecollect(1) - :" - :/^start:/,$wq! test.out - :/^start:/,$w! test.out - :" vim: et ts=4 isk-=\: - :while getchar(0) isnot 0|endwhile - ENDTEST - - start: --- 0 ---- *** ../vim-8.2.1122/src/testdir/test87.ok 2020-05-12 13:08:03.432962765 +0200 --- src/testdir/test87.ok 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,1445 **** - start: - [1, 'as''d', [1, 2, function('strlen'), {'a': 1}]] - [1, 2, function('strlen'), {'a': 1}] - Vim(put):E684: - [0, 'as''d', [1, 2, function('strlen'), {'a': 1}]] - [0, function('strlen'), [1, 2, function('strlen'), {'a': 1}]] - 1 - [b'-1', b'0', b'1', b'b', b'f'] - [-1, , , , b'asd'] - [(b'-1', ), (b'0', -1), (b'1', b'asd'), (b'b', ), (b'f', )] - '-1' : {'a': 1} - '0' : -1 - '1' : 'asd' - 'b' : [1, 2, function('strlen')] - 'f' : function('1') - [0, function('strlen')] - [3] - [1, 2, function('strlen')] - [1, 2, function('strlen')] - 1 - 'asd' - 2 - True - False - True - False - [b'0'] - {'0': -1} - (b'0', -1) - None - [] - [0, 1, 2, 3] - [0, 1, 2, 3] - [0, 1, 3] - [0, 1] - [0, 1] - [0, 1] - [0, 1, 2, 3] - [0, 1, 2, 3] - [0, 2, 3] - [2, 3] - [2, 3] - [2, 3] - [1, 3] - [0, 2] - [0, 1, 2, 3] - ['a', 0, 1, 2, 3] - [0, 'b', 2, 3] - [0, 1, 'c'] - [0, 1, 2, 3, 'd'] - [0, 1, 2, 'e', 3] - ['f', 2, 3] - [0, 1, 'g', 2, 3] - ['h'] - [0, 1, 10, 3, 20, 5, 6, 7] - [0, 1, 2, 3, 20, 5, 10, 7] - [0, 1, 2, 3, 4, 5, 6, 7] - [0, 1, 2, 3, 4, 5, 6, 7] - [0, 1, 2, 3, 4, 5, 6, 7] - l[2] threw vim.error: error:('list is locked',) - [0, 1, 2, 3] - [function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd'] - [function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}] - [function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}, 'New'] - l[1](1, 2, 3):(, error('Vim:E725: Calling dict function without Dictionary: DictNew',)) - f(1, 2, 3):(, error('Vim:E117: Unknown function: New',)) - [0.0, 0.0] - KeyError - TypeError - TypeError - ValueError - TypeError - TypeError - KeyError - KeyError - d : locked:0;scope:0 - dl : locked:1;scope:0 - v: : locked:2;scope:1 - g: : locked:0;scope:2 - d:{'abc2': 1} - dl:{'def': 1} - l : locked:0 - ll : locked:1 - l:[0] - ll:[1] - [0, 1, 2] - ['a', 'b'] - ['c', 1] - ['d', ['e']] - py3eval("None") = v:none - 0.0 - "\0": Vim(let):E859: - {"\0": 1}: Vim(let):E859: - undefined_name: Vim(let):NameE - vim: Vim(let):E859: - [1] - [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1] - [0, 1, 2, 3] - [2, 3, 4, 5] - [0, 1] - [4, 5] - [2, 3] - [] - [2, 3] - [] - [0, 1, 2, 3, 4, 5] - [0, 1, 2, 3, 4, 5] - [0, 1, 2, 3, 4, 5] - [4, 3] - [0, 2, 4] - [] - Abc - bac - def - bar - jkl - wopts iters equal: 1 - bopts iters equal: 1 - >>> paste - g/w/b:1/0/0 - g/w/b (in):1/0/0 - p/gopts1: False - p/wopts1! KeyError - inv: 2! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1! KeyError - inv: 2! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: 1 - W: 1:1 2:1 3:1 4:1 - B: 1:1 2:1 3:1 4:1 - del wopts3! KeyError - del bopts3! KeyError - G: 1 - W: 1:1 2:1 3:1 4:1 - B: 1:1 2:1 3:1 4:1 - >>> previewheight - g/w/b:1/0/0 - g/w/b (in):1/0/0 - p/gopts1: 12 - inv: 'a'! TypeError - p/wopts1! KeyError - inv: 'a'! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1! KeyError - inv: 'a'! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: 5 - W: 1:5 2:5 3:5 4:5 - B: 1:5 2:5 3:5 4:5 - del wopts3! KeyError - del bopts3! KeyError - G: 5 - W: 1:5 2:5 3:5 4:5 - B: 1:5 2:5 3:5 4:5 - >>> operatorfunc - g/w/b:1/0/0 - g/w/b (in):1/0/0 - p/gopts1: b'' - inv: 2! TypeError - p/wopts1! KeyError - inv: 2! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1! KeyError - inv: 2! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: 'A' - W: 1:'A' 2:'A' 3:'A' 4:'A' - B: 1:'A' 2:'A' 3:'A' 4:'A' - del wopts3! KeyError - del bopts3! KeyError - G: 'A' - W: 1:'A' 2:'A' 3:'A' 4:'A' - B: 1:'A' 2:'A' 3:'A' 4:'A' - >>> number - g/w/b:0/1/0 - g/w/b (in):0/1/0 - p/gopts1! KeyError - inv: 0! KeyError - gopts1! KeyError - p/wopts1: False - p/bopts1! KeyError - inv: 0! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: 0 - W: 1:1 2:1 3:0 4:0 - B: 1:1 2:1 3:0 4:0 - del wopts3! ValueError - del bopts3! KeyError - G: 0 - W: 1:1 2:1 3:0 4:0 - B: 1:1 2:1 3:0 4:0 - >>> numberwidth - g/w/b:0/1/0 - g/w/b (in):0/1/0 - p/gopts1! KeyError - inv: -100! KeyError - gopts1! KeyError - p/wopts1: 8 - inv: -100! error - p/bopts1! KeyError - inv: -100! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: 8 - W: 1:3 2:5 3:2 4:8 - B: 1:3 2:5 3:2 4:8 - del wopts3! ValueError - del bopts3! KeyError - G: 8 - W: 1:3 2:5 3:2 4:8 - B: 1:3 2:5 3:2 4:8 - >>> colorcolumn - g/w/b:0/1/0 - g/w/b (in):0/1/0 - p/gopts1! KeyError - inv: 'abc4'! KeyError - gopts1! KeyError - p/wopts1: b'' - inv: 'abc4'! error - p/bopts1! KeyError - inv: 'abc4'! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: '' - W: 1:'+2' 2:'+3' 3:'+1' 4:'' - B: 1:'+2' 2:'+3' 3:'+1' 4:'' - del wopts3! ValueError - del bopts3! KeyError - G: '' - W: 1:'+2' 2:'+3' 3:'+1' 4:'' - B: 1:'+2' 2:'+3' 3:'+1' 4:'' - >>> statusline - g/w/b:1/1/0 - g/w/b (in):1/1/0 - p/gopts1: b'' - inv: 0! TypeError - p/wopts1: None - inv: 0! TypeError - p/bopts1! KeyError - inv: 0! KeyError - bopts1! KeyError - bopts2! KeyError - bopts3! KeyError - G: '1' - W: 1:'2' 2:'4' 3:'1' 4:'1' - B: 1:'2' 2:'4' 3:'1' 4:'1' - del bopts3! KeyError - G: '1' - W: 1:'2' 2:'1' 3:'1' 4:'1' - B: 1:'2' 2:'1' 3:'1' 4:'1' - >>> autoindent - g/w/b:0/0/1 - g/w/b (in):0/0/1 - p/gopts1! KeyError - inv: 2! KeyError - gopts1! KeyError - p/wopts1! KeyError - inv: 2! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1: False - G: 0 - W: 1:0 2:1 3:0 4:1 - B: 1:0 2:1 3:0 4:1 - del wopts3! KeyError - del bopts3! ValueError - G: 0 - W: 1:0 2:1 3:0 4:1 - B: 1:0 2:1 3:0 4:1 - >>> shiftwidth - g/w/b:0/0/1 - g/w/b (in):0/0/1 - p/gopts1! KeyError - inv: 3! KeyError - gopts1! KeyError - p/wopts1! KeyError - inv: 3! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1: 8 - G: 8 - W: 1:0 2:2 3:8 4:1 - B: 1:0 2:2 3:8 4:1 - del wopts3! KeyError - del bopts3! ValueError - G: 8 - W: 1:0 2:2 3:8 4:1 - B: 1:0 2:2 3:8 4:1 - >>> omnifunc - g/w/b:0/0/1 - g/w/b (in):0/0/1 - p/gopts1! KeyError - inv: 1! KeyError - gopts1! KeyError - p/wopts1! KeyError - inv: 1! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1: b'' - inv: 1! TypeError - G: '' - W: 1:'A' 2:'B' 3:'' 4:'C' - B: 1:'A' 2:'B' 3:'' 4:'C' - del wopts3! KeyError - del bopts3! ValueError - G: '' - W: 1:'A' 2:'B' 3:'' 4:'C' - B: 1:'A' 2:'B' 3:'' 4:'C' - >>> preserveindent - g/w/b:0/0/1 - g/w/b (in):0/0/1 - p/gopts1! KeyError - inv: 2! KeyError - gopts1! KeyError - p/wopts1! KeyError - inv: 2! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1: False - G: 0 - W: 1:0 2:1 3:0 4:1 - B: 1:0 2:1 3:0 4:1 - del wopts3! KeyError - del bopts3! ValueError - G: 0 - W: 1:0 2:1 3:0 4:1 - B: 1:0 2:1 3:0 4:1 - >>> path - g/w/b:1/0/1 - g/w/b (in):1/0/1 - p/gopts1: b'.,..,,' - inv: 0! TypeError - p/wopts1! KeyError - inv: 0! KeyError - wopts1! KeyError - wopts2! KeyError - wopts3! KeyError - p/bopts1: None - inv: 0! TypeError - G: '.,,' - W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' - B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' - del wopts3! KeyError - G: '.,,' - W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' - B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' - First line - First line - def - First line - Second line - Third line - (7, 2) - - baz - bar - Second line - Third line - foo - 1:BufFilePre:1 - 1:BufFilePost:1 - testdir/foo - 5:BufFilePre:5 - 5:BufFilePost:5 - testdir/bar - 1:BufFilePre:1 - 1:BufFilePost:1 - testdir/test87.in - valid: b:False, cb:True - i: - i2: - i: - i3: - 1:= - 8:= - 9:= - 10:= - 4 - i4: - i4: - StopIteration - Number of tabs: 4 - Current tab pages: - (1): 1 windows, current is - Windows: - (1): displays buffer ; cursor is at (37, 0) - (2): 1 windows, current is - Windows: - (1): displays buffer ; cursor is at (1, 0) - (3): 2 windows, current is - Windows: - (1): displays buffer ; cursor is at (1, 0) - (2): displays buffer ; cursor is at (1, 0) - (4): 4 windows, current is - Windows: - (1): displays buffer ; cursor is at (1, 0) - (2): displays buffer ; cursor is at (1, 0) - (3): displays buffer ; cursor is at (1, 0) - (4): displays buffer ; cursor is at (1, 0) - Number of windows in current tab page: 4 - Current tab page: - Current window: : is - Current buffer: : is is - ValueError at assigning foreign tab window - Type error at assigning None to vim.current.window - Type error at assigning None to vim.current.tabpage - Type error at assigning None to vim.current.buffer - Current tab page: - Current window: - Current buffer: - Current line: 'Type error at assigning None to vim.current.buffer' - w.valid: [True, False] - t.valid: [True, False, True, False] - vim.vars:Dictionary:True - vim.options:Options:True - vim.bindeval("{}"):Dictionary:True - vim.bindeval("[]"):List:True - vim.bindeval("function('tr')"):Function:True - vim.current.buffer:Buffer:True - vim.current.range:Range:True - vim.current.window:Window:True - vim.current.tabpage:TabPage:True - current:__dir__,buffer,line,range,tabpage,window - buffer:__dir__,append,mark,name,number,options,range,valid,vars - window:__dir__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width - tabpage:__dir__,number,valid,vars,window,windows - range:__dir__,append,end,start - dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values - list:__dir__,extend,locked - function:__dir__,args,auto_rebind,self,softspace - output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines - {} - {'a': 1} - {'a': 1} - [] - ['a', 'b', 'c', '7'] - function('tr') - function('tr', [123, 3, 4]) - function('tr') - function('tr', {}) - function('tr', [123, 3, 4], {}) - auto_rebind - function('tr') - function('tr', [123, 3, 4]) - function('tr') - function('tr', {}) - function('tr', [123, 3, 4], {}) - a: - pa1: - pa2: - pa3: - pa4: - sa: - psa1: - psa2: - psa3: - psa4: - psa5: - psa6: - psa7: - psa8: - psa9: - psaA: - psaB: - psaC: - psar: - s(a): function('Args') - s(pa1): function('Args', ['abcArgsPA1']) - s(pa2): function('Args') - s(pa3): function('Args', ['abcArgsPA3'], {'abcSelfPA3': 'abcSelfPA3Val'}) - s(pa4): function('Args', {'abcSelfPA4': 'abcSelfPA4Val'}) - s(sa): function('SelfArgs') - s(psa1): function('SelfArgs', ['abcArgsPSA1']) - s(psa2): function('SelfArgs') - s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) - s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) - s(psa5): function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}) - s(psa6): function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}) - s(psa7): function('SelfArgs', ['abcArgsPSA7']) - s(psa8): function('SelfArgs') - s(psa9): function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}) - s(psaA): function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}) - s(psaB): function('SelfArgs', ['abcArgsPSAB']) - s(psaC): function('SelfArgs') - d.sa(): [[], {'f': function('SelfArgs')}] - d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}] - d.psa2(): [[], {'f': function('SelfArgs')}] - d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] - d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] - d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}] - d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}] - d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}] - d.psa8(): [[], {'f': function('SelfArgs')}] - d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}] - d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}] - d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}] - d.psaC(): [[], {'f': function('SelfArgs')}] - a(): !result: [] - pa1(): !result: ['abcArgsPA1'] - pa2(): !result: [] - pa3(): !result: ['abcArgsPA3'] - pa4(): !result: [] - sa(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) - psa1(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) - psa2(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) - psa3(): !result: [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] - psa4(): !result: [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] - a(42, 43): !result: [42, 43] - pa1(42, 43): !result: ['abcArgsPA1', 42, 43] - pa2(42, 43): !result: [42, 43] - pa3(42, 43): !result: ['abcArgsPA3', 42, 43] - pa4(42, 43): !result: [42, 43] - sa(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) - psa1(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) - psa2(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) - psa3(42, 43): !result: [['abcArgsPSA3', 42, 43], {'abcSelfPSA3': 'abcSelfPSA3Val'}] - psa4(42, 43): !result: [[42, 43], {'abcSelfPSA4': 'abcSelfPSA4Val'}] - a(42, self={"20": 1}): !result: [42] - pa1(42, self={"20": 1}): !result: ['abcArgsPA1', 42] - pa2(42, self={"20": 1}): !result: [42] - pa3(42, self={"20": 1}): !result: ['abcArgsPA3', 42] - pa4(42, self={"20": 1}): !result: [42] - sa(42, self={"20": 1}): !result: [[42], {'20': 1}] - psa1(42, self={"20": 1}): !result: [['abcArgsPSA1', 42], {'20': 1}] - psa2(42, self={"20": 1}): !result: [[42], {'20': 1}] - psa3(42, self={"20": 1}): !result: [['abcArgsPSA3', 42], {'20': 1}] - psa4(42, self={"20": 1}): !result: [[42], {'20': 1}] - a(self={"20": 1}): !result: [] - pa1(self={"20": 1}): !result: ['abcArgsPA1'] - pa2(self={"20": 1}): !result: [] - pa3(self={"20": 1}): !result: ['abcArgsPA3'] - pa4(self={"20": 1}): !result: [] - sa(self={"20": 1}): !result: [[], {'20': 1}] - psa1(self={"20": 1}): !result: [['abcArgsPSA1'], {'20': 1}] - psa2(self={"20": 1}): !result: [[], {'20': 1}] - psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'20': 1}] - psa4(self={"20": 1}): !result: [[], {'20': 1}] - a.args: None - pa1.args: ['abcArgsPA1'] - pa2.args: None - pa3.args: ['abcArgsPA3'] - pa4.args: None - sa.args: None - psa1.args: ['abcArgsPSA1'] - psa2.args: None - psa3.args: ['abcArgsPSA3'] - psa4.args: None - a.self: None - pa1.self: None - pa2.self: None - pa3.self: {'abcSelfPA3': 'abcSelfPA3Val'} - pa4.self: {'abcSelfPA4': 'abcSelfPA4Val'} - sa.self: None - psa1.self: None - psa2.self: None - psa3.self: {'abcSelfPSA3': 'abcSelfPSA3Val'} - psa4.self: {'abcSelfPSA4': 'abcSelfPSA4Val'} - a.name: 'Args' - pa1.name: 'Args' - pa2.name: 'Args' - pa3.name: 'Args' - pa4.name: 'Args' - sa.name: 'SelfArgs' - psa1.name: 'SelfArgs' - psa2.name: 'SelfArgs' - psa3.name: 'SelfArgs' - psa4.name: 'SelfArgs' - a.auto_rebind: 1 - pa1.auto_rebind: 1 - pa2.auto_rebind: 1 - pa3.auto_rebind: 0 - pa4.auto_rebind: 0 - sa.auto_rebind: 1 - psa1.auto_rebind: 1 - psa2.auto_rebind: 1 - psa3.auto_rebind: 0 - psa4.auto_rebind: 0 - psa5.auto_rebind: 0 - psa6.auto_rebind: 0 - psa7.auto_rebind: 1 - psa8.auto_rebind: 1 - psa9.auto_rebind: 1 - psaA.auto_rebind: 1 - psaB.auto_rebind: 1 - psaC.auto_rebind: 1 - ' - abcdef - Error detected while processing function RunTest[]..Test: - line : - abcdef - abcA - line : - abcB' - ['a', 'dup_a'] - ['a', 'a'] - ['a', 'b', 'c', 'C'] - [2, 2] - [2, 2] - 1 - 1 - function('Put') - b'testdir' - test87.in - b'src' - testdir/test87.in - b'testdir' - test87.in - > Output - >> OutputSetattr - del sys.stdout.softspace:(, AttributeError('cannot delete OutputObject attributes',)) - >>> Testing NumberToLong using sys.stdout.softspace = %s - sys.stdout.softspace = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) - sys.stdout.softspace = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) - sys.stdout.softspace = -1:(, ValueError('number must be greater or equal to zero',)) - <<< Finished - >>> Testing NumberToLong using sys.stderr.softspace = %s - sys.stderr.softspace = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) - sys.stderr.softspace = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) - sys.stderr.softspace = -1:(, ValueError('number must be greater or equal to zero',)) - <<< Finished - assert sys.stdout.isatty()==False:NOT FAILED - assert sys.stdout.seekable()==False:NOT FAILED - sys.stdout.close():NOT FAILED - sys.stdout.flush():NOT FAILED - assert sys.stderr.isatty()==False:NOT FAILED - assert sys.stderr.seekable()==False:NOT FAILED - sys.stderr.close():NOT FAILED - sys.stderr.flush():NOT FAILED - sys.stdout.attr = None:(, AttributeError('invalid attribute: attr',)) - >> OutputWrite - assert sys.stdout.writable()==True:NOT FAILED - assert sys.stdout.readable()==False:NOT FAILED - assert sys.stderr.writable()==True:NOT FAILED - assert sys.stderr.readable()==False:NOT FAILED - assert sys.stdout.closed()==False:NOT FAILED - assert sys.stderr.closed()==False:NOT FAILED - assert sys.stdout.errors=="strict":NOT FAILED - assert sys.stderr.errors=="strict":NOT FAILED - assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED - sys.stdout.write(None):(, TypeError("Can't convert 'NoneType' object to str implicitly",)) - >> OutputWriteLines - sys.stdout.writelines(None):(, TypeError("'NoneType' object is not iterable",)) - sys.stdout.writelines([1]):(, TypeError("Can't convert 'int' object to str implicitly",)) - >>> Testing *Iter* using sys.stdout.writelines(%s) - sys.stdout.writelines(FailingIter()):(, NotImplementedError('iter',)) - sys.stdout.writelines(FailingIterNext()):(, NotImplementedError('next',)) - <<< Finished - > VimCommand - >>> Testing StringToChars using vim.command(%s) - vim.command(1):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.command(b"\0"):(, TypeError('expected bytes with no null',)) - vim.command("\0"):(, TypeError('expected bytes with no null',)) - <<< Finished - vim.command("", 2):(, TypeError('command() takes exactly one argument (2 given)',)) - > VimToPython - > VimEval - >>> Testing StringToChars using vim.eval(%s) - vim.eval(1):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.eval(b"\0"):(, TypeError('expected bytes with no null',)) - vim.eval("\0"):(, TypeError('expected bytes with no null',)) - <<< Finished - vim.eval("", FailingTrue()):(, TypeError('function takes exactly 1 argument (2 given)',)) - > VimEvalPy - >>> Testing StringToChars using vim.bindeval(%s) - vim.bindeval(1):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.bindeval(b"\0"):(, TypeError('expected bytes with no null',)) - vim.bindeval("\0"):(, TypeError('expected bytes with no null',)) - <<< Finished - vim.eval("", 2):(, TypeError('function takes exactly 1 argument (2 given)',)) - > VimStrwidth - >>> Testing StringToChars using vim.strwidth(%s) - vim.strwidth(1):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.strwidth(b"\0"):(, TypeError('expected bytes with no null',)) - vim.strwidth("\0"):(, TypeError('expected bytes with no null',)) - <<< Finished - > VimForeachRTP - vim.foreach_rtp(None):(, TypeError("'NoneType' object is not callable",)) - vim.foreach_rtp(NoArgsCall()):(, TypeError('__call__() takes exactly 1 positional argument (2 given)',)) - vim.foreach_rtp(FailingCall()):(, NotImplementedError('call',)) - vim.foreach_rtp(int, 2):(, TypeError('foreach_rtp() takes exactly one argument (2 given)',)) - > import - import xxx_no_such_module_xxx:(, ImportError('No module named xxx_no_such_module_xxx',)) - import failing_import:(, ImportError()) - import failing:(, NotImplementedError()) - > Options - >> OptionsItem - vim.options["abcQ"]:(, KeyError('abcQ',)) - vim.options[""]:(, ValueError('empty keys are not allowed',)) - >>> Testing StringToChars using vim.options[%s] - vim.options[1]:(, TypeError('expected bytes() or str() instance, but got int',)) - vim.options[b"\0"]:(, TypeError('expected bytes with no null',)) - vim.options["\0"]:(, TypeError('expected bytes with no null',)) - <<< Finished - >> OptionsContains - >>> Testing StringToChars using %s in vim.options - 1 in vim.options:(, TypeError('expected bytes() or str() instance, but got int',)) - b"\0" in vim.options:(, TypeError('expected bytes with no null',)) - "\0" in vim.options:(, TypeError('expected bytes with no null',)) - <<< Finished - > Dictionary - >> DictionaryConstructor - vim.Dictionary("abcI"):(, ValueError('expected sequence element of size 2, but got sequence of size 1',)) - >> DictionarySetattr - del d.locked:(, AttributeError('cannot delete vim.Dictionary attributes',)) - d.locked = FailingTrue():(, NotImplementedError('bool',)) - vim.vvars.locked = False:(, TypeError('cannot modify fixed dictionary',)) - d.scope = True:(, AttributeError('cannot set attribute scope',)) - d.xxx = True:(, AttributeError('cannot set attribute xxx',)) - >> _DictionaryItem - d.get("a", 2, 3):(, TypeError('function takes at most 2 arguments (3 given)',)) - >>> Testing StringToChars using d.get(%s) - d.get(1):(, TypeError('expected bytes() or str() instance, but got int',)) - d.get(b"\0"):(, TypeError('expected bytes with no null',)) - d.get("\0"):(, TypeError('expected bytes with no null',)) - <<< Finished - d.pop("a"):(, KeyError('a',)) - dl.pop("a"):(, error('dictionary is locked',)) - >> DictionaryContains - "" in d:(, ValueError('empty keys are not allowed',)) - 0 in d:(, TypeError('expected bytes() or str() instance, but got int',)) - >> DictionaryIterNext - for i in ned: ned["a"] = 1:(, RuntimeError('hashtab changed during iteration',)) - >> DictionaryAssItem - dl["b"] = 1:(, error('dictionary is locked',)) - >>> Testing StringToChars using d[%s] = 1 - d[1] = 1:(, TypeError('expected bytes() or str() instance, but got int',)) - d[b"\0"] = 1:(, TypeError('expected bytes with no null',)) - d["\0"] = 1:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d["a"] = {%s : 1} - d["a"] = {1 : 1}:(, TypeError('expected bytes() or str() instance, but got int',)) - d["a"] = {b"\0" : 1}:(, TypeError('expected bytes with no null',)) - d["a"] = {"\0" : 1}:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d["a"] = {"abcF" : {%s : 1}} - d["a"] = {"abcF" : {1 : 1}}:(, TypeError('expected bytes() or str() instance, but got int',)) - d["a"] = {"abcF" : {b"\0" : 1}}:(, TypeError('expected bytes with no null',)) - d["a"] = {"abcF" : {"\0" : 1}}:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d["a"] = {"abcF" : Mapping({%s : 1})} - d["a"] = {"abcF" : Mapping({1 : 1})}:(, TypeError('expected bytes() or str() instance, but got int',)) - d["a"] = {"abcF" : Mapping({b"\0" : 1})}:(, TypeError('expected bytes with no null',)) - d["a"] = {"abcF" : Mapping({"\0" : 1})}:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using d["a"] = {"abcF" : %s} - d["a"] = {"abcF" : FailingIter()}:(, TypeError('unable to convert FailingIter to a Vim structure',)) - d["a"] = {"abcF" : FailingIterNext()}:(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d["a"] = {"abcF" : %s} - d["a"] = {"abcF" : None}:NOT FAILED - d["a"] = {"abcF" : {b"": 1}}:(, ValueError('empty keys are not allowed',)) - d["a"] = {"abcF" : {"": 1}}:(, ValueError('empty keys are not allowed',)) - d["a"] = {"abcF" : FailingMapping()}:(, NotImplementedError('keys',)) - d["a"] = {"abcF" : FailingMappingKey()}:(, NotImplementedError('getitem:mappingkey',)) - d["a"] = {"abcF" : FailingNumber()}:(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using d["a"] = Mapping({%s : 1}) - d["a"] = Mapping({1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) - d["a"] = Mapping({b"\0" : 1}):(, TypeError('expected bytes with no null',)) - d["a"] = Mapping({"\0" : 1}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d["a"] = Mapping({"abcG" : {%s : 1}}) - d["a"] = Mapping({"abcG" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) - d["a"] = Mapping({"abcG" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) - d["a"] = Mapping({"abcG" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d["a"] = Mapping({"abcG" : Mapping({%s : 1})}) - d["a"] = Mapping({"abcG" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) - d["a"] = Mapping({"abcG" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) - d["a"] = Mapping({"abcG" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using d["a"] = Mapping({"abcG" : %s}) - d["a"] = Mapping({"abcG" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) - d["a"] = Mapping({"abcG" : FailingIterNext()}):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d["a"] = Mapping({"abcG" : %s}) - d["a"] = Mapping({"abcG" : None}):NOT FAILED - d["a"] = Mapping({"abcG" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) - d["a"] = Mapping({"abcG" : {"": 1}}):(, ValueError('empty keys are not allowed',)) - d["a"] = Mapping({"abcG" : FailingMapping()}):(, NotImplementedError('keys',)) - d["a"] = Mapping({"abcG" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) - d["a"] = Mapping({"abcG" : FailingNumber()}):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using d["a"] = %s - d["a"] = FailingIter():(, TypeError('unable to convert FailingIter to a Vim structure',)) - d["a"] = FailingIterNext():(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d["a"] = %s - d["a"] = None:NOT FAILED - d["a"] = {b"": 1}:(, ValueError('empty keys are not allowed',)) - d["a"] = {"": 1}:(, ValueError('empty keys are not allowed',)) - d["a"] = FailingMapping():(, NotImplementedError('keys',)) - d["a"] = FailingMappingKey():(, NotImplementedError('getitem:mappingkey',)) - d["a"] = FailingNumber():(, NotImplementedError('int',)) - <<< Finished - >> DictionaryUpdate - >>> kwargs - >>> iter - d.update(FailingMapping()):(, NotImplementedError('keys',)) - d.update([FailingIterNext()]):(, NotImplementedError('next',)) - d.update([FailingIterNextN(1)]):(, NotImplementedError('next N',)) - >>> Testing *Iter* using d.update(%s) - d.update(FailingIter()):(, NotImplementedError('iter',)) - d.update(FailingIterNext()):(, NotImplementedError('next',)) - <<< Finished - >>> Testing StringToChars using d.update({%s : 1}) - d.update({1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update({b"\0" : 1}):(, TypeError('expected bytes with no null',)) - d.update({"\0" : 1}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update({"abcF" : {%s : 1}}) - d.update({"abcF" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update({"abcF" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) - d.update({"abcF" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update({"abcF" : Mapping({%s : 1})}) - d.update({"abcF" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update({"abcF" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) - d.update({"abcF" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using d.update({"abcF" : %s}) - d.update({"abcF" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) - d.update({"abcF" : FailingIterNext()}):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d.update({"abcF" : %s}) - d.update({"abcF" : None}):NOT FAILED - d.update({"abcF" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) - d.update({"abcF" : {"": 1}}):(, ValueError('empty keys are not allowed',)) - d.update({"abcF" : FailingMapping()}):(, NotImplementedError('keys',)) - d.update({"abcF" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) - d.update({"abcF" : FailingNumber()}):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using d.update(Mapping({%s : 1})) - d.update(Mapping({1 : 1})):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update(Mapping({b"\0" : 1})):(, TypeError('expected bytes with no null',)) - d.update(Mapping({"\0" : 1})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update(Mapping({"abcG" : {%s : 1}})) - d.update(Mapping({"abcG" : {1 : 1}})):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update(Mapping({"abcG" : {b"\0" : 1}})):(, TypeError('expected bytes with no null',)) - d.update(Mapping({"abcG" : {"\0" : 1}})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update(Mapping({"abcG" : Mapping({%s : 1})})) - d.update(Mapping({"abcG" : Mapping({1 : 1})})):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update(Mapping({"abcG" : Mapping({b"\0" : 1})})):(, TypeError('expected bytes with no null',)) - d.update(Mapping({"abcG" : Mapping({"\0" : 1})})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using d.update(Mapping({"abcG" : %s})) - d.update(Mapping({"abcG" : FailingIter()})):(, TypeError('unable to convert FailingIter to a Vim structure',)) - d.update(Mapping({"abcG" : FailingIterNext()})):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d.update(Mapping({"abcG" : %s})) - d.update(Mapping({"abcG" : None})):NOT FAILED - d.update(Mapping({"abcG" : {b"": 1}})):(, ValueError('empty keys are not allowed',)) - d.update(Mapping({"abcG" : {"": 1}})):(, ValueError('empty keys are not allowed',)) - d.update(Mapping({"abcG" : FailingMapping()})):(, NotImplementedError('keys',)) - d.update(Mapping({"abcG" : FailingMappingKey()})):(, NotImplementedError('getitem:mappingkey',)) - d.update(Mapping({"abcG" : FailingNumber()})):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using d.update(%s) - d.update(FailingIter()):(, NotImplementedError('iter',)) - d.update(FailingIterNext()):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d.update(%s) - d.update(None):(, TypeError("'NoneType' object is not iterable",)) - d.update({b"": 1}):(, ValueError('empty keys are not allowed',)) - d.update({"": 1}):(, ValueError('empty keys are not allowed',)) - d.update(FailingMapping()):(, NotImplementedError('keys',)) - d.update(FailingMappingKey()):(, NotImplementedError('getitem:mappingkey',)) - d.update(FailingNumber()):(, TypeError("'FailingNumber' object is not iterable",)) - <<< Finished - >>> Testing StringToChars using d.update(((%s, 0),)) - d.update(((1, 0),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update(((b"\0", 0),)):(, TypeError('expected bytes with no null',)) - d.update((("\0", 0),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update((("a", {%s : 1}),)) - d.update((("a", {1 : 1}),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update((("a", {b"\0" : 1}),)):(, TypeError('expected bytes with no null',)) - d.update((("a", {"\0" : 1}),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update((("a", {"abcF" : {%s : 1}}),)) - d.update((("a", {"abcF" : {1 : 1}}),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update((("a", {"abcF" : {b"\0" : 1}}),)):(, TypeError('expected bytes with no null',)) - d.update((("a", {"abcF" : {"\0" : 1}}),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update((("a", {"abcF" : Mapping({%s : 1})}),)) - d.update((("a", {"abcF" : Mapping({1 : 1})}),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update((("a", {"abcF" : Mapping({b"\0" : 1})}),)):(, TypeError('expected bytes with no null',)) - d.update((("a", {"abcF" : Mapping({"\0" : 1})}),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using d.update((("a", {"abcF" : %s}),)) - d.update((("a", {"abcF" : FailingIter()}),)):(, TypeError('unable to convert FailingIter to a Vim structure',)) - d.update((("a", {"abcF" : FailingIterNext()}),)):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d.update((("a", {"abcF" : %s}),)) - d.update((("a", {"abcF" : None}),)):(, error("failed to add key 'a' to dictionary",)) - d.update((("a", {"abcF" : {b"": 1}}),)):(, ValueError('empty keys are not allowed',)) - d.update((("a", {"abcF" : {"": 1}}),)):(, ValueError('empty keys are not allowed',)) - d.update((("a", {"abcF" : FailingMapping()}),)):(, NotImplementedError('keys',)) - d.update((("a", {"abcF" : FailingMappingKey()}),)):(, NotImplementedError('getitem:mappingkey',)) - d.update((("a", {"abcF" : FailingNumber()}),)):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using d.update((("a", Mapping({%s : 1})),)) - d.update((("a", Mapping({1 : 1})),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update((("a", Mapping({b"\0" : 1})),)):(, TypeError('expected bytes with no null',)) - d.update((("a", Mapping({"\0" : 1})),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : {%s : 1}})),)) - d.update((("a", Mapping({"abcG" : {1 : 1}})),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update((("a", Mapping({"abcG" : {b"\0" : 1}})),)):(, TypeError('expected bytes with no null',)) - d.update((("a", Mapping({"abcG" : {"\0" : 1}})),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : Mapping({%s : 1})})),)) - d.update((("a", Mapping({"abcG" : Mapping({1 : 1})})),)):(, TypeError('expected bytes() or str() instance, but got int',)) - d.update((("a", Mapping({"abcG" : Mapping({b"\0" : 1})})),)):(, TypeError('expected bytes with no null',)) - d.update((("a", Mapping({"abcG" : Mapping({"\0" : 1})})),)):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using d.update((("a", Mapping({"abcG" : %s})),)) - d.update((("a", Mapping({"abcG" : FailingIter()})),)):(, TypeError('unable to convert FailingIter to a Vim structure',)) - d.update((("a", Mapping({"abcG" : FailingIterNext()})),)):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d.update((("a", Mapping({"abcG" : %s})),)) - d.update((("a", Mapping({"abcG" : None})),)):(, error("failed to add key 'a' to dictionary",)) - d.update((("a", Mapping({"abcG" : {b"": 1}})),)):(, ValueError('empty keys are not allowed',)) - d.update((("a", Mapping({"abcG" : {"": 1}})),)):(, ValueError('empty keys are not allowed',)) - d.update((("a", Mapping({"abcG" : FailingMapping()})),)):(, NotImplementedError('keys',)) - d.update((("a", Mapping({"abcG" : FailingMappingKey()})),)):(, NotImplementedError('getitem:mappingkey',)) - d.update((("a", Mapping({"abcG" : FailingNumber()})),)):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using d.update((("a", %s),)) - d.update((("a", FailingIter()),)):(, TypeError('unable to convert FailingIter to a Vim structure',)) - d.update((("a", FailingIterNext()),)):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using d.update((("a", %s),)) - d.update((("a", None),)):(, error("failed to add key 'a' to dictionary",)) - d.update((("a", {b"": 1}),)):(, ValueError('empty keys are not allowed',)) - d.update((("a", {"": 1}),)):(, ValueError('empty keys are not allowed',)) - d.update((("a", FailingMapping()),)):(, NotImplementedError('keys',)) - d.update((("a", FailingMappingKey()),)):(, NotImplementedError('getitem:mappingkey',)) - d.update((("a", FailingNumber()),)):(, NotImplementedError('int',)) - <<< Finished - >> DictionaryPopItem - d.popitem(1, 2):(, TypeError('popitem() takes no arguments (2 given)',)) - >> DictionaryHasKey - d.has_key():(, TypeError('has_key() takes exactly one argument (0 given)',)) - > List - >> ListConstructor - vim.List(1, 2):(, TypeError('function takes at most 1 argument (2 given)',)) - vim.List(a=1):(, TypeError('list constructor does not accept keyword arguments',)) - >>> Testing *Iter* using vim.List(%s) - vim.List(FailingIter()):(, NotImplementedError('iter',)) - vim.List(FailingIterNext()):(, NotImplementedError('next',)) - <<< Finished - >>> Testing StringToChars using vim.List([{%s : 1}]) - vim.List([{1 : 1}]):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.List([{b"\0" : 1}]):(, TypeError('expected bytes with no null',)) - vim.List([{"\0" : 1}]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using vim.List([{"abcF" : {%s : 1}}]) - vim.List([{"abcF" : {1 : 1}}]):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.List([{"abcF" : {b"\0" : 1}}]):(, TypeError('expected bytes with no null',)) - vim.List([{"abcF" : {"\0" : 1}}]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using vim.List([{"abcF" : Mapping({%s : 1})}]) - vim.List([{"abcF" : Mapping({1 : 1})}]):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.List([{"abcF" : Mapping({b"\0" : 1})}]):(, TypeError('expected bytes with no null',)) - vim.List([{"abcF" : Mapping({"\0" : 1})}]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using vim.List([{"abcF" : %s}]) - vim.List([{"abcF" : FailingIter()}]):(, TypeError('unable to convert FailingIter to a Vim structure',)) - vim.List([{"abcF" : FailingIterNext()}]):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using vim.List([{"abcF" : %s}]) - vim.List([{"abcF" : None}]):NOT FAILED - vim.List([{"abcF" : {b"": 1}}]):(, ValueError('empty keys are not allowed',)) - vim.List([{"abcF" : {"": 1}}]):(, ValueError('empty keys are not allowed',)) - vim.List([{"abcF" : FailingMapping()}]):(, NotImplementedError('keys',)) - vim.List([{"abcF" : FailingMappingKey()}]):(, NotImplementedError('getitem:mappingkey',)) - vim.List([{"abcF" : FailingNumber()}]):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using vim.List([Mapping({%s : 1})]) - vim.List([Mapping({1 : 1})]):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.List([Mapping({b"\0" : 1})]):(, TypeError('expected bytes with no null',)) - vim.List([Mapping({"\0" : 1})]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using vim.List([Mapping({"abcG" : {%s : 1}})]) - vim.List([Mapping({"abcG" : {1 : 1}})]):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.List([Mapping({"abcG" : {b"\0" : 1}})]):(, TypeError('expected bytes with no null',)) - vim.List([Mapping({"abcG" : {"\0" : 1}})]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using vim.List([Mapping({"abcG" : Mapping({%s : 1})})]) - vim.List([Mapping({"abcG" : Mapping({1 : 1})})]):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.List([Mapping({"abcG" : Mapping({b"\0" : 1})})]):(, TypeError('expected bytes with no null',)) - vim.List([Mapping({"abcG" : Mapping({"\0" : 1})})]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using vim.List([Mapping({"abcG" : %s})]) - vim.List([Mapping({"abcG" : FailingIter()})]):(, TypeError('unable to convert FailingIter to a Vim structure',)) - vim.List([Mapping({"abcG" : FailingIterNext()})]):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using vim.List([Mapping({"abcG" : %s})]) - vim.List([Mapping({"abcG" : None})]):NOT FAILED - vim.List([Mapping({"abcG" : {b"": 1}})]):(, ValueError('empty keys are not allowed',)) - vim.List([Mapping({"abcG" : {"": 1}})]):(, ValueError('empty keys are not allowed',)) - vim.List([Mapping({"abcG" : FailingMapping()})]):(, NotImplementedError('keys',)) - vim.List([Mapping({"abcG" : FailingMappingKey()})]):(, NotImplementedError('getitem:mappingkey',)) - vim.List([Mapping({"abcG" : FailingNumber()})]):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using vim.List([%s]) - vim.List([FailingIter()]):(, TypeError('unable to convert FailingIter to a Vim structure',)) - vim.List([FailingIterNext()]):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using vim.List([%s]) - vim.List([None]):NOT FAILED - vim.List([{b"": 1}]):(, ValueError('empty keys are not allowed',)) - vim.List([{"": 1}]):(, ValueError('empty keys are not allowed',)) - vim.List([FailingMapping()]):(, NotImplementedError('keys',)) - vim.List([FailingMappingKey()]):(, NotImplementedError('getitem:mappingkey',)) - vim.List([FailingNumber()]):(, NotImplementedError('int',)) - <<< Finished - >> ListItem - l[1000]:(, IndexError('list index out of range',)) - >> ListAssItem - ll[1] = 2:(, error('list is locked',)) - l[1000] = 3:(, IndexError('list index out of range',)) - >> ListAssSlice - ll[1:100] = "abcJ":(, error('list is locked',)) - >>> Testing *Iter* using l[:] = %s - l[:] = FailingIter():(, NotImplementedError('iter',)) - l[:] = FailingIterNext():(, NotImplementedError('next',)) - <<< Finished - nel[1:10:2] = "abcK":(, ValueError('attempt to assign sequence of size greater than 2 to extended slice',)) - (b'a', b'b', b'c', b'O') - nel[1:10:2] = "a":(, ValueError('attempt to assign sequence of size 1 to extended slice of size 2',)) - (b'a', b'b', b'c', b'O') - nel[1:1:-1] = "a":(, ValueError('attempt to assign sequence of size greater than 0 to extended slice',)) - (b'a', b'b', b'c', b'O') - nel[:] = FailingIterNextN(2):(, NotImplementedError('next N',)) - (b'a', b'b', b'c', b'O') - >>> Testing StringToChars using l[:] = [{%s : 1}] - l[:] = [{1 : 1}]:(, TypeError('expected bytes() or str() instance, but got int',)) - l[:] = [{b"\0" : 1}]:(, TypeError('expected bytes with no null',)) - l[:] = [{"\0" : 1}]:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l[:] = [{"abcF" : {%s : 1}}] - l[:] = [{"abcF" : {1 : 1}}]:(, TypeError('expected bytes() or str() instance, but got int',)) - l[:] = [{"abcF" : {b"\0" : 1}}]:(, TypeError('expected bytes with no null',)) - l[:] = [{"abcF" : {"\0" : 1}}]:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l[:] = [{"abcF" : Mapping({%s : 1})}] - l[:] = [{"abcF" : Mapping({1 : 1})}]:(, TypeError('expected bytes() or str() instance, but got int',)) - l[:] = [{"abcF" : Mapping({b"\0" : 1})}]:(, TypeError('expected bytes with no null',)) - l[:] = [{"abcF" : Mapping({"\0" : 1})}]:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using l[:] = [{"abcF" : %s}] - l[:] = [{"abcF" : FailingIter()}]:(, TypeError('unable to convert FailingIter to a Vim structure',)) - l[:] = [{"abcF" : FailingIterNext()}]:(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using l[:] = [{"abcF" : %s}] - l[:] = [{"abcF" : None}]:NOT FAILED - l[:] = [{"abcF" : {b"": 1}}]:(, ValueError('empty keys are not allowed',)) - l[:] = [{"abcF" : {"": 1}}]:(, ValueError('empty keys are not allowed',)) - l[:] = [{"abcF" : FailingMapping()}]:(, NotImplementedError('keys',)) - l[:] = [{"abcF" : FailingMappingKey()}]:(, NotImplementedError('getitem:mappingkey',)) - l[:] = [{"abcF" : FailingNumber()}]:(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using l[:] = [Mapping({%s : 1})] - l[:] = [Mapping({1 : 1})]:(, TypeError('expected bytes() or str() instance, but got int',)) - l[:] = [Mapping({b"\0" : 1})]:(, TypeError('expected bytes with no null',)) - l[:] = [Mapping({"\0" : 1})]:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l[:] = [Mapping({"abcG" : {%s : 1}})] - l[:] = [Mapping({"abcG" : {1 : 1}})]:(, TypeError('expected bytes() or str() instance, but got int',)) - l[:] = [Mapping({"abcG" : {b"\0" : 1}})]:(, TypeError('expected bytes with no null',)) - l[:] = [Mapping({"abcG" : {"\0" : 1}})]:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l[:] = [Mapping({"abcG" : Mapping({%s : 1})})] - l[:] = [Mapping({"abcG" : Mapping({1 : 1})})]:(, TypeError('expected bytes() or str() instance, but got int',)) - l[:] = [Mapping({"abcG" : Mapping({b"\0" : 1})})]:(, TypeError('expected bytes with no null',)) - l[:] = [Mapping({"abcG" : Mapping({"\0" : 1})})]:(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using l[:] = [Mapping({"abcG" : %s})] - l[:] = [Mapping({"abcG" : FailingIter()})]:(, TypeError('unable to convert FailingIter to a Vim structure',)) - l[:] = [Mapping({"abcG" : FailingIterNext()})]:(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using l[:] = [Mapping({"abcG" : %s})] - l[:] = [Mapping({"abcG" : None})]:NOT FAILED - l[:] = [Mapping({"abcG" : {b"": 1}})]:(, ValueError('empty keys are not allowed',)) - l[:] = [Mapping({"abcG" : {"": 1}})]:(, ValueError('empty keys are not allowed',)) - l[:] = [Mapping({"abcG" : FailingMapping()})]:(, NotImplementedError('keys',)) - l[:] = [Mapping({"abcG" : FailingMappingKey()})]:(, NotImplementedError('getitem:mappingkey',)) - l[:] = [Mapping({"abcG" : FailingNumber()})]:(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using l[:] = [%s] - l[:] = [FailingIter()]:(, TypeError('unable to convert FailingIter to a Vim structure',)) - l[:] = [FailingIterNext()]:(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using l[:] = [%s] - l[:] = [None]:NOT FAILED - l[:] = [{b"": 1}]:(, ValueError('empty keys are not allowed',)) - l[:] = [{"": 1}]:(, ValueError('empty keys are not allowed',)) - l[:] = [FailingMapping()]:(, NotImplementedError('keys',)) - l[:] = [FailingMappingKey()]:(, NotImplementedError('getitem:mappingkey',)) - l[:] = [FailingNumber()]:(, NotImplementedError('int',)) - <<< Finished - >> ListConcatInPlace - >>> Testing *Iter* using l.extend(%s) - l.extend(FailingIter()):(, NotImplementedError('iter',)) - l.extend(FailingIterNext()):(, NotImplementedError('next',)) - <<< Finished - >>> Testing StringToChars using l.extend([{%s : 1}]) - l.extend([{1 : 1}]):(, TypeError('expected bytes() or str() instance, but got int',)) - l.extend([{b"\0" : 1}]):(, TypeError('expected bytes with no null',)) - l.extend([{"\0" : 1}]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l.extend([{"abcF" : {%s : 1}}]) - l.extend([{"abcF" : {1 : 1}}]):(, TypeError('expected bytes() or str() instance, but got int',)) - l.extend([{"abcF" : {b"\0" : 1}}]):(, TypeError('expected bytes with no null',)) - l.extend([{"abcF" : {"\0" : 1}}]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l.extend([{"abcF" : Mapping({%s : 1})}]) - l.extend([{"abcF" : Mapping({1 : 1})}]):(, TypeError('expected bytes() or str() instance, but got int',)) - l.extend([{"abcF" : Mapping({b"\0" : 1})}]):(, TypeError('expected bytes with no null',)) - l.extend([{"abcF" : Mapping({"\0" : 1})}]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using l.extend([{"abcF" : %s}]) - l.extend([{"abcF" : FailingIter()}]):(, TypeError('unable to convert FailingIter to a Vim structure',)) - l.extend([{"abcF" : FailingIterNext()}]):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using l.extend([{"abcF" : %s}]) - l.extend([{"abcF" : None}]):NOT FAILED - l.extend([{"abcF" : {b"": 1}}]):(, ValueError('empty keys are not allowed',)) - l.extend([{"abcF" : {"": 1}}]):(, ValueError('empty keys are not allowed',)) - l.extend([{"abcF" : FailingMapping()}]):(, NotImplementedError('keys',)) - l.extend([{"abcF" : FailingMappingKey()}]):(, NotImplementedError('getitem:mappingkey',)) - l.extend([{"abcF" : FailingNumber()}]):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using l.extend([Mapping({%s : 1})]) - l.extend([Mapping({1 : 1})]):(, TypeError('expected bytes() or str() instance, but got int',)) - l.extend([Mapping({b"\0" : 1})]):(, TypeError('expected bytes with no null',)) - l.extend([Mapping({"\0" : 1})]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l.extend([Mapping({"abcG" : {%s : 1}})]) - l.extend([Mapping({"abcG" : {1 : 1}})]):(, TypeError('expected bytes() or str() instance, but got int',)) - l.extend([Mapping({"abcG" : {b"\0" : 1}})]):(, TypeError('expected bytes with no null',)) - l.extend([Mapping({"abcG" : {"\0" : 1}})]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using l.extend([Mapping({"abcG" : Mapping({%s : 1})})]) - l.extend([Mapping({"abcG" : Mapping({1 : 1})})]):(, TypeError('expected bytes() or str() instance, but got int',)) - l.extend([Mapping({"abcG" : Mapping({b"\0" : 1})})]):(, TypeError('expected bytes with no null',)) - l.extend([Mapping({"abcG" : Mapping({"\0" : 1})})]):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using l.extend([Mapping({"abcG" : %s})]) - l.extend([Mapping({"abcG" : FailingIter()})]):(, TypeError('unable to convert FailingIter to a Vim structure',)) - l.extend([Mapping({"abcG" : FailingIterNext()})]):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using l.extend([Mapping({"abcG" : %s})]) - l.extend([Mapping({"abcG" : None})]):NOT FAILED - l.extend([Mapping({"abcG" : {b"": 1}})]):(, ValueError('empty keys are not allowed',)) - l.extend([Mapping({"abcG" : {"": 1}})]):(, ValueError('empty keys are not allowed',)) - l.extend([Mapping({"abcG" : FailingMapping()})]):(, NotImplementedError('keys',)) - l.extend([Mapping({"abcG" : FailingMappingKey()})]):(, NotImplementedError('getitem:mappingkey',)) - l.extend([Mapping({"abcG" : FailingNumber()})]):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using l.extend([%s]) - l.extend([FailingIter()]):(, TypeError('unable to convert FailingIter to a Vim structure',)) - l.extend([FailingIterNext()]):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using l.extend([%s]) - l.extend([None]):NOT FAILED - l.extend([{b"": 1}]):(, ValueError('empty keys are not allowed',)) - l.extend([{"": 1}]):(, ValueError('empty keys are not allowed',)) - l.extend([FailingMapping()]):(, NotImplementedError('keys',)) - l.extend([FailingMappingKey()]):(, NotImplementedError('getitem:mappingkey',)) - l.extend([FailingNumber()]):(, NotImplementedError('int',)) - <<< Finished - >> ListSetattr - del l.locked:(, AttributeError('cannot delete vim.List attributes',)) - l.locked = FailingTrue():(, NotImplementedError('bool',)) - l.xxx = True:(, AttributeError('cannot set attribute xxx',)) - > Function - >> FunctionConstructor - >>> FunctionConstructor - vim.Function("123"):(, ValueError('unnamed function 123 does not exist',)) - vim.Function("xxx_non_existent_function_xxx"):(, ValueError('function xxx_non_existent_function_xxx does not exist',)) - vim.Function("xxx#non#existent#function#xxx"):NOT FAILED - vim.Function("xxx_non_existent_function_xxx2", args=[]):(, ValueError('function xxx_non_existent_function_xxx2 does not exist',)) - vim.Function("xxx_non_existent_function_xxx3", self={}):(, ValueError('function xxx_non_existent_function_xxx3 does not exist',)) - vim.Function("xxx_non_existent_function_xxx4", args=[], self={}):(, ValueError('function xxx_non_existent_function_xxx4 does not exist',)) - >>> FunctionNew - vim.Function("tr", self="abcFuncSelf"):(, AttributeError('keys',)) - vim.Function("tr", args=427423):(, TypeError('unable to convert int to a Vim list',)) - vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2"):(, AttributeError('keys',)) - vim.Function(self="abcFuncSelf2", args="abcFuncArgs2"):(, AttributeError('keys',)) - vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2"):(, AttributeError('keys',)) - vim.Function("tr", ""):(, TypeError('function takes exactly 1 argument (2 given)',)) - >> FunctionCall - >>> Testing StringToChars using f({%s : 1}) - f({1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) - f({b"\0" : 1}):(, TypeError('expected bytes with no null',)) - f({"\0" : 1}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using f({"abcF" : {%s : 1}}) - f({"abcF" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) - f({"abcF" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) - f({"abcF" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using f({"abcF" : Mapping({%s : 1})}) - f({"abcF" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) - f({"abcF" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) - f({"abcF" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using f({"abcF" : %s}) - f({"abcF" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) - f({"abcF" : FailingIterNext()}):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using f({"abcF" : %s}) - f({"abcF" : None}):NOT FAILED - f({"abcF" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) - f({"abcF" : {"": 1}}):(, ValueError('empty keys are not allowed',)) - f({"abcF" : FailingMapping()}):(, NotImplementedError('keys',)) - f({"abcF" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) - f({"abcF" : FailingNumber()}):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using f(Mapping({%s : 1})) - f(Mapping({1 : 1})):(, TypeError('expected bytes() or str() instance, but got int',)) - f(Mapping({b"\0" : 1})):(, TypeError('expected bytes with no null',)) - f(Mapping({"\0" : 1})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using f(Mapping({"abcG" : {%s : 1}})) - f(Mapping({"abcG" : {1 : 1}})):(, TypeError('expected bytes() or str() instance, but got int',)) - f(Mapping({"abcG" : {b"\0" : 1}})):(, TypeError('expected bytes with no null',)) - f(Mapping({"abcG" : {"\0" : 1}})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using f(Mapping({"abcG" : Mapping({%s : 1})})) - f(Mapping({"abcG" : Mapping({1 : 1})})):(, TypeError('expected bytes() or str() instance, but got int',)) - f(Mapping({"abcG" : Mapping({b"\0" : 1})})):(, TypeError('expected bytes with no null',)) - f(Mapping({"abcG" : Mapping({"\0" : 1})})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using f(Mapping({"abcG" : %s})) - f(Mapping({"abcG" : FailingIter()})):(, TypeError('unable to convert FailingIter to a Vim structure',)) - f(Mapping({"abcG" : FailingIterNext()})):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using f(Mapping({"abcG" : %s})) - f(Mapping({"abcG" : None})):NOT FAILED - f(Mapping({"abcG" : {b"": 1}})):(, ValueError('empty keys are not allowed',)) - f(Mapping({"abcG" : {"": 1}})):(, ValueError('empty keys are not allowed',)) - f(Mapping({"abcG" : FailingMapping()})):(, NotImplementedError('keys',)) - f(Mapping({"abcG" : FailingMappingKey()})):(, NotImplementedError('getitem:mappingkey',)) - f(Mapping({"abcG" : FailingNumber()})):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using f(%s) - f(FailingIter()):(, TypeError('unable to convert FailingIter to a Vim structure',)) - f(FailingIterNext()):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using f(%s) - f(None):NOT FAILED - f({b"": 1}):(, ValueError('empty keys are not allowed',)) - f({"": 1}):(, ValueError('empty keys are not allowed',)) - f(FailingMapping()):(, NotImplementedError('keys',)) - f(FailingMappingKey()):(, NotImplementedError('getitem:mappingkey',)) - f(FailingNumber()):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using fd(self={%s : 1}) - fd(self={1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) - fd(self={b"\0" : 1}):(, TypeError('expected bytes with no null',)) - fd(self={"\0" : 1}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using fd(self={"abcF" : {%s : 1}}) - fd(self={"abcF" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) - fd(self={"abcF" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) - fd(self={"abcF" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using fd(self={"abcF" : Mapping({%s : 1})}) - fd(self={"abcF" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) - fd(self={"abcF" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) - fd(self={"abcF" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using fd(self={"abcF" : %s}) - fd(self={"abcF" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) - fd(self={"abcF" : FailingIterNext()}):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using fd(self={"abcF" : %s}) - fd(self={"abcF" : None}):NOT FAILED - fd(self={"abcF" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) - fd(self={"abcF" : {"": 1}}):(, ValueError('empty keys are not allowed',)) - fd(self={"abcF" : FailingMapping()}):(, NotImplementedError('keys',)) - fd(self={"abcF" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) - fd(self={"abcF" : FailingNumber()}):(, NotImplementedError('int',)) - <<< Finished - >>> Testing StringToChars using fd(self=Mapping({%s : 1})) - fd(self=Mapping({1 : 1})):(, TypeError('expected bytes() or str() instance, but got int',)) - fd(self=Mapping({b"\0" : 1})):(, TypeError('expected bytes with no null',)) - fd(self=Mapping({"\0" : 1})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using fd(self=Mapping({"abcG" : {%s : 1}})) - fd(self=Mapping({"abcG" : {1 : 1}})):(, TypeError('expected bytes() or str() instance, but got int',)) - fd(self=Mapping({"abcG" : {b"\0" : 1}})):(, TypeError('expected bytes with no null',)) - fd(self=Mapping({"abcG" : {"\0" : 1}})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing StringToChars using fd(self=Mapping({"abcG" : Mapping({%s : 1})})) - fd(self=Mapping({"abcG" : Mapping({1 : 1})})):(, TypeError('expected bytes() or str() instance, but got int',)) - fd(self=Mapping({"abcG" : Mapping({b"\0" : 1})})):(, TypeError('expected bytes with no null',)) - fd(self=Mapping({"abcG" : Mapping({"\0" : 1})})):(, TypeError('expected bytes with no null',)) - <<< Finished - >>> Testing *Iter* using fd(self=Mapping({"abcG" : %s})) - fd(self=Mapping({"abcG" : FailingIter()})):(, TypeError('unable to convert FailingIter to a Vim structure',)) - fd(self=Mapping({"abcG" : FailingIterNext()})):(, NotImplementedError('next',)) - <<< Finished - >>> Testing ConvertFromPyObject using fd(self=Mapping({"abcG" : %s})) - fd(self=Mapping({"abcG" : None})):NOT FAILED - fd(self=Mapping({"abcG" : {b"": 1}})):(, ValueError('empty keys are not allowed',)) - fd(self=Mapping({"abcG" : {"": 1}})):(, ValueError('empty keys are not allowed',)) - fd(self=Mapping({"abcG" : FailingMapping()})):(, NotImplementedError('keys',)) - fd(self=Mapping({"abcG" : FailingMappingKey()})):(, NotImplementedError('getitem:mappingkey',)) - fd(self=Mapping({"abcG" : FailingNumber()})):(, NotImplementedError('int',)) - <<< Finished - >>> Testing *Iter* using fd(self=%s) - fd(self=FailingIter()):(, TypeError('unable to convert FailingIter to a Vim dictionary',)) - fd(self=FailingIterNext()):(, TypeError('unable to convert FailingIterNext to a Vim dictionary',)) - <<< Finished - >>> Testing ConvertFromPyObject using fd(self=%s) - fd(self=None):(, TypeError('unable to convert NoneType to a Vim dictionary',)) - fd(self={b"": 1}):(, ValueError('empty keys are not allowed',)) - fd(self={"": 1}):(, ValueError('empty keys are not allowed',)) - fd(self=FailingMapping()):(, NotImplementedError('keys',)) - fd(self=FailingMappingKey()):(, NotImplementedError('getitem:mappingkey',)) - fd(self=FailingNumber()):(, TypeError('unable to convert FailingNumber to a Vim dictionary',)) - <<< Finished - >>> Testing ConvertFromPyMapping using fd(self=%s) - fd(self=[]):(, AttributeError('keys',)) - <<< Finished - > TabPage - >> TabPageAttr - vim.current.tabpage.xxx:(, AttributeError("'vim.tabpage' object has no attribute 'xxx'",)) - > TabList - >> TabListItem - vim.tabpages[1000]:(, IndexError('no such tab page',)) - > Window - >> WindowAttr - vim.current.window.xxx:(, AttributeError("'vim.window' object has no attribute 'xxx'",)) - >> WindowSetattr - vim.current.window.buffer = 0:(, TypeError('readonly attribute: buffer',)) - vim.current.window.cursor = (100000000, 100000000):(, error('cursor position outside buffer',)) - vim.current.window.cursor = True:(, TypeError('argument must be 2-item sequence, not bool',)) - >>> Testing NumberToLong using vim.current.window.height = %s - vim.current.window.height = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) - vim.current.window.height = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) - vim.current.window.height = -1:(, ValueError('number must be greater or equal to zero',)) - <<< Finished - >>> Testing NumberToLong using vim.current.window.width = %s - vim.current.window.width = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) - vim.current.window.width = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) - vim.current.window.width = -1:(, ValueError('number must be greater or equal to zero',)) - <<< Finished - vim.current.window.xxxxxx = True:(, AttributeError('xxxxxx',)) - > WinList - >> WinListItem - vim.windows[1000]:(, IndexError('no such window',)) - > Buffer - >> StringToLine (indirect) - vim.current.buffer[0] = "\na":(, error('string cannot contain newlines',)) - vim.current.buffer[0] = b"\na":(, error('string cannot contain newlines',)) - >> SetBufferLine (indirect) - vim.current.buffer[0] = True:(, TypeError('bad argument type for built-in operation',)) - >> SetBufferLineList (indirect) - vim.current.buffer[:] = True:(, TypeError('bad argument type for built-in operation',)) - vim.current.buffer[:] = ["\na", "bc"]:(, error('string cannot contain newlines',)) - >> InsertBufferLines (indirect) - vim.current.buffer.append(None):(, TypeError('bad argument type for built-in operation',)) - vim.current.buffer.append(["\na", "bc"]):(, error('string cannot contain newlines',)) - vim.current.buffer.append("\nbc"):(, error('string cannot contain newlines',)) - >> RBItem - vim.current.buffer[100000000]:(, IndexError('line number out of range',)) - >> RBAsItem - vim.current.buffer[100000000] = "":(, IndexError('line number out of range',)) - >> BufferAttr - vim.current.buffer.xxx:(, AttributeError("'vim.buffer' object has no attribute 'xxx'",)) - >> BufferSetattr - vim.current.buffer.name = True:(, TypeError('expected bytes() or str() instance, but got bool',)) - vim.current.buffer.xxx = True:(, AttributeError('xxx',)) - >> BufferMark - vim.current.buffer.mark(0):(, TypeError('expected bytes() or str() instance, but got int',)) - vim.current.buffer.mark("abcM"):(, ValueError('mark name must be a single character',)) - vim.current.buffer.mark("!"):(, error('invalid mark name',)) - >> BufferRange - vim.current.buffer.range(1, 2, 3):(, TypeError('function takes exactly 2 arguments (3 given)',)) - > BufMap - >> BufMapItem - vim.buffers[100000000]:(, KeyError(100000000,)) - >>> Testing NumberToLong using vim.buffers[%s] - vim.buffers[[]]:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) - vim.buffers[None]:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) - vim.buffers[-1]:(, ValueError('number must be greater than zero',)) - vim.buffers[0]:(, ValueError('number must be greater than zero',)) - <<< Finished - > Current - >> CurrentGetattr - vim.current.xxx:(, AttributeError("'vim.currentdata' object has no attribute 'xxx'",)) - >> CurrentSetattr - vim.current.line = True:(, TypeError('bad argument type for built-in operation',)) - vim.current.buffer = True:(, TypeError('expected vim.Buffer object, but got bool',)) - vim.current.window = True:(, TypeError('expected vim.Window object, but got bool',)) - vim.current.tabpage = True:(, TypeError('expected vim.TabPage object, but got bool',)) - vim.current.xxx = True:(, AttributeError('xxx',)) - ['.'] - '.' - 3,xx - before - after - pythonx/topmodule/__init__.py - pythonx/topmodule/submodule/__init__.py - pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py - vim.command("throw 'abcN'"):(, error('abcN',)) - Exe("throw 'def'"):(, error('def',)) - vim.eval("Exe('throw ''ghi''')"):(, error('ghi',)) - vim.eval("Exe('echoerr ''jkl''')"):(, error('Vim(echoerr):jkl',)) - vim.eval("Exe('xxx_non_existent_command_xxx')"):(, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) - vim.eval("xxx_unknown_function_xxx()"):(, error('Vim:E117: Unknown function: xxx_unknown_function_xxx',)) - vim.bindeval("Exe('xxx_non_existent_command_xxx')"):(, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) - Caught KeyboardInterrupt - Running :put - No exception - --- 0 ---- *** ../vim-8.2.1122/src/testdir/test_python2.vim 2020-07-03 18:00:00.293531826 +0200 --- src/testdir/test_python2.vim 2020-07-03 21:13:42.672591840 +0200 *************** *** 560,570 **** " Test for calling a function func Test_python_function_call() func New(...) ! return ['NewStart'] + a:000 + ['NewEnd'] endfunc func DictNew(...) dict ! return ['DictNewStart'] + a:000 + ['DictNewEnd', self] endfunc new --- 560,570 ---- " Test for calling a function func Test_python_function_call() func New(...) ! return ['NewStart'] + a:000 + ['NewEnd'] endfunc func DictNew(...) dict ! return ['DictNewStart'] + a:000 + ['DictNewEnd', self] endfunc new *************** *** 1312,1319 **** " Test assigning to name property augroup BUFS ! autocmd BufFilePost * python cb.append(vim.eval('expand("")') + ':BufFilePost:' + vim.eval('bufnr("%")')) ! autocmd BufFilePre * python cb.append(vim.eval('expand("")') + ':BufFilePre:' + vim.eval('bufnr("%")')) augroup END py << trim EOF import os --- 1312,1319 ---- " Test assigning to name property augroup BUFS ! autocmd BufFilePost * python cb.append(vim.eval('expand("")') + ':BufFilePost:' + vim.eval('bufnr("%")')) ! autocmd BufFilePre * python cb.append(vim.eval('expand("")') + ':BufFilePre:' + vim.eval('bufnr("%")')) augroup END py << trim EOF import os *************** *** 1364,1370 **** call assert_equal([''], getline(1, '$')) augroup BUFS ! autocmd! augroup END augroup! BUFS %bw! --- 1364,1370 ---- call assert_equal([''], getline(1, '$')) augroup BUFS ! autocmd! augroup END augroup! BUFS %bw! *************** *** 1516,1522 **** cb.append('!!!!!! Windows differ') EOF ! let expected =<< trim END Number of tabs: 4 Current tab pages: (1): 1 windows, current is --- 1516,1522 ---- cb.append('!!!!!! Windows differ') EOF ! let expected =<< trim END Number of tabs: 4 Current tab pages: (1): 1 windows, current is *************** *** 1801,1813 **** cb.append('psaA: ' + repr(psaA)) cb.append('psaB: ' + repr(psaB)) cb.append('psaC: ' + repr(psaC)) ! psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] psar.self['rec'] = psar psar.self['self'] = psar.self psar.self['args'] = psar.args ! try: cb.append('psar: ' + repr(psar)) except Exception: --- 1801,1813 ---- cb.append('psaA: ' + repr(psaA)) cb.append('psaB: ' + repr(psaB)) cb.append('psaC: ' + repr(psaC)) ! psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] psar.self['rec'] = psar psar.self['self'] = psar.self psar.self['args'] = psar.args ! try: cb.append('psar: ' + repr(psar)) except Exception: *************** *** 1931,1937 **** return repr(v) else: return vim.Function('string')(v) ! cb.append('a.args: ' + s(a.args)) cb.append('pa1.args: ' + s(pa1.args)) cb.append('pa2.args: ' + s(pa2.args)) --- 1931,1937 ---- return repr(v) else: return vim.Function('string')(v) ! cb.append('a.args: ' + s(a.args)) cb.append('pa1.args: ' + s(pa1.args)) cb.append('pa2.args: ' + s(pa2.args)) *************** *** 1942,1948 **** cb.append('psa2.args: ' + s(psa2.args)) cb.append('psa3.args: ' + s(psa3.args)) cb.append('psa4.args: ' + s(psa4.args)) ! cb.append('a.self: ' + s(a.self)) cb.append('pa1.self: ' + s(pa1.self)) cb.append('pa2.self: ' + s(pa2.self)) --- 1942,1948 ---- cb.append('psa2.args: ' + s(psa2.args)) cb.append('psa3.args: ' + s(psa3.args)) cb.append('psa4.args: ' + s(psa4.args)) ! cb.append('a.self: ' + s(a.self)) cb.append('pa1.self: ' + s(pa1.self)) cb.append('pa2.self: ' + s(pa2.self)) *************** *** 1953,1959 **** cb.append('psa2.self: ' + s(psa2.self)) cb.append('psa3.self: ' + s(psa3.self)) cb.append('psa4.self: ' + s(psa4.self)) ! cb.append('a.name: ' + s(a.name)) cb.append('pa1.name: ' + s(pa1.name)) cb.append('pa2.name: ' + s(pa2.name)) --- 1953,1959 ---- cb.append('psa2.self: ' + s(psa2.self)) cb.append('psa3.self: ' + s(psa3.self)) cb.append('psa4.self: ' + s(psa4.self)) ! cb.append('a.name: ' + s(a.name)) cb.append('pa1.name: ' + s(pa1.name)) cb.append('pa2.name: ' + s(pa2.name)) *************** *** 1964,1970 **** cb.append('psa2.name: ' + s(psa2.name)) cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa4.name: ' + s(psa4.name)) ! cb.append('a.auto_rebind: ' + s(a.auto_rebind)) cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) --- 1964,1970 ---- cb.append('psa2.name: ' + s(psa2.name)) cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa4.name: ' + s(psa4.name)) ! cb.append('a.auto_rebind: ' + s(a.auto_rebind)) cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) *************** *** 1983,1991 **** cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) ! del s ! del a del pa1 del pa2 --- 1983,1991 ---- cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) ! del s ! del a del pa1 del pa2 *************** *** 2005,2011 **** del psaB del psaC del psar ! del ecall EOF --- 2005,2011 ---- del psaB del psaC del psar ! del ecall EOF *************** *** 2140,2158 **** super(DupDict, self).__setitem__('dup_' + key, value) dd = DupDict() dd['a'] = 'b' ! class DupList(vim.List): def __getitem__(self, idx): return [super(DupList, self).__getitem__(idx)] * 2 ! dl = DupList() dl2 = DupList(iter('abcC')) dl.extend(dl2[0]) ! class DupFun(vim.Function): def __call__(self, arg): return super(DupFun, self).__call__(arg, arg) ! df = DupFun('Put') EOF --- 2140,2158 ---- super(DupDict, self).__setitem__('dup_' + key, value) dd = DupDict() dd['a'] = 'b' ! class DupList(vim.List): def __getitem__(self, idx): return [super(DupList, self).__getitem__(idx)] * 2 ! dl = DupList() dl2 = DupList(iter('abcC')) dl.extend(dl2[0]) ! class DupFun(vim.Function): def __call__(self, arg): return super(DupFun, self).__call__(arg, arg) ! df = DupFun('Put') EOF *************** *** 2233,2265 **** fd = vim.Function('F') fdel = vim.Function('D') vim.command('delfunction D') ! def subexpr_test(expr, name, subexprs): cb.append('>>> Testing %s using %s' % (name, expr)) for subexpr in subexprs: ee(expr % subexpr) cb.append('<<< Finished') ! def stringtochars_test(expr): return subexpr_test(expr, 'StringToChars', ( '1', # Fail type checks 'u"\\0"', # Fail PyString_AsStringAndSize(bytes, , NULL) check '"\\0"', # Fail PyString_AsStringAndSize(object, , NULL) check )) ! class Mapping(object): def __init__(self, d): self.d = d ! def __getitem__(self, key): return self.d[key] ! def keys(self): return self.d.keys() ! def items(self): return self.d.items() ! def convertfrompyobject_test(expr, recurse=True): # pydict_to_tv stringtochars_test(expr % '{%s : 1}') --- 2233,2265 ---- fd = vim.Function('F') fdel = vim.Function('D') vim.command('delfunction D') ! def subexpr_test(expr, name, subexprs): cb.append('>>> Testing %s using %s' % (name, expr)) for subexpr in subexprs: ee(expr % subexpr) cb.append('<<< Finished') ! def stringtochars_test(expr): return subexpr_test(expr, 'StringToChars', ( '1', # Fail type checks 'u"\\0"', # Fail PyString_AsStringAndSize(bytes, , NULL) check '"\\0"', # Fail PyString_AsStringAndSize(object, , NULL) check )) ! class Mapping(object): def __init__(self, d): self.d = d ! def __getitem__(self, key): return self.d[key] ! def keys(self): return self.d.keys() ! def items(self): return self.d.items() ! def convertfrompyobject_test(expr, recurse=True): # pydict_to_tv stringtochars_test(expr % '{%s : 1}') *************** *** 2279,2297 **** 'FailingMappingKey()', # 'FailingNumber()', # )) ! def convertfrompymapping_test(expr): convertfrompyobject_test(expr) return subexpr_test(expr, 'ConvertFromPyMapping', ( '[]', )) ! def iter_test(expr): return subexpr_test(expr, '*Iter*', ( 'FailingIter()', 'FailingIterNext()', )) ! def number_test(expr, natural=False, unsigned=False): if natural: unsigned = True --- 2279,2297 ---- 'FailingMappingKey()', # 'FailingNumber()', # )) ! def convertfrompymapping_test(expr): convertfrompyobject_test(expr) return subexpr_test(expr, 'ConvertFromPyMapping', ( '[]', )) ! def iter_test(expr): return subexpr_test(expr, '*Iter*', ( 'FailingIter()', 'FailingIterNext()', )) ! def number_test(expr, natural=False, unsigned=False): if natural: unsigned = True *************** *** 2300,2368 **** 'None', ) + (unsigned and ('-1',) or ()) + (natural and ('0',) or ())) ! class FailingTrue(object): def __nonzero__(self): raise NotImplementedError('bool') ! class FailingIter(object): def __iter__(self): raise NotImplementedError('iter') ! class FailingIterNext(object): def __iter__(self): return self ! def next(self): raise NotImplementedError('next') ! class FailingIterNextN(object): def __init__(self, n): self.n = n ! def __iter__(self): return self ! def next(self): if self.n: self.n -= 1 return 1 else: raise NotImplementedError('next N') ! class FailingMappingKey(object): def __getitem__(self, item): raise NotImplementedError('getitem:mappingkey') ! def keys(self): return list("abcH") ! class FailingMapping(object): def __getitem__(self): raise NotImplementedError('getitem:mapping') ! def keys(self): raise NotImplementedError('keys') ! class FailingList(list): def __getitem__(self, idx): if i == 2: raise NotImplementedError('getitem:list') else: return super(FailingList, self).__getitem__(idx) ! class NoArgsCall(object): def __call__(self): pass ! class FailingCall(object): def __call__(self, path): raise NotImplementedError('call') ! class FailingNumber(object): def __int__(self): raise NotImplementedError('int') ! cb.append("> Output") cb.append(">> OutputSetattr") ee('del sys.stdout.softspace') --- 2300,2368 ---- 'None', ) + (unsigned and ('-1',) or ()) + (natural and ('0',) or ())) ! class FailingTrue(object): def __nonzero__(self): raise NotImplementedError('bool') ! class FailingIter(object): def __iter__(self): raise NotImplementedError('iter') ! class FailingIterNext(object): def __iter__(self): return self ! def next(self): raise NotImplementedError('next') ! class FailingIterNextN(object): def __init__(self, n): self.n = n ! def __iter__(self): return self ! def next(self): if self.n: self.n -= 1 return 1 else: raise NotImplementedError('next N') ! class FailingMappingKey(object): def __getitem__(self, item): raise NotImplementedError('getitem:mappingkey') ! def keys(self): return list("abcH") ! class FailingMapping(object): def __getitem__(self): raise NotImplementedError('getitem:mapping') ! def keys(self): raise NotImplementedError('keys') ! class FailingList(list): def __getitem__(self, idx): if i == 2: raise NotImplementedError('getitem:list') else: return super(FailingList, self).__getitem__(idx) ! class NoArgsCall(object): def __call__(self): pass ! class FailingCall(object): def __call__(self, path): raise NotImplementedError('call') ! class FailingNumber(object): def __int__(self): raise NotImplementedError('int') ! cb.append("> Output") cb.append(">> OutputSetattr") ee('del sys.stdout.softspace') *** ../vim-8.2.1122/src/testdir/test_python3.vim 2020-05-01 14:10:10.192390729 +0200 --- src/testdir/test_python3.vim 2020-07-03 21:13:42.676591827 +0200 *************** *** 1,9 **** " Test for python 3 commands. - " TODO: move tests from test87.in here. source check.vim CheckFeature python3 func Test_py3do() " Check deleting lines does not trigger an ml_get error. py3 import vim --- 1,76 ---- " Test for python 3 commands. source check.vim CheckFeature python3 + " This function should be called first. This sets up python functions used by + " the other tests. + func Test_AAA_python3_setup() + py3 << trim EOF + import vim + import sys + import re + + py33_type_error_pattern = re.compile('^__call__\(\) takes (\d+) positional argument but (\d+) were given$') + py37_exception_repr = re.compile(r'([^\(\),])(\)+)$') + + def emsg(ei): + return ei[0].__name__ + ':' + repr(ei[1].args) + + def ee(expr, g=globals(), l=locals()): + cb = vim.current.buffer + try: + try: + exec(expr, g, l) + except Exception as e: + 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."): + msg = repr((e.__class__, AttributeError(str(e)[str(e).rfind(" '") + 2:-1]))) + elif sys.version_info >= (3, 3) and e.__class__ is ImportError and str(e).find('No module named \'') >= 0: + msg = repr((e.__class__, ImportError(str(e).replace("'", '')))) + elif sys.version_info >= (3, 6) and e.__class__ is ModuleNotFoundError: + # Python 3.6 gives ModuleNotFoundError, change it to an ImportError + msg = repr((ImportError, ImportError(str(e).replace("'", '')))) + elif sys.version_info >= (3, 3) and e.__class__ is TypeError: + m = py33_type_error_pattern.search(str(e)) + if m: + msg = '__call__() takes exactly {0} positional argument ({1} given)'.format(m.group(1), m.group(2)) + msg = repr((e.__class__, TypeError(msg))) + else: + msg = repr((e.__class__, e)) + # Messages changed with Python 3.6, change new to old. + newmsg1 = """'argument must be str, bytes or bytearray, not None'""" + oldmsg1 = '''"Can't convert 'NoneType' object to str implicitly"''' + if msg.find(newmsg1) > -1: + msg = msg.replace(newmsg1, oldmsg1) + newmsg2 = """'argument must be str, bytes or bytearray, not int'""" + oldmsg2 = '''"Can't convert 'int' object to str implicitly"''' + if msg.find(newmsg2) > -1: + msg = msg.replace(newmsg2, oldmsg2) + elif sys.version_info >= (3, 5) and e.__class__ is ValueError and str(e) == 'embedded null byte': + msg = repr((TypeError, TypeError('expected bytes with no null'))) + else: + msg = repr((e.__class__, e)) + # Some Python versions say can't, others cannot. + if msg.find('can\'t') > -1: + msg = msg.replace('can\'t', 'cannot') + # Some Python versions use single quote, some double quote + if msg.find('"cannot ') > -1: + msg = msg.replace('"cannot ', '\'cannot ') + if msg.find(' attributes"') > -1: + msg = msg.replace(' attributes"', ' attributes\'') + if sys.version_info >= (3, 7): + msg = py37_exception_repr.sub(r'\1,\2', msg) + cb.append(expr + ':' + msg) + else: + cb.append(expr + ':NOT FAILED') + except Exception as e: + msg = repr((e.__class__, e)) + if sys.version_info >= (3, 7): + msg = py37_exception_repr.sub(r'\1,\2', msg) + cb.append(expr + '::' + msg) + EOF + endfunc + func Test_py3do() " Check deleting lines does not trigger an ml_get error. py3 import vim *************** *** 59,64 **** --- 126,140 ---- call assert_false(v:exception) endtry + let caught_vim_err = v:false + try + let x = py3eval('f.abc') + catch + call assert_match("AttributeError: 'vim.function' object has no attribute 'abc'", v:exception) + let caught_vim_err = v:true + endtry + call assert_equal(v:true, caught_vim_err) + py3 del f delfunc s:foo endfunc *************** *** 149,155 **** call assert_equal( line( '.' ), 1 ) bwipe! ! endfunction func Test_Write_To_Current_Buffer_Fixes_Cursor_Str() call _SetUpVisibleBuffer() --- 225,231 ---- call assert_equal( line( '.' ), 1 ) bwipe! ! endfunc func Test_Write_To_Current_Buffer_Fixes_Cursor_Str() call _SetUpVisibleBuffer() *************** *** 158,164 **** call assert_equal( line( '.' ), 10 ) bwipe! ! endfunction func Test_Catch_Exception_Message() try --- 234,240 ---- call assert_equal( line( '.' ), 10 ) bwipe! ! endfunc func Test_Catch_Exception_Message() try *************** *** 355,358 **** --- 431,3663 ---- call assert_equal('ABCDE', pyxeval('s')) endfunc + " Test for the python List object + func Test_python3_list() + let l = [] + py3 l = vim.bindeval('l') + py3 f = vim.bindeval('function("strlen")') + " Extending List directly with different types + py3 l += [1, "as'd", [1, 2, f, {'a': 1}]] + call assert_equal([1, "as'd", [1, 2, function("strlen"), {'a': 1}]], l) + call assert_equal([1, 2, function("strlen"), {'a': 1}], l[-1]) + call assert_fails('echo l[-4]', 'E684:') + + " List assignment + py3 l[0] = 0 + call assert_equal([0, "as'd", [1, 2, function("strlen"), {'a': 1}]], l) + py3 l[-2] = f + call assert_equal([0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]], l) + endfunc + + " Extending Dictionary directly with different types + func Test_python3_dict_extend() + let d = {} + func d.f() + return 1 + endfunc + + py3 f = vim.bindeval('function("strlen")') + py3 << trim EOF + d = vim.bindeval('d') + d['1'] = 'asd' + d.update() # Must not do anything, including throwing errors + d.update(b = [1, 2, f]) + d.update((('-1', {'a': 1}),)) + d.update({'0': -1}) + dk = d.keys() + dv = d.values() + di = d.items() + dk.sort(key=repr) + dv.sort(key=repr) + di.sort(key=repr) + EOF + + call assert_equal(1, py3eval("d['f'](self={})")) + call assert_equal("[b'-1', b'0', b'1', b'b', b'f']", py3eval('repr(dk)')) + call assert_equal("[-1, , , , b'asd']", substitute(py3eval('repr(dv)'),'0x\x\+','','g')) + call assert_equal("[(b'-1', ), (b'0', -1), (b'1', b'asd'), (b'b', ), (b'f', )]", substitute(py3eval('repr(di)'),'0x\x\+','','g')) + call assert_equal(['0', '1', 'b', 'f', '-1'], keys(d)) + call assert_equal("[-1, 'asd', [1, 2, function('strlen')], function('1'), {'a': 1}]", string(values(d))) + py3 del dk + py3 del di + py3 del dv + endfunc + + func Test_python3_list_del_items() + " removing items with del + let l = [0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]] + py3 l = vim.bindeval('l') + py3 del l[2] + call assert_equal("[0, function('strlen')]", string(l)) + + let l = range(8) + py3 l = vim.bindeval('l') + py3 del l[:3] + py3 del l[1:] + call assert_equal([3], l) + + " removing items out of range: silently skip items that don't exist + + " The following two ranges delete nothing as they match empty list: + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[2:1] + call assert_equal([0, 1, 2, 3], l) + py3 del l[2:2] + call assert_equal([0, 1, 2, 3], l) + py3 del l[2:3] + call assert_equal([0, 1, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[2:4] + call assert_equal([0, 1], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[2:5] + call assert_equal([0, 1], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[2:6] + call assert_equal([0, 1], l) + + " The following two ranges delete nothing as they match empty list: + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[-1:2] + call assert_equal([0, 1, 2, 3], l) + py3 del l[-2:2] + call assert_equal([0, 1, 2, 3], l) + py3 del l[-3:2] + call assert_equal([0, 2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[-4:2] + call assert_equal([2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[-5:2] + call assert_equal([2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[-6:2] + call assert_equal([2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[::2] + call assert_equal([1, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[3:0:-2] + call assert_equal([0, 2], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 del l[2:4:-2] + let l = [0, 1, 2, 3] + endfunc + + func Test_python3_dict_del_items() + let d = eval("{'0' : -1, '1' : 'asd', 'b' : [1, 2, function('strlen')], 'f' : function('min'), '-1' : {'a': 1}}") + py3 d = vim.bindeval('d') + py3 del d['-1'] + py3 del d['f'] + call assert_equal([1, 2, function('strlen')], py3eval('d.get(''b'', 1)')) + call assert_equal([1, 2, function('strlen')], py3eval('d.pop(''b'')')) + call assert_equal(1, py3eval('d.get(''b'', 1)')) + call assert_equal('asd', py3eval('d.pop(''1'', 2)')) + call assert_equal(2, py3eval('d.pop(''1'', 2)')) + call assert_equal('True', py3eval('repr(d.has_key(''0''))')) + call assert_equal('False', py3eval('repr(d.has_key(''1''))')) + call assert_equal('True', py3eval('repr(''0'' in d)')) + call assert_equal('False', py3eval('repr(''1'' in d)')) + call assert_equal("[b'0']", py3eval('repr(list(iter(d)))')) + call assert_equal({'0' : -1}, d) + call assert_equal("(b'0', -1)", py3eval('repr(d.popitem())')) + call assert_equal('None', py3eval('repr(d.get(''0''))')) + call assert_equal('[]', py3eval('repr(list(iter(d)))')) + endfunc + + " Slice assignment to a list + func Test_python3_slice_assignment() + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[0:0] = ['a'] + call assert_equal(['a', 0, 1, 2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[1:2] = ['b'] + call assert_equal([0, 'b', 2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[2:4] = ['c'] + call assert_equal([0, 1, 'c'], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[4:4] = ['d'] + call assert_equal([0, 1, 2, 3, 'd'], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[-1:2] = ['e'] + call assert_equal([0, 1, 2, 'e', 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[-10:2] = ['f'] + call assert_equal(['f', 2, 3], l) + + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + py3 l[2:-10] = ['g'] + call assert_equal([0, 1, 'g', 2, 3], l) + + let l = [] + py3 l = vim.bindeval('l') + py3 l[0:0] = ['h'] + call assert_equal(['h'], l) + + let l = range(8) + py3 l = vim.bindeval('l') + py3 l[2:6:2] = [10, 20] + call assert_equal([0, 1, 10, 3, 20, 5, 6, 7], l) + + let l = range(8) + py3 l = vim.bindeval('l') + py3 l[6:2:-2] = [10, 20] + call assert_equal([0, 1, 2, 3, 20, 5, 10, 7], l) + + let l = range(8) + py3 l = vim.bindeval('l') + py3 l[6:2] = () + call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l) + + let l = range(8) + py3 l = vim.bindeval('l') + py3 l[6:2:1] = () + call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l) + + let l = range(8) + py3 l = vim.bindeval('l') + py3 l[2:2:1] = () + call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l) + endfunc + + " Locked variables + func Test_python3_lockedvar() + new + py3 cb = vim.current.buffer + let l = [0, 1, 2, 3] + py3 l = vim.bindeval('l') + lockvar! l + py3 << trim EOF + try: + l[2]='i' + except vim.error: + cb.append('l[2] threw vim.error: ' + emsg(sys.exc_info())) + EOF + call assert_equal(['', "l[2] threw vim.error: error:('list is locked',)"], + \ getline(1, '$')) + call assert_equal([0, 1, 2, 3], l) + unlockvar! l + close! + endfunc + + " Test for calling a function + func Test_python3_function_call() + func New(...) + return ['NewStart'] + a:000 + ['NewEnd'] + endfunc + + func DictNew(...) dict + return ['DictNewStart'] + a:000 + ['DictNewEnd', self] + endfunc + + new + let l = [function('New'), function('DictNew')] + py3 l = vim.bindeval('l') + py3 l.extend(list(l[0](1, 2, 3))) + call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd'], l) + py3 l.extend(list(l[1](1, 2, 3, self={'a': 'b'}))) + call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}], l) + py3 l += [[l[0].name]] + call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}, ['New']], l) + py3 ee('l[1](1, 2, 3)') + call assert_equal("l[1](1, 2, 3):(, error('Vim:E725: Calling dict function without Dictionary: DictNew',))", getline(2)) + %d + py3 f = l[0] + delfunction New + py3 ee('f(1, 2, 3)') + call assert_equal("f(1, 2, 3):(, error('Vim:E117: Unknown function: New',))", getline(2)) + close! + delfunction DictNew + endfunc + + func Test_python3_float() + CheckFeature float + let l = [0.0] + py3 l = vim.bindeval('l') + py3 l.extend([0.0]) + call assert_equal([0.0, 0.0], l) + endfunc + + " Test for Dict key errors + func Test_python3_dict_key_error() + let messages = [] + py3 << trim EOF + import sys + d = vim.bindeval('{}') + m = vim.bindeval('messages') + def em(expr, g=globals(), l=locals()): + try: + exec(expr, g, l) + except Exception as e: + if sys.version_info >= (3, 5) and e.__class__ is ValueError and str(e) == 'embedded null byte': + m.extend([TypeError.__name__]) + else: + m.extend([e.__class__.__name__]) + + em('d["abc1"]') + em('d["abc1"]="\\0"') + em('d["abc1"]=vim') + em('d[""]=1') + em('d["a\\0b"]=1') + em('d[b"a\\0b"]=1') + em('d.pop("abc1")') + em('d.popitem()') + del em + del m + EOF + + call assert_equal(['KeyError', 'TypeError', 'TypeError', 'ValueError', + \ 'TypeError', 'TypeError', 'KeyError', 'KeyError'], messages) + unlet messages + endfunc + + " Test for locked and scope attributes + func Test_python3_lock_scope_attr() + let d = {} | let dl = {} | lockvar dl + let res = [] + for s in split("d dl v: g:") + let name = tr(s, ':', 's') + execute 'py3 ' .. name .. ' = vim.bindeval("' .. s .. '")' + call add(res, s .. ' : ' .. join(map(['locked', 'scope'], + \ 'v:val .. ":" .. py3eval(name .. "." .. v:val)'), ';')) + endfor + call assert_equal(['d : locked:0;scope:0', 'dl : locked:1;scope:0', + \ 'v: : locked:2;scope:1', 'g: : locked:0;scope:2'], res) + + silent! let d.abc2 = 1 + silent! let dl.abc3 = 1 + py3 d.locked = True + py3 dl.locked = False + silent! let d.def = 1 + silent! let dl.def = 1 + call assert_equal({'abc2': 1}, d) + call assert_equal({'def': 1}, dl) + unlet d dl + + let l = [] | let ll = [] | lockvar ll + let res = [] + for s in split("l ll") + let name = tr(s, ':', 's') + execute 'py3 ' .. name .. '=vim.bindeval("' .. s .. '")' + call add(res, s .. ' : locked:' .. py3eval(name .. '.locked')) + endfor + call assert_equal(['l : locked:0', 'll : locked:1'], res) + + silent! call extend(l, [0]) + silent! call extend(ll, [0]) + py3 l.locked = True + py3 ll.locked = False + silent! call extend(l, [1]) + silent! call extend(ll, [1]) + call assert_equal([0], l) + call assert_equal([1], ll) + unlet l ll + endfunc + + " Test for py3eval() + func Test_python3_pyeval() + let l = py3eval('[0, 1, 2]') + call assert_equal([0, 1, 2], l) + + let d = py3eval('{"a": "b", "c": 1, "d": ["e"]}') + call assert_equal([['a', 'b'], ['c', 1], ['d', ['e']]], sort(items(d))) + + let v:errmsg = '' + call assert_equal(v:none, py3eval('None')) + call assert_equal('', v:errmsg) + + if has('float') + call assert_equal(0.0, py3eval('0.0')) + endif + + " Invalid values: + let caught_859 = 0 + try + let v = py3eval('"\0"') + catch /E859:/ + let caught_859 = 1 + endtry + call assert_equal(1, caught_859) + + let caught_859 = 0 + try + let v = py3eval('{"\0" : 1}') + catch /E859:/ + let caught_859 = 1 + endtry + call assert_equal(1, caught_859) + + let caught_nameerr = 0 + try + let v = py3eval("undefined_name") + catch /NameError: name 'undefined_name'/ + let caught_nameerr = 1 + endtry + call assert_equal(1, caught_nameerr) + + let caught_859 = 0 + try + let v = py3eval("vim") + catch /E859:/ + let caught_859 = 1 + endtry + call assert_equal(1, caught_859) + endfunc + + " threading + " Running py3do command (Test_pydo) before this test, stops the python thread + " from running. So this test should be run before the pydo test + func Test_aaa_python_threading() + let l = [0] + py3 l = vim.bindeval('l') + py3 << trim EOF + import threading + import time + + class T(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + self.t = 0 + self.running = True + + def run(self): + while self.running: + self.t += 1 + time.sleep(0.1) + + t = T() + del T + t.start() + EOF + + sleep 1 + py3 t.running = False + py3 t.join() + + " Check if the background thread is working. Count should be 10, but on a + " busy system (AppVeyor) it can be much lower. + py3 l[0] = t.t > 4 + py3 del time + py3 del threading + py3 del t + call assert_equal([1], l) + endfunc + + " settrace + func Test_python3_settrace() + let l = [] + py3 l = vim.bindeval('l') + py3 << trim EOF + import sys + + def traceit(frame, event, arg): + global l + if event == "line": + l += [frame.f_lineno] + return traceit + + def trace_main(): + for i in range(5): + pass + EOF + py3 sys.settrace(traceit) + py3 trace_main() + py3 sys.settrace(None) + py3 del traceit + py3 del trace_main + call assert_equal([1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1], l) + endfunc + + " Slice + func Test_python3_list_slice() + py3 ll = vim.bindeval('[0, 1, 2, 3, 4, 5]') + py3 l = ll[:4] + call assert_equal([0, 1, 2, 3], py3eval('l')) + py3 l = ll[2:] + call assert_equal([2, 3, 4, 5], py3eval('l')) + py3 l = ll[:-4] + call assert_equal([0, 1], py3eval('l')) + py3 l = ll[-2:] + call assert_equal([4, 5], py3eval('l')) + py3 l = ll[2:4] + call assert_equal([2, 3], py3eval('l')) + py3 l = ll[4:2] + call assert_equal([], py3eval('l')) + py3 l = ll[-4:-2] + call assert_equal([2, 3], py3eval('l')) + py3 l = ll[-2:-4] + call assert_equal([], py3eval('l')) + py3 l = ll[:] + call assert_equal([0, 1, 2, 3, 4, 5], py3eval('l')) + py3 l = ll[0:6] + call assert_equal([0, 1, 2, 3, 4, 5], py3eval('l')) + py3 l = ll[-10:10] + call assert_equal([0, 1, 2, 3, 4, 5], py3eval('l')) + py3 l = ll[4:2:-1] + call assert_equal([4, 3], py3eval('l')) + py3 l = ll[::2] + call assert_equal([0, 2, 4], py3eval('l')) + py3 l = ll[4:2:1] + call assert_equal([], py3eval('l')) + py3 del l + endfunc + + " Vars + func Test_python3_vars() + let g:foo = 'bac' + let w:abc3 = 'def' + let b:baz = 'bar' + let t:bar = 'jkl' + try + throw "Abc" + catch /Abc/ + call assert_equal('Abc', py3eval('vim.vvars[''exception'']')) + endtry + call assert_equal('bac', py3eval('vim.vars[''foo'']')) + call assert_equal('def', py3eval('vim.current.window.vars[''abc3'']')) + call assert_equal('bar', py3eval('vim.current.buffer.vars[''baz'']')) + call assert_equal('jkl', py3eval('vim.current.tabpage.vars[''bar'']')) + endfunc + + " Options + " paste: boolean, global + " previewheight number, global + " operatorfunc: string, global + " number: boolean, window-local + " numberwidth: number, window-local + " colorcolumn: string, window-local + " statusline: string, window-local/global + " autoindent: boolean, buffer-local + " shiftwidth: number, buffer-local + " omnifunc: string, buffer-local + " preserveindent: boolean, buffer-local/global + " path: string, buffer-local/global + func Test_python3_opts() + let g:res = [] + let g:bufs = [bufnr('%')] + new + let g:bufs += [bufnr('%')] + vnew + let g:bufs += [bufnr('%')] + wincmd j + vnew + let g:bufs += [bufnr('%')] + wincmd l + + func RecVars(opt) + let gval = string(eval('&g:' .. a:opt)) + let wvals = join(map(range(1, 4), + \ 'v:val .. ":" .. string(getwinvar(v:val, "&" .. a:opt))')) + let bvals = join(map(copy(g:bufs), + \ 'v:val .. ":" .. string(getbufvar(v:val, "&" .. a:opt))')) + call add(g:res, ' G: ' .. gval) + call add(g:res, ' W: ' .. wvals) + call add(g:res, ' B: ' .. wvals) + endfunc + + py3 << trim EOF + def e(s, g=globals(), l=locals()): + try: + exec(s, g, l) + except Exception as e: + vim.command('return ' + repr(e.__class__.__name__)) + + def ev(s, g=globals(), l=locals()): + try: + return eval(s, g, l) + except Exception as e: + vim.command('let exc=' + repr(e.__class__.__name__)) + return 0 + EOF + + func E(s) + python3 e(vim.eval('a:s')) + endfunc + + func Ev(s) + let r = py3eval('ev(vim.eval("a:s"))') + if exists('exc') + throw exc + endif + return r + endfunc + + py3 gopts1 = vim.options + py3 wopts1 = vim.windows[2].options + py3 wopts2 = vim.windows[0].options + py3 wopts3 = vim.windows[1].options + py3 bopts1 = vim.buffers[vim.bindeval("g:bufs")[2]].options + py3 bopts2 = vim.buffers[vim.bindeval("g:bufs")[1]].options + py3 bopts3 = vim.buffers[vim.bindeval("g:bufs")[0]].options + call add(g:res, 'wopts iters equal: ' .. + \ py3eval('list(wopts1) == list(wopts2)')) + call add(g:res, 'bopts iters equal: ' .. + \ py3eval('list(bopts1) == list(bopts2)')) + py3 gset = set(iter(gopts1)) + py3 wset = set(iter(wopts1)) + py3 bset = set(iter(bopts1)) + + set path=.,..,, + let lst = [] + let lst += [['paste', 1, 0, 1, 2, 1, 1, 0]] + let lst += [['previewheight', 5, 1, 6, 'a', 0, 1, 0]] + let lst += [['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0]] + let lst += [['number', 0, 1, 1, 0, 1, 0, 1]] + let lst += [['numberwidth', 2, 3, 5, -100, 0, 0, 1]] + let lst += [['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1]] + let lst += [['statusline', '1', '2', '4', 0, 0, 1, 1]] + let lst += [['autoindent', 0, 1, 1, 2, 1, 0, 2]] + let lst += [['shiftwidth', 0, 2, 1, 3, 0, 0, 2]] + let lst += [['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2]] + let lst += [['preserveindent', 0, 1, 1, 2, 1, 1, 2]] + let lst += [['path', '.,,', ',,', '.', 0, 0, 1, 2]] + for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst + py3 oname = vim.eval('oname') + py3 oval1 = vim.bindeval('oval1') + py3 oval2 = vim.bindeval('oval2') + py3 oval3 = vim.bindeval('oval3') + if invval is 0 || invval is 1 + py3 invval = bool(vim.bindeval('invval')) + else + py3 invval = vim.bindeval('invval') + endif + if bool + py3 oval1 = bool(oval1) + py3 oval2 = bool(oval2) + py3 oval3 = bool(oval3) + endif + call add(g:res, '>>> ' .. oname) + call add(g:res, ' g/w/b:' .. py3eval('oname in gset') .. '/' .. + \ py3eval('oname in wset') .. '/' .. py3eval('oname in bset')) + call add(g:res, ' g/w/b (in):' .. py3eval('oname in gopts1') .. '/' .. + \ py3eval('oname in wopts1') .. '/' .. py3eval('oname in bopts1')) + for v in ['gopts1', 'wopts1', 'bopts1'] + try + call add(g:res, ' p/' .. v .. ': ' .. Ev('repr(' .. v .. '[''' .. oname .. '''])')) + catch + call add(g:res, ' p/' .. v .. '! ' .. v:exception) + endtry + let r = E(v .. '[''' .. oname .. ''']=invval') + if r isnot 0 + call add(g:res, ' inv: ' .. string(invval) .. '! ' .. r) + endif + for vv in (v is# 'gopts1' ? [v] : [v, v[:-2] .. '2', v[:-2] .. '3']) + let val = substitute(vv, '^.opts', 'oval', '') + let r = E(vv .. '[''' .. oname .. ''']=' .. val) + if r isnot 0 + call add(g:res, ' ' .. vv .. '! ' .. r) + endif + endfor + endfor + call RecVars(oname) + for v in ['wopts3', 'bopts3'] + let r = E('del ' .. v .. '["' .. oname .. '"]') + if r isnot 0 + call add(g:res, ' del ' .. v .. '! ' .. r) + endif + endfor + call RecVars(oname) + endfor + delfunction RecVars + delfunction E + delfunction Ev + py3 del ev + py3 del e + only + for buf in g:bufs[1:] + execute 'bwipeout!' buf + endfor + py3 del gopts1 + py3 del wopts1 + py3 del wopts2 + py3 del wopts3 + py3 del bopts1 + py3 del bopts2 + py3 del bopts3 + py3 del oval1 + py3 del oval2 + py3 del oval3 + py3 del oname + py3 del invval + + let expected =<< trim END + wopts iters equal: 1 + bopts iters equal: 1 + >>> paste + g/w/b:1/0/0 + g/w/b (in):1/0/0 + p/gopts1: False + p/wopts1! KeyError + inv: 2! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1! KeyError + inv: 2! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: 1 + W: 1:1 2:1 3:1 4:1 + B: 1:1 2:1 3:1 4:1 + del wopts3! KeyError + del bopts3! KeyError + G: 1 + W: 1:1 2:1 3:1 4:1 + B: 1:1 2:1 3:1 4:1 + >>> previewheight + g/w/b:1/0/0 + g/w/b (in):1/0/0 + p/gopts1: 12 + inv: 'a'! TypeError + p/wopts1! KeyError + inv: 'a'! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1! KeyError + inv: 'a'! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: 5 + W: 1:5 2:5 3:5 4:5 + B: 1:5 2:5 3:5 4:5 + del wopts3! KeyError + del bopts3! KeyError + G: 5 + W: 1:5 2:5 3:5 4:5 + B: 1:5 2:5 3:5 4:5 + >>> operatorfunc + g/w/b:1/0/0 + g/w/b (in):1/0/0 + p/gopts1: b'' + inv: 2! TypeError + p/wopts1! KeyError + inv: 2! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1! KeyError + inv: 2! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: 'A' + W: 1:'A' 2:'A' 3:'A' 4:'A' + B: 1:'A' 2:'A' 3:'A' 4:'A' + del wopts3! KeyError + del bopts3! KeyError + G: 'A' + W: 1:'A' 2:'A' 3:'A' 4:'A' + B: 1:'A' 2:'A' 3:'A' 4:'A' + >>> number + g/w/b:0/1/0 + g/w/b (in):0/1/0 + p/gopts1! KeyError + inv: 0! KeyError + gopts1! KeyError + p/wopts1: False + p/bopts1! KeyError + inv: 0! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: 0 + W: 1:1 2:1 3:0 4:0 + B: 1:1 2:1 3:0 4:0 + del wopts3! ValueError + del bopts3! KeyError + G: 0 + W: 1:1 2:1 3:0 4:0 + B: 1:1 2:1 3:0 4:0 + >>> numberwidth + g/w/b:0/1/0 + g/w/b (in):0/1/0 + p/gopts1! KeyError + inv: -100! KeyError + gopts1! KeyError + p/wopts1: 4 + inv: -100! error + p/bopts1! KeyError + inv: -100! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: 4 + W: 1:3 2:5 3:2 4:4 + B: 1:3 2:5 3:2 4:4 + del wopts3! ValueError + del bopts3! KeyError + G: 4 + W: 1:3 2:5 3:2 4:4 + B: 1:3 2:5 3:2 4:4 + >>> colorcolumn + g/w/b:0/1/0 + g/w/b (in):0/1/0 + p/gopts1! KeyError + inv: 'abc4'! KeyError + gopts1! KeyError + p/wopts1: b'' + inv: 'abc4'! error + p/bopts1! KeyError + inv: 'abc4'! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: '' + W: 1:'+2' 2:'+3' 3:'+1' 4:'' + B: 1:'+2' 2:'+3' 3:'+1' 4:'' + del wopts3! ValueError + del bopts3! KeyError + G: '' + W: 1:'+2' 2:'+3' 3:'+1' 4:'' + B: 1:'+2' 2:'+3' 3:'+1' 4:'' + >>> statusline + g/w/b:1/1/0 + g/w/b (in):1/1/0 + p/gopts1: b'' + inv: 0! TypeError + p/wopts1: None + inv: 0! TypeError + p/bopts1! KeyError + inv: 0! KeyError + bopts1! KeyError + bopts2! KeyError + bopts3! KeyError + G: '1' + W: 1:'2' 2:'4' 3:'1' 4:'1' + B: 1:'2' 2:'4' 3:'1' 4:'1' + del bopts3! KeyError + G: '1' + W: 1:'2' 2:'1' 3:'1' 4:'1' + B: 1:'2' 2:'1' 3:'1' 4:'1' + >>> autoindent + g/w/b:0/0/1 + g/w/b (in):0/0/1 + p/gopts1! KeyError + inv: 2! KeyError + gopts1! KeyError + p/wopts1! KeyError + inv: 2! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1: False + G: 0 + W: 1:0 2:1 3:0 4:1 + B: 1:0 2:1 3:0 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 0 + W: 1:0 2:1 3:0 4:1 + B: 1:0 2:1 3:0 4:1 + >>> shiftwidth + g/w/b:0/0/1 + g/w/b (in):0/0/1 + p/gopts1! KeyError + inv: 3! KeyError + gopts1! KeyError + p/wopts1! KeyError + inv: 3! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1: 8 + G: 8 + W: 1:0 2:2 3:8 4:1 + B: 1:0 2:2 3:8 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 8 + W: 1:0 2:2 3:8 4:1 + B: 1:0 2:2 3:8 4:1 + >>> omnifunc + g/w/b:0/0/1 + g/w/b (in):0/0/1 + p/gopts1! KeyError + inv: 1! KeyError + gopts1! KeyError + p/wopts1! KeyError + inv: 1! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1: b'' + inv: 1! TypeError + G: '' + W: 1:'A' 2:'B' 3:'' 4:'C' + B: 1:'A' 2:'B' 3:'' 4:'C' + del wopts3! KeyError + del bopts3! ValueError + G: '' + W: 1:'A' 2:'B' 3:'' 4:'C' + B: 1:'A' 2:'B' 3:'' 4:'C' + >>> preserveindent + g/w/b:0/0/1 + g/w/b (in):0/0/1 + p/gopts1! KeyError + inv: 2! KeyError + gopts1! KeyError + p/wopts1! KeyError + inv: 2! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1: False + G: 0 + W: 1:0 2:1 3:0 4:1 + B: 1:0 2:1 3:0 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 0 + W: 1:0 2:1 3:0 4:1 + B: 1:0 2:1 3:0 4:1 + >>> path + g/w/b:1/0/1 + g/w/b (in):1/0/1 + p/gopts1: b'.,..,,' + inv: 0! TypeError + p/wopts1! KeyError + inv: 0! KeyError + wopts1! KeyError + wopts2! KeyError + wopts3! KeyError + p/bopts1: None + inv: 0! TypeError + G: '.,,' + W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' + B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' + del wopts3! KeyError + G: '.,,' + W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' + B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' + END + + call assert_equal(expected, g:res) + unlet g:res + endfunc + + " Test for vim.buffer object + func Test_python3_buffer() + new + call setline(1, "Hello\nWorld") + call assert_fails("let x = py3eval('vim.current.buffer[0]')", 'E859:') + %bw! + + edit Xfile1 + let bnr1 = bufnr() + py3 cb = vim.current.buffer + vnew Xfile2 + let bnr2 = bufnr() + call setline(1, ['First line', 'Second line', 'Third line']) + py3 b = vim.current.buffer + wincmd w + + " Tests BufferAppend and BufferItem + py3 cb.append(b[0]) + call assert_equal(['First line'], getbufline(bnr1, 2)) + %d + + " Tests BufferSlice and BufferAssSlice + py3 cb.append('abc5') # Will be overwritten + py3 cb[-1:] = b[:-2] + call assert_equal(['First line'], getbufline(bnr1, 2)) + %d + + " Test BufferLength and BufferAssSlice + py3 cb.append('def') # Will not be overwritten + py3 cb[len(cb):] = b[:] + call assert_equal(['def', 'First line', 'Second line', 'Third line'], + \ getbufline(bnr1, 2, '$')) + %d + + " Test BufferAssItem and BufferMark + call setbufline(bnr1, 1, ['one', 'two', 'three']) + call cursor(1, 3) + normal ma + py3 cb.append('ghi') # Will be overwritten + py3 cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1])) + call assert_equal(['(3, 2)'], getbufline(bnr1, 4)) + %d + + " Test BufferRepr + py3 cb.append(repr(cb) + repr(b)) + call assert_equal([''], getbufline(bnr1, 2)) + %d + + " Modify foreign buffer + py3 << trim EOF + b.append('foo') + b[0]='bar' + b[0:0]=['baz'] + vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number) + EOF + call assert_equal(['baz', 'bar', 'Second line', 'Third line', 'foo'], + \ getbufline(bnr2, 1, '$')) + %d + + " Test assigning to name property + augroup BUFS + autocmd BufFilePost * python3 cb.append(vim.eval('expand("")') + ':BufFilePost:' + vim.eval('bufnr("%")')) + autocmd BufFilePre * python3 cb.append(vim.eval('expand("")') + ':BufFilePre:' + vim.eval('bufnr("%")')) + augroup END + py3 << trim EOF + import os + old_name = cb.name + cb.name = 'foo' + cb.append(cb.name[-11:].replace(os.path.sep, '/')) + b.name = 'bar' + cb.append(b.name[-11:].replace(os.path.sep, '/')) + cb.name = old_name + cb.append(cb.name[-14:].replace(os.path.sep, '/')) + del old_name + EOF + call assert_equal([bnr1 .. ':BufFilePre:' .. bnr1, + \ bnr1 .. ':BufFilePost:' .. bnr1, + \ 'testdir/foo', + \ bnr2 .. ':BufFilePre:' .. bnr2, + \ bnr2 .. ':BufFilePost:' .. bnr2, + \ 'testdir/bar', + \ bnr1 .. ':BufFilePre:' .. bnr1, + \ bnr1 .. ':BufFilePost:' .. bnr1, + \ 'testdir/Xfile1'], getbufline(bnr1, 2, '$')) + %d + + " Test CheckBuffer + py3 << trim EOF + for _b in vim.buffers: + if _b is not cb: + vim.command('bwipeout! ' + str(_b.number)) + del _b + cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid))) + EOF + call assert_equal('valid: b:False, cb:True', getline(2)) + %d + + py3 << trim EOF + for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")'): + try: + exec(expr) + except vim.error: + pass + else: + # Usually a SEGV here + # Should not happen in any case + cb.append('No exception for ' + expr) + vim.command('cd .') + del b + EOF + call assert_equal([''], getline(1, '$')) + + augroup BUFS + autocmd! + augroup END + augroup! BUFS + %bw! + endfunc + + " Test vim.buffers object + func Test_python3_buffers() + %bw! + edit Xfile + py3 cb = vim.current.buffer + set hidden + edit a + buffer # + edit b + buffer # + edit c + buffer # + py3 << trim EOF + # Check GCing iterator that was not fully exhausted + i = iter(vim.buffers) + cb.append('i:' + str(next(i))) + # and also check creating more than one iterator at a time + i2 = iter(vim.buffers) + cb.append('i2:' + str(next(i2))) + cb.append('i:' + str(next(i))) + # The following should trigger GC and not cause any problems + del i + del i2 + i3 = iter(vim.buffers) + cb.append('i3:' + str(next(i3))) + del i3 + EOF + call assert_equal(['i:', + \ 'i2:', 'i:', 'i3:'], + \ getline(2, '$')) + %d + + py3 << trim EOF + prevnum = 0 + for b in vim.buffers: + # Check buffer order + if prevnum >= b.number: + cb.append('!!! Buffer numbers not in strictly ascending order') + # Check indexing: vim.buffers[number].number == number + cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + \ + '=' + repr(b)) + prevnum = b.number + del prevnum + + cb.append(str(len(vim.buffers))) + EOF + call assert_equal([bufnr('Xfile') .. ':=', + \ bufnr('a') .. ':=', + \ bufnr('b') .. ':=', + \ bufnr('c') .. ':=', '4'], getline(2, '$')) + %d + + py3 << trim EOF + bnums = list(map(lambda b: b.number, vim.buffers))[1:] + + # Test wiping out buffer with existing iterator + i4 = iter(vim.buffers) + cb.append('i4:' + str(next(i4))) + vim.command('bwipeout! ' + str(bnums.pop(0))) + try: + next(i4) + except vim.error: + pass + else: + cb.append('!!!! No vim.error') + i4 = iter(vim.buffers) + vim.command('bwipeout! ' + str(bnums.pop(-1))) + vim.command('bwipeout! ' + str(bnums.pop(-1))) + cb.append('i4:' + str(next(i4))) + try: + next(i4) + except StopIteration: + cb.append('StopIteration') + del i4 + del bnums + EOF + call assert_equal(['i4:', + \ 'i4:', 'StopIteration'], getline(2, '$')) + %bw! + endfunc + + " Test vim.{tabpage,window}list and vim.{tabpage,window} objects + func Test_python3_tabpage_window() + %bw + edit Xfile + py3 cb = vim.current.buffer + tabnew 0 + tabnew 1 + vnew a.1 + tabnew 2 + vnew a.2 + vnew b.2 + vnew c.2 + + py3 << trim EOF + cb.append('Number of tabs: ' + str(len(vim.tabpages))) + cb.append('Current tab pages:') + def W(w): + if '(unknown)' in repr(w): + return '' + else: + return repr(w) + + def Cursor(w, start=len(cb)): + if w.buffer is cb: + return repr((start - w.cursor[0], w.cursor[1])) + else: + return repr(w.cursor) + + for t in vim.tabpages: + cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + \ + str(len(t.windows)) + ' windows, current is ' + W(t.window)) + cb.append(' Windows:') + for w in t.windows: + cb.append(' ' + W(w) + '(' + str(w.number) + ')' + \ + ': displays buffer ' + repr(w.buffer) + \ + '; cursor is at ' + Cursor(w)) + # Other values depend on the size of the terminal, so they are checked + # partly: + for attr in ('height', 'row', 'width', 'col'): + try: + aval = getattr(w, attr) + if type(aval) is not int: + raise TypeError + if aval < 0: + raise ValueError + except Exception as e: + cb.append('!!!!!! Error while getting attribute ' + attr + \ + ': ' + e.__class__.__name__) + del aval + del attr + w.cursor = (len(w.buffer), 0) + del W + del Cursor + cb.append('Number of windows in current tab page: ' + \ + str(len(vim.windows))) + if list(vim.windows) != list(vim.current.tabpage.windows): + cb.append('!!!!!! Windows differ') + EOF + + let expected =<< trim END + Number of tabs: 4 + Current tab pages: + (1): 1 windows, current is + Windows: + (1): displays buffer ; cursor is at (2, 0) + (2): 1 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) + (3): 2 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) + (2): displays buffer ; cursor is at (1, 0) + (4): 4 windows, current is + Windows: + (1): displays buffer ; cursor is at (1, 0) + (2): displays buffer ; cursor is at (1, 0) + (3): displays buffer ; cursor is at (1, 0) + (4): displays buffer ; cursor is at (1, 0) + Number of windows in current tab page: 4 + END + call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$')) + %bw! + endfunc + + " Test vim.current + func Test_python3_vim_current() + %bw + edit Xfile + py3 cb = vim.current.buffer + tabnew 0 + tabnew 1 + vnew a.1 + tabnew 2 + vnew a.2 + vnew b.2 + vnew c.2 + + py3 << trim EOF + def H(o): + return repr(o) + cb.append('Current tab page: ' + repr(vim.current.tabpage)) + cb.append('Current window: ' + repr(vim.current.window) + ': ' + \ + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window)) + cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + \ + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ \ + ' is ' + H(vim.current.tabpage.window.buffer)) + del H + EOF + let expected =<< trim END + Current tab page: + Current window: : is + Current buffer: : is is + END + call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$')) + call deletebufline(bufnr('Xfile'), 1, '$') + + " Assigning: fails + py3 << trim EOF + try: + vim.current.window = vim.tabpages[0].window + except ValueError: + cb.append('ValueError at assigning foreign tab window') + + for attr in ('window', 'tabpage', 'buffer'): + try: + setattr(vim.current, attr, None) + except TypeError: + cb.append('Type error at assigning None to vim.current.' + attr) + del attr + EOF + + let expected =<< trim END + ValueError at assigning foreign tab window + Type error at assigning None to vim.current.window + Type error at assigning None to vim.current.tabpage + Type error at assigning None to vim.current.buffer + END + call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$')) + call deletebufline(bufnr('Xfile'), 1, '$') + + call setbufline(bufnr('Xfile'), 1, 'python interface') + py3 << trim EOF + # Assigning: success + vim.current.tabpage = vim.tabpages[-2] + vim.current.buffer = cb + vim.current.window = vim.windows[0] + vim.current.window.cursor = (len(vim.current.buffer), 0) + cb.append('Current tab page: ' + repr(vim.current.tabpage)) + cb.append('Current window: ' + repr(vim.current.window)) + cb.append('Current buffer: ' + repr(vim.current.buffer)) + cb.append('Current line: ' + repr(vim.current.line)) + EOF + + let expected =<< trim END + Current tab page: + Current window: + Current buffer: + Current line: 'python interface' + END + call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$')) + call deletebufline(bufnr('Xfile'), 1, '$') + + py3 << trim EOF + ws = list(vim.windows) + ts = list(vim.tabpages) + for b in vim.buffers: + if b is not cb: + vim.command('bwipeout! ' + str(b.number)) + del b + cb.append('w.valid: ' + repr([w.valid for w in ws])) + cb.append('t.valid: ' + repr([t.valid for t in ts])) + del w + del t + del ts + del ws + EOF + let expected =<< trim END + w.valid: [True, False] + t.valid: [True, False, True, False] + END + call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$')) + %bw! + endfunc + + " Test types + func Test_python3_types() + %d + py3 cb = vim.current.buffer + py3 << trim EOF + for expr, attr in ( + ('vim.vars', 'Dictionary'), + ('vim.options', 'Options'), + ('vim.bindeval("{}")', 'Dictionary'), + ('vim.bindeval("[]")', 'List'), + ('vim.bindeval("function(\'tr\')")', 'Function'), + ('vim.current.buffer', 'Buffer'), + ('vim.current.range', 'Range'), + ('vim.current.window', 'Window'), + ('vim.current.tabpage', 'TabPage'), + ): + cb.append(expr + ':' + attr + ':' + \ + repr(type(eval(expr)) is getattr(vim, attr))) + del expr + del attr + EOF + let expected =<< trim END + vim.vars:Dictionary:True + vim.options:Options:True + vim.bindeval("{}"):Dictionary:True + vim.bindeval("[]"):List:True + vim.bindeval("function('tr')"):Function:True + vim.current.buffer:Buffer:True + vim.current.range:Range:True + vim.current.window:Window:True + vim.current.tabpage:TabPage:True + END + call assert_equal(expected, getline(2, '$')) + endfunc + + " Test __dir__() method + func Test_python3_dir_method() + %d + py3 cb = vim.current.buffer + py3 << trim EOF + for name, o in ( + ('current', vim.current), + ('buffer', vim.current.buffer), + ('window', vim.current.window), + ('tabpage', vim.current.tabpage), + ('range', vim.current.range), + ('dictionary', vim.bindeval('{}')), + ('list', vim.bindeval('[]')), + ('function', vim.bindeval('function("tr")')), + ('output', sys.stdout), + ): + cb.append(name + ':' + ','.join(dir(o))) + del name + del o + EOF + let expected =<< trim END + current:__dir__,buffer,line,range,tabpage,window + buffer:__dir__,append,mark,name,number,options,range,valid,vars + window:__dir__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width + tabpage:__dir__,number,valid,vars,window,windows + range:__dir__,append,end,start + dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values + list:__dir__,extend,locked + function:__dir__,args,auto_rebind,self,softspace + output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines + END + call assert_equal(expected, getline(2, '$')) + endfunc + + " Test vim.*.__new__ + func Test_python3_new() + call assert_equal({}, py3eval('vim.Dictionary({})')) + call assert_equal({'a': 1}, py3eval('vim.Dictionary(a=1)')) + call assert_equal({'a': 1}, py3eval('vim.Dictionary(((''a'', 1),))')) + call assert_equal([], py3eval('vim.List()')) + call assert_equal(['a', 'b', 'c', '7'], py3eval('vim.List(iter(''abc7''))')) + call assert_equal(function('tr'), py3eval('vim.Function(''tr'')')) + call assert_equal(function('tr', [123, 3, 4]), + \ py3eval('vim.Function(''tr'', args=[123, 3, 4])')) + call assert_equal(function('tr'), py3eval('vim.Function(''tr'', args=[])')) + call assert_equal(function('tr', {}), + \ py3eval('vim.Function(''tr'', self={})')) + call assert_equal(function('tr', [123, 3, 4], {}), + \ py3eval('vim.Function(''tr'', args=[123, 3, 4], self={})')) + call assert_equal(function('tr'), + \ py3eval('vim.Function(''tr'', auto_rebind=False)')) + call assert_equal(function('tr', [123, 3, 4]), + \ py3eval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) + call assert_equal(function('tr'), + \ py3eval('vim.Function(''tr'', args=[], auto_rebind=False)')) + call assert_equal(function('tr', {}), + \ py3eval('vim.Function(''tr'', self={}, auto_rebind=False)')) + call assert_equal(function('tr', [123, 3, 4], {}), + \ py3eval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)')) + endfunc + + " Test vim.Function + func Test_python3_vim_func() + function Args(...) + return a:000 + endfunc + + function SelfArgs(...) dict + return [a:000, self] + endfunc + + " The following four lines should not crash + let Pt = function('tr', [[]], {'l': []}) + py3 Pt = vim.bindeval('Pt') + unlet Pt + py3 del Pt + + %bw! + py3 cb = vim.current.buffer + py3 << trim EOF + def ecall(out_prefix, func, *args, **kwargs): + line = out_prefix + ': ' + try: + ret = func(*args, **kwargs) + except Exception: + line += '!exception: ' + emsg(sys.exc_info()) + else: + line += '!result: ' + str(vim.Function('string')(ret), 'utf-8') + cb.append(line) + a = vim.Function('Args') + pa1 = vim.Function('Args', args=['abcArgsPA1']) + pa2 = vim.Function('Args', args=[]) + pa3 = vim.Function('Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'}) + pa4 = vim.Function('Args', self={'abcSelfPA4': 'abcSelfPA4Val'}) + cb.append('a: ' + repr(a)) + cb.append('pa1: ' + repr(pa1)) + cb.append('pa2: ' + repr(pa2)) + cb.append('pa3: ' + repr(pa3)) + cb.append('pa4: ' + repr(pa4)) + sa = vim.Function('SelfArgs') + psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1']) + psa2 = vim.Function('SelfArgs', args=[]) + psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) + psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) + psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0) + psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=()) + psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[]) + psa8 = vim.Function('SelfArgs', auto_rebind=False) + psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True) + psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1) + psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'}) + psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC']) + cb.append('sa: ' + repr(sa)) + cb.append('psa1: ' + repr(psa1)) + cb.append('psa2: ' + repr(psa2)) + cb.append('psa3: ' + repr(psa3)) + cb.append('psa4: ' + repr(psa4)) + cb.append('psa5: ' + repr(psa5)) + cb.append('psa6: ' + repr(psa6)) + cb.append('psa7: ' + repr(psa7)) + cb.append('psa8: ' + repr(psa8)) + cb.append('psa9: ' + repr(psa9)) + cb.append('psaA: ' + repr(psaA)) + cb.append('psaB: ' + repr(psaB)) + cb.append('psaC: ' + repr(psaC)) + + psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) + psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] + psar.self['rec'] = psar + psar.self['self'] = psar.self + psar.self['args'] = psar.args + + try: + cb.append('psar: ' + repr(psar)) + except Exception: + cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info())) + EOF + + let expected =<< trim END + a: + pa1: + pa2: + pa3: + pa4: + sa: + psa1: + psa2: + psa3: + psa4: + psa5: + psa6: + psa7: + psa8: + psa9: + psaA: + psaB: + psaC: + psar: + END + call assert_equal(expected, getline(2, '$')) + %d + + call assert_equal(function('Args'), py3eval('a')) + call assert_equal(function('Args', ['abcArgsPA1']), py3eval('pa1')) + call assert_equal(function('Args'), py3eval('pa2')) + call assert_equal(function('Args', ['abcArgsPA3'], {'abcSelfPA3': 'abcSelfPA3Val'}), py3eval('pa3')) + call assert_equal(function('Args', {'abcSelfPA4': 'abcSelfPA4Val'}), py3eval('pa4')) + call assert_equal(function('SelfArgs'), py3eval('sa')) + call assert_equal(function('SelfArgs', ['abcArgsPSA1']), py3eval('psa1')) + call assert_equal(function('SelfArgs'), py3eval('psa2')) + call assert_equal(function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}), py3eval('psa3')) + call assert_equal(function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}), py3eval('psa4')) + call assert_equal(function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}), py3eval('psa5')) + call assert_equal(function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}), py3eval('psa6')) + call assert_equal(function('SelfArgs', ['abcArgsPSA7']), py3eval('psa7')) + call assert_equal(function('SelfArgs'), py3eval('psa8')) + call assert_equal(function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}), py3eval('psa9')) + call assert_equal(function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}), py3eval('psaA')) + call assert_equal(function('SelfArgs', ['abcArgsPSAB']), py3eval('psaB')) + call assert_equal(function('SelfArgs'), py3eval('psaC')) + + let res = [] + for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', + \ 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] + let d = {'f': py3eval(v)} + call add(res, 'd.' .. v .. '(): ' .. string(d.f())) + endfor + + let expected =<< trim END + d.sa(): [[], {'f': function('SelfArgs')}] + d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}] + d.psa2(): [[], {'f': function('SelfArgs')}] + d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] + d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] + d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}] + d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}] + d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}] + d.psa8(): [[], {'f': function('SelfArgs')}] + d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}] + d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}] + d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}] + d.psaC(): [[], {'f': function('SelfArgs')}] + END + call assert_equal(expected, res) + + py3 ecall('a()', a, ) + py3 ecall('pa1()', pa1, ) + py3 ecall('pa2()', pa2, ) + py3 ecall('pa3()', pa3, ) + py3 ecall('pa4()', pa4, ) + py3 ecall('sa()', sa, ) + py3 ecall('psa1()', psa1, ) + py3 ecall('psa2()', psa2, ) + py3 ecall('psa3()', psa3, ) + py3 ecall('psa4()', psa4, ) + + py3 ecall('a(42, 43)', a, 42, 43) + py3 ecall('pa1(42, 43)', pa1, 42, 43) + py3 ecall('pa2(42, 43)', pa2, 42, 43) + py3 ecall('pa3(42, 43)', pa3, 42, 43) + py3 ecall('pa4(42, 43)', pa4, 42, 43) + py3 ecall('sa(42, 43)', sa, 42, 43) + py3 ecall('psa1(42, 43)', psa1, 42, 43) + py3 ecall('psa2(42, 43)', psa2, 42, 43) + py3 ecall('psa3(42, 43)', psa3, 42, 43) + py3 ecall('psa4(42, 43)', psa4, 42, 43) + + py3 ecall('a(42, self={"20": 1})', a, 42, self={'20': 1}) + py3 ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1}) + py3 ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1}) + py3 ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1}) + py3 ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1}) + py3 ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1}) + py3 ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1}) + py3 ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1}) + py3 ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1}) + py3 ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1}) + + py3 ecall('a(self={"20": 1})', a, self={'20': 1}) + py3 ecall('pa1(self={"20": 1})', pa1, self={'20': 1}) + py3 ecall('pa2(self={"20": 1})', pa2, self={'20': 1}) + py3 ecall('pa3(self={"20": 1})', pa3, self={'20': 1}) + py3 ecall('pa4(self={"20": 1})', pa4, self={'20': 1}) + py3 ecall('sa(self={"20": 1})', sa, self={'20': 1}) + py3 ecall('psa1(self={"20": 1})', psa1, self={'20': 1}) + py3 ecall('psa2(self={"20": 1})', psa2, self={'20': 1}) + py3 ecall('psa3(self={"20": 1})', psa3, self={'20': 1}) + py3 ecall('psa4(self={"20": 1})', psa4, self={'20': 1}) + + py3 << trim EOF + def s(v): + if v is None: + return repr(v) + else: + return str(vim.Function('string')(v), 'utf-8') + + cb.append('a.args: ' + s(a.args)) + cb.append('pa1.args: ' + s(pa1.args)) + cb.append('pa2.args: ' + s(pa2.args)) + cb.append('pa3.args: ' + s(pa3.args)) + cb.append('pa4.args: ' + s(pa4.args)) + cb.append('sa.args: ' + s(sa.args)) + cb.append('psa1.args: ' + s(psa1.args)) + cb.append('psa2.args: ' + s(psa2.args)) + cb.append('psa3.args: ' + s(psa3.args)) + cb.append('psa4.args: ' + s(psa4.args)) + + cb.append('a.self: ' + s(a.self)) + cb.append('pa1.self: ' + s(pa1.self)) + cb.append('pa2.self: ' + s(pa2.self)) + cb.append('pa3.self: ' + s(pa3.self)) + cb.append('pa4.self: ' + s(pa4.self)) + cb.append('sa.self: ' + s(sa.self)) + cb.append('psa1.self: ' + s(psa1.self)) + cb.append('psa2.self: ' + s(psa2.self)) + cb.append('psa3.self: ' + s(psa3.self)) + cb.append('psa4.self: ' + s(psa4.self)) + + cb.append('a.name: ' + s(a.name)) + cb.append('pa1.name: ' + s(pa1.name)) + cb.append('pa2.name: ' + s(pa2.name)) + cb.append('pa3.name: ' + s(pa3.name)) + cb.append('pa4.name: ' + s(pa4.name)) + cb.append('sa.name: ' + s(sa.name)) + cb.append('psa1.name: ' + s(psa1.name)) + cb.append('psa2.name: ' + s(psa2.name)) + cb.append('psa3.name: ' + s(psa3.name)) + cb.append('psa4.name: ' + s(psa4.name)) + + cb.append('a.auto_rebind: ' + s(a.auto_rebind)) + cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) + cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) + cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind)) + cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind)) + cb.append('sa.auto_rebind: ' + s(sa.auto_rebind)) + cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind)) + cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind)) + cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind)) + cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind)) + cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind)) + cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind)) + cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind)) + cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind)) + cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind)) + cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) + cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) + cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) + + del s + + del a + del pa1 + del pa2 + del pa3 + del pa4 + del sa + del psa1 + del psa2 + del psa3 + del psa4 + del psa5 + del psa6 + del psa7 + del psa8 + del psa9 + del psaA + del psaB + del psaC + del psar + + del ecall + EOF + + let expected =<< trim END + a(): !result: [] + pa1(): !result: ['abcArgsPA1'] + pa2(): !result: [] + pa3(): !result: ['abcArgsPA3'] + pa4(): !result: [] + sa(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) + psa1(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) + psa2(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) + psa3(): !result: [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] + psa4(): !result: [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] + a(42, 43): !result: [42, 43] + pa1(42, 43): !result: ['abcArgsPA1', 42, 43] + pa2(42, 43): !result: [42, 43] + pa3(42, 43): !result: ['abcArgsPA3', 42, 43] + pa4(42, 43): !result: [42, 43] + sa(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) + psa1(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) + psa2(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',) + psa3(42, 43): !result: [['abcArgsPSA3', 42, 43], {'abcSelfPSA3': 'abcSelfPSA3Val'}] + psa4(42, 43): !result: [[42, 43], {'abcSelfPSA4': 'abcSelfPSA4Val'}] + a(42, self={"20": 1}): !result: [42] + pa1(42, self={"20": 1}): !result: ['abcArgsPA1', 42] + pa2(42, self={"20": 1}): !result: [42] + pa3(42, self={"20": 1}): !result: ['abcArgsPA3', 42] + pa4(42, self={"20": 1}): !result: [42] + sa(42, self={"20": 1}): !result: [[42], {'20': 1}] + psa1(42, self={"20": 1}): !result: [['abcArgsPSA1', 42], {'20': 1}] + psa2(42, self={"20": 1}): !result: [[42], {'20': 1}] + psa3(42, self={"20": 1}): !result: [['abcArgsPSA3', 42], {'20': 1}] + psa4(42, self={"20": 1}): !result: [[42], {'20': 1}] + a(self={"20": 1}): !result: [] + pa1(self={"20": 1}): !result: ['abcArgsPA1'] + pa2(self={"20": 1}): !result: [] + pa3(self={"20": 1}): !result: ['abcArgsPA3'] + pa4(self={"20": 1}): !result: [] + sa(self={"20": 1}): !result: [[], {'20': 1}] + psa1(self={"20": 1}): !result: [['abcArgsPSA1'], {'20': 1}] + psa2(self={"20": 1}): !result: [[], {'20': 1}] + psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'20': 1}] + psa4(self={"20": 1}): !result: [[], {'20': 1}] + a.args: None + pa1.args: ['abcArgsPA1'] + pa2.args: None + pa3.args: ['abcArgsPA3'] + pa4.args: None + sa.args: None + psa1.args: ['abcArgsPSA1'] + psa2.args: None + psa3.args: ['abcArgsPSA3'] + psa4.args: None + a.self: None + pa1.self: None + pa2.self: None + pa3.self: {'abcSelfPA3': 'abcSelfPA3Val'} + pa4.self: {'abcSelfPA4': 'abcSelfPA4Val'} + sa.self: None + psa1.self: None + psa2.self: None + psa3.self: {'abcSelfPSA3': 'abcSelfPSA3Val'} + psa4.self: {'abcSelfPSA4': 'abcSelfPSA4Val'} + a.name: 'Args' + pa1.name: 'Args' + pa2.name: 'Args' + pa3.name: 'Args' + pa4.name: 'Args' + sa.name: 'SelfArgs' + psa1.name: 'SelfArgs' + psa2.name: 'SelfArgs' + psa3.name: 'SelfArgs' + psa4.name: 'SelfArgs' + a.auto_rebind: 1 + pa1.auto_rebind: 1 + pa2.auto_rebind: 1 + pa3.auto_rebind: 0 + pa4.auto_rebind: 0 + sa.auto_rebind: 1 + psa1.auto_rebind: 1 + psa2.auto_rebind: 1 + psa3.auto_rebind: 0 + psa4.auto_rebind: 0 + psa5.auto_rebind: 0 + psa6.auto_rebind: 0 + psa7.auto_rebind: 1 + psa8.auto_rebind: 1 + psa9.auto_rebind: 1 + psaA.auto_rebind: 1 + psaB.auto_rebind: 1 + psaC.auto_rebind: 1 + END + call assert_equal(expected, getline(2, '$')) + %bw! + endfunc + + " Test stdout/stderr + func Test_python3_stdin_stderr() + let caught_writeerr = 0 + let caught_writelineerr = 0 + redir => messages + py3 sys.stdout.write('abc8') ; sys.stdout.write('def') + try + py3 sys.stderr.write('abc9') ; sys.stderr.write('def') + catch /abc9def/ + let caught_writeerr = 1 + endtry + py3 sys.stdout.writelines(iter('abcA')) + try + py3 sys.stderr.writelines(iter('abcB')) + catch /abcB/ + let caught_writelineerr = 1 + endtry + redir END + call assert_equal("\nabc8def\nabcA", messages) + call assert_equal(1, caught_writeerr) + call assert_equal(1, caught_writelineerr) + endfunc + + " Test subclassing + func Test_python3_subclass() + new + func Put(...) + return a:000 + endfunc + + py3 << trim EOF + class DupDict(vim.Dictionary): + def __setitem__(self, key, value): + super(DupDict, self).__setitem__(key, value) + super(DupDict, self).__setitem__('dup_' + key, value) + dd = DupDict() + dd['a'] = 'b' + + class DupList(vim.List): + def __getitem__(self, idx): + return [super(DupList, self).__getitem__(idx)] * 2 + + dl = DupList() + dl2 = DupList(iter('abcC')) + dl.extend(dl2[0]) + + class DupFun(vim.Function): + def __call__(self, arg): + return super(DupFun, self).__call__(arg, arg) + + df = DupFun('Put') + EOF + + call assert_equal(['a', 'dup_a'], sort(keys(py3eval('dd')))) + call assert_equal(['a', 'a'], py3eval('dl')) + call assert_equal(['a', 'b', 'c', 'C'], py3eval('dl2')) + call assert_equal([2, 2], py3eval('df(2)')) + call assert_equal(1, py3eval('dl') is# py3eval('dl')) + call assert_equal(1, py3eval('dd') is# py3eval('dd')) + call assert_equal(function('Put'), py3eval('df')) + delfunction Put + py3 << trim EOF + del DupDict + del DupList + del DupFun + del dd + del dl + del dl2 + del df + EOF + close! + endfunc + + " Test chdir + func Test_python3_chdir() + new Xfile + py3 cb = vim.current.buffer + py3 << trim EOF + import os + fnamemodify = vim.Function('fnamemodify') + cb.append(str(fnamemodify('.', ':p:h:t'))) + cb.append(vim.eval('@%')) + os.chdir('..') + path = fnamemodify('.', ':p:h:t') + if path != b'src': + # Running tests from a shadow directory, so move up another level + # This will result in @% looking like shadow/testdir/Xfile, hence the + # slicing to remove the leading path and path separator + os.chdir('..') + cb.append(str(fnamemodify('.', ':p:h:t'))) + cb.append(vim.eval('@%')[len(path)+1:].replace(os.path.sep, '/')) + os.chdir(path) + del path + else: + cb.append(str(fnamemodify('.', ':p:h:t'))) + cb.append(vim.eval('@%').replace(os.path.sep, '/')) + del path + os.chdir('testdir') + cb.append(str(fnamemodify('.', ':p:h:t'))) + cb.append(vim.eval('@%')) + del fnamemodify + EOF + call assert_equal(["b'testdir'", 'Xfile', "b'src'", 'testdir/Xfile', + \"b'testdir'", 'Xfile'], getline(2, '$')) + close! + endfunc + + " Test errors + func Test_python3_errors() + func F() dict + endfunc + + func D() + endfunc + + new + py3 cb = vim.current.buffer + + py3 << trim EOF + d = vim.Dictionary() + ned = vim.Dictionary(foo='bar', baz='abcD') + dl = vim.Dictionary(a=1) + dl.locked = True + l = vim.List() + ll = vim.List('abcE') + ll.locked = True + nel = vim.List('abcO') + f = vim.Function('string') + fd = vim.Function('F') + fdel = vim.Function('D') + vim.command('delfunction D') + + def subexpr_test(expr, name, subexprs): + cb.append('>>> Testing %s using %s' % (name, expr)) + for subexpr in subexprs: + ee(expr % subexpr) + cb.append('<<< Finished') + + def stringtochars_test(expr): + return subexpr_test(expr, 'StringToChars', ( + '1', # Fail type checks + 'b"\\0"', # Fail PyString_AsStringAndSize(object, , NULL) check + '"\\0"', # Fail PyString_AsStringAndSize(bytes, , NULL) check + )) + + class Mapping(object): + def __init__(self, d): + self.d = d + + def __getitem__(self, key): + return self.d[key] + + def keys(self): + return self.d.keys() + + def items(self): + return self.d.items() + + def convertfrompyobject_test(expr, recurse=True): + # pydict_to_tv + stringtochars_test(expr % '{%s : 1}') + if recurse: + convertfrompyobject_test(expr % '{"abcF" : %s}', False) + # pymap_to_tv + stringtochars_test(expr % 'Mapping({%s : 1})') + if recurse: + convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False) + # pyseq_to_tv + iter_test(expr) + return subexpr_test(expr, 'ConvertFromPyObject', ( + 'None', # Not conversible + '{b"": 1}', # Empty key not allowed + '{"": 1}', # Same, but with unicode object + 'FailingMapping()', # + 'FailingMappingKey()', # + 'FailingNumber()', # + )) + + def convertfrompymapping_test(expr): + convertfrompyobject_test(expr) + return subexpr_test(expr, 'ConvertFromPyMapping', ( + '[]', + )) + + def iter_test(expr): + return subexpr_test(expr, '*Iter*', ( + 'FailingIter()', + 'FailingIterNext()', + )) + + def number_test(expr, natural=False, unsigned=False): + if natural: + unsigned = True + return subexpr_test(expr, 'NumberToLong', ( + '[]', + 'None', + ) + (('-1',) if unsigned else ()) + + (('0',) if natural else ())) + + class FailingTrue(object): + def __bool__(self): + raise NotImplementedError('bool') + + class FailingIter(object): + def __iter__(self): + raise NotImplementedError('iter') + + class FailingIterNext(object): + def __iter__(self): + return self + + def __next__(self): + raise NotImplementedError('next') + + class FailingIterNextN(object): + def __init__(self, n): + self.n = n + + def __iter__(self): + return self + + def __next__(self): + if self.n: + self.n -= 1 + return 1 + else: + raise NotImplementedError('next N') + + class FailingMappingKey(object): + def __getitem__(self, item): + raise NotImplementedError('getitem:mappingkey') + + def keys(self): + return list("abcH") + + class FailingMapping(object): + def __getitem__(self): + raise NotImplementedError('getitem:mapping') + + def keys(self): + raise NotImplementedError('keys') + + class FailingList(list): + def __getitem__(self, idx): + if i == 2: + raise NotImplementedError('getitem:list') + else: + return super(FailingList, self).__getitem__(idx) + + class NoArgsCall(object): + def __call__(self): + pass + + class FailingCall(object): + def __call__(self, path): + raise NotImplementedError('call') + + class FailingNumber(object): + def __int__(self): + raise NotImplementedError('int') + + cb.append("> Output") + cb.append(">> OutputSetattr") + ee('del sys.stdout.softspace') + number_test('sys.stdout.softspace = %s', unsigned=True) + number_test('sys.stderr.softspace = %s', unsigned=True) + ee('assert sys.stdout.isatty()==False') + ee('assert sys.stdout.seekable()==False') + ee('sys.stdout.close()') + ee('sys.stdout.flush()') + ee('assert sys.stderr.isatty()==False') + ee('assert sys.stderr.seekable()==False') + ee('sys.stderr.close()') + ee('sys.stderr.flush()') + ee('sys.stdout.attr = None') + cb.append(">> OutputWrite") + ee('assert sys.stdout.writable()==True') + ee('assert sys.stdout.readable()==False') + ee('assert sys.stderr.writable()==True') + ee('assert sys.stderr.readable()==False') + ee('assert sys.stdout.closed()==False') + ee('assert sys.stderr.closed()==False') + ee('assert sys.stdout.errors=="strict"') + ee('assert sys.stderr.errors=="strict"') + ee('assert sys.stdout.encoding==sys.stderr.encoding') + ee('sys.stdout.write(None)') + cb.append(">> OutputWriteLines") + ee('sys.stdout.writelines(None)') + ee('sys.stdout.writelines([1])') + iter_test('sys.stdout.writelines(%s)') + cb.append("> VimCommand") + stringtochars_test('vim.command(%s)') + ee('vim.command("", 2)') + #! Not checked: vim->python exceptions translating: checked later + cb.append("> VimToPython") + #! Not checked: everything: needs errors in internal python functions + cb.append("> VimEval") + stringtochars_test('vim.eval(%s)') + ee('vim.eval("", FailingTrue())') + #! Not checked: everything: needs errors in internal python functions + cb.append("> VimEvalPy") + stringtochars_test('vim.bindeval(%s)') + ee('vim.eval("", 2)') + #! Not checked: vim->python exceptions translating: checked later + cb.append("> VimStrwidth") + stringtochars_test('vim.strwidth(%s)') + cb.append("> VimForeachRTP") + ee('vim.foreach_rtp(None)') + ee('vim.foreach_rtp(NoArgsCall())') + ee('vim.foreach_rtp(FailingCall())') + ee('vim.foreach_rtp(int, 2)') + cb.append('> import') + old_rtp = vim.options['rtp'] + vim.options['rtp'] = os.getcwd().replace('\\', '\\\\').replace(',', '\\,') + ee('import xxx_no_such_module_xxx') + ee('import failing_import') + ee('import failing') + vim.options['rtp'] = old_rtp + del old_rtp + cb.append("> Options") + cb.append(">> OptionsItem") + ee('vim.options["abcQ"]') + ee('vim.options[""]') + stringtochars_test('vim.options[%s]') + cb.append(">> OptionsContains") + stringtochars_test('%s in vim.options') + cb.append("> Dictionary") + cb.append(">> DictionaryConstructor") + ee('vim.Dictionary("abcI")') + ##! Not checked: py_dict_alloc failure + cb.append(">> DictionarySetattr") + ee('del d.locked') + ee('d.locked = FailingTrue()') + ee('vim.vvars.locked = False') + ee('d.scope = True') + ee('d.xxx = True') + cb.append(">> _DictionaryItem") + ee('d.get("a", 2, 3)') + stringtochars_test('d.get(%s)') + ee('d.pop("a")') + ee('dl.pop("a")') + cb.append(">> DictionaryContains") + ee('"" in d') + ee('0 in d') + cb.append(">> DictionaryIterNext") + ee('for i in ned: ned["a"] = 1') + del i + cb.append(">> DictionaryAssItem") + ee('dl["b"] = 1') + stringtochars_test('d[%s] = 1') + convertfrompyobject_test('d["a"] = %s') + cb.append(">> DictionaryUpdate") + cb.append(">>> kwargs") + cb.append(">>> iter") + ee('d.update(FailingMapping())') + ee('d.update([FailingIterNext()])') + ee('d.update([FailingIterNextN(1)])') + iter_test('d.update(%s)') + convertfrompyobject_test('d.update(%s)') + stringtochars_test('d.update(((%s, 0),))') + convertfrompyobject_test('d.update((("a", %s),))') + cb.append(">> DictionaryPopItem") + ee('d.popitem(1, 2)') + cb.append(">> DictionaryHasKey") + ee('d.has_key()') + cb.append("> List") + cb.append(">> ListConstructor") + ee('vim.List(1, 2)') + ee('vim.List(a=1)') + iter_test('vim.List(%s)') + convertfrompyobject_test('vim.List([%s])') + cb.append(">> ListItem") + ee('l[1000]') + cb.append(">> ListAssItem") + ee('ll[1] = 2') + ee('l[1000] = 3') + cb.append(">> ListAssSlice") + ee('ll[1:100] = "abcJ"') + iter_test('l[:] = %s') + ee('nel[1:10:2] = "abcK"') + cb.append(repr(tuple(nel))) + ee('nel[1:10:2] = "a"') + cb.append(repr(tuple(nel))) + ee('nel[1:1:-1] = "a"') + cb.append(repr(tuple(nel))) + ee('nel[:] = FailingIterNextN(2)') + cb.append(repr(tuple(nel))) + convertfrompyobject_test('l[:] = [%s]') + cb.append(">> ListConcatInPlace") + iter_test('l.extend(%s)') + convertfrompyobject_test('l.extend([%s])') + cb.append(">> ListSetattr") + ee('del l.locked') + ee('l.locked = FailingTrue()') + ee('l.xxx = True') + cb.append("> Function") + cb.append(">> FunctionConstructor") + cb.append(">>> FunctionConstructor") + ee('vim.Function("123")') + ee('vim.Function("xxx_non_existent_function_xxx")') + ee('vim.Function("xxx#non#existent#function#xxx")') + ee('vim.Function("xxx_non_existent_function_xxx2", args=[])') + ee('vim.Function("xxx_non_existent_function_xxx3", self={})') + ee('vim.Function("xxx_non_existent_function_xxx4", args=[], self={})') + cb.append(">>> FunctionNew") + ee('vim.Function("tr", self="abcFuncSelf")') + ee('vim.Function("tr", args=427423)') + ee('vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2")') + ee('vim.Function(self="abcFuncSelf2", args="abcFuncArgs2")') + ee('vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2")') + ee('vim.Function("tr", "")') + cb.append(">> FunctionCall") + convertfrompyobject_test('f(%s)') + convertfrompymapping_test('fd(self=%s)') + cb.append("> TabPage") + cb.append(">> TabPageAttr") + ee('vim.current.tabpage.xxx') + cb.append("> TabList") + cb.append(">> TabListItem") + ee('vim.tabpages[1000]') + cb.append("> Window") + cb.append(">> WindowAttr") + ee('vim.current.window.xxx') + cb.append(">> WindowSetattr") + ee('vim.current.window.buffer = 0') + ee('vim.current.window.cursor = (100000000, 100000000)') + ee('vim.current.window.cursor = True') + number_test('vim.current.window.height = %s', unsigned=True) + number_test('vim.current.window.width = %s', unsigned=True) + ee('vim.current.window.xxxxxx = True') + cb.append("> WinList") + cb.append(">> WinListItem") + ee('vim.windows[1000]') + cb.append("> Buffer") + cb.append(">> StringToLine (indirect)") + ee('vim.current.buffer[0] = "\\na"') + ee('vim.current.buffer[0] = b"\\na"') + cb.append(">> SetBufferLine (indirect)") + ee('vim.current.buffer[0] = True') + cb.append(">> SetBufferLineList (indirect)") + ee('vim.current.buffer[:] = True') + ee('vim.current.buffer[:] = ["\\na", "bc"]') + cb.append(">> InsertBufferLines (indirect)") + ee('vim.current.buffer.append(None)') + ee('vim.current.buffer.append(["\\na", "bc"])') + ee('vim.current.buffer.append("\\nbc")') + cb.append(">> RBItem") + ee('vim.current.buffer[100000000]') + cb.append(">> RBAsItem") + ee('vim.current.buffer[100000000] = ""') + cb.append(">> BufferAttr") + ee('vim.current.buffer.xxx') + cb.append(">> BufferSetattr") + ee('vim.current.buffer.name = True') + ee('vim.current.buffer.xxx = True') + cb.append(">> BufferMark") + ee('vim.current.buffer.mark(0)') + ee('vim.current.buffer.mark("abcM")') + ee('vim.current.buffer.mark("!")') + cb.append(">> BufferRange") + ee('vim.current.buffer.range(1, 2, 3)') + cb.append("> BufMap") + cb.append(">> BufMapItem") + ee('vim.buffers[100000000]') + number_test('vim.buffers[%s]', natural=True) + cb.append("> Current") + cb.append(">> CurrentGetattr") + ee('vim.current.xxx') + cb.append(">> CurrentSetattr") + ee('vim.current.line = True') + ee('vim.current.buffer = True') + ee('vim.current.window = True') + ee('vim.current.tabpage = True') + ee('vim.current.xxx = True') + del d + del ned + del dl + del l + del ll + del nel + del f + del fd + del fdel + del subexpr_test + del stringtochars_test + del Mapping + del convertfrompyobject_test + del convertfrompymapping_test + del iter_test + del number_test + del FailingTrue + del FailingIter + del FailingIterNext + del FailingIterNextN + del FailingMapping + del FailingMappingKey + del FailingList + del NoArgsCall + del FailingCall + del FailingNumber + EOF + delfunction F + + let expected =<< trim END + > Output + >> OutputSetattr + del sys.stdout.softspace:(, AttributeError('cannot delete OutputObject attributes',)) + >>> Testing NumberToLong using sys.stdout.softspace = %s + sys.stdout.softspace = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) + sys.stdout.softspace = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) + sys.stdout.softspace = -1:(, ValueError('number must be greater or equal to zero',)) + <<< Finished + >>> Testing NumberToLong using sys.stderr.softspace = %s + sys.stderr.softspace = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) + sys.stderr.softspace = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) + sys.stderr.softspace = -1:(, ValueError('number must be greater or equal to zero',)) + <<< Finished + assert sys.stdout.isatty()==False:NOT FAILED + assert sys.stdout.seekable()==False:NOT FAILED + sys.stdout.close():NOT FAILED + sys.stdout.flush():NOT FAILED + assert sys.stderr.isatty()==False:NOT FAILED + assert sys.stderr.seekable()==False:NOT FAILED + sys.stderr.close():NOT FAILED + sys.stderr.flush():NOT FAILED + sys.stdout.attr = None:(, AttributeError('invalid attribute: attr',)) + >> OutputWrite + assert sys.stdout.writable()==True:NOT FAILED + assert sys.stdout.readable()==False:NOT FAILED + assert sys.stderr.writable()==True:NOT FAILED + assert sys.stderr.readable()==False:NOT FAILED + assert sys.stdout.closed()==False:NOT FAILED + assert sys.stderr.closed()==False:NOT FAILED + assert sys.stdout.errors=="strict":NOT FAILED + assert sys.stderr.errors=="strict":NOT FAILED + assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED + sys.stdout.write(None):(, TypeError("Can't convert 'NoneType' object to str implicitly",)) + >> OutputWriteLines + sys.stdout.writelines(None):(, TypeError("'NoneType' object is not iterable",)) + sys.stdout.writelines([1]):(, TypeError("Can't convert 'int' object to str implicitly",)) + >>> Testing *Iter* using sys.stdout.writelines(%s) + sys.stdout.writelines(FailingIter()):(, NotImplementedError('iter',)) + sys.stdout.writelines(FailingIterNext()):(, NotImplementedError('next',)) + <<< Finished + > VimCommand + >>> Testing StringToChars using vim.command(%s) + vim.command(1):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.command(b"\0"):(, TypeError('expected bytes with no null',)) + vim.command("\0"):(, TypeError('expected bytes with no null',)) + <<< Finished + vim.command("", 2):(, TypeError('command() takes exactly one argument (2 given)',)) + > VimToPython + > VimEval + >>> Testing StringToChars using vim.eval(%s) + vim.eval(1):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.eval(b"\0"):(, TypeError('expected bytes with no null',)) + vim.eval("\0"):(, TypeError('expected bytes with no null',)) + <<< Finished + vim.eval("", FailingTrue()):(, TypeError('function takes exactly 1 argument (2 given)',)) + > VimEvalPy + >>> Testing StringToChars using vim.bindeval(%s) + vim.bindeval(1):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.bindeval(b"\0"):(, TypeError('expected bytes with no null',)) + vim.bindeval("\0"):(, TypeError('expected bytes with no null',)) + <<< Finished + vim.eval("", 2):(, TypeError('function takes exactly 1 argument (2 given)',)) + > VimStrwidth + >>> Testing StringToChars using vim.strwidth(%s) + vim.strwidth(1):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.strwidth(b"\0"):(, TypeError('expected bytes with no null',)) + vim.strwidth("\0"):(, TypeError('expected bytes with no null',)) + <<< Finished + > VimForeachRTP + vim.foreach_rtp(None):(, TypeError("'NoneType' object is not callable",)) + vim.foreach_rtp(NoArgsCall()):(, TypeError('__call__() takes exactly 1 positional argument (2 given)',)) + vim.foreach_rtp(FailingCall()):(, NotImplementedError('call',)) + vim.foreach_rtp(int, 2):(, TypeError('foreach_rtp() takes exactly one argument (2 given)',)) + > import + import xxx_no_such_module_xxx:(, ImportError('No module named xxx_no_such_module_xxx',)) + import failing_import:(, ImportError()) + import failing:(, NotImplementedError()) + > Options + >> OptionsItem + vim.options["abcQ"]:(, KeyError('abcQ',)) + vim.options[""]:(, ValueError('empty keys are not allowed',)) + >>> Testing StringToChars using vim.options[%s] + vim.options[1]:(, TypeError('expected bytes() or str() instance, but got int',)) + vim.options[b"\0"]:(, TypeError('expected bytes with no null',)) + vim.options["\0"]:(, TypeError('expected bytes with no null',)) + <<< Finished + >> OptionsContains + >>> Testing StringToChars using %s in vim.options + 1 in vim.options:(, TypeError('expected bytes() or str() instance, but got int',)) + b"\0" in vim.options:(, TypeError('expected bytes with no null',)) + "\0" in vim.options:(, TypeError('expected bytes with no null',)) + <<< Finished + > Dictionary + >> DictionaryConstructor + vim.Dictionary("abcI"):(, ValueError('expected sequence element of size 2, but got sequence of size 1',)) + >> DictionarySetattr + del d.locked:(, AttributeError('cannot delete vim.Dictionary attributes',)) + d.locked = FailingTrue():(, NotImplementedError('bool',)) + vim.vvars.locked = False:(, TypeError('cannot modify fixed dictionary',)) + d.scope = True:(, AttributeError('cannot set attribute scope',)) + d.xxx = True:(, AttributeError('cannot set attribute xxx',)) + >> _DictionaryItem + d.get("a", 2, 3):(, TypeError('function takes at most 2 arguments (3 given)',)) + >>> Testing StringToChars using d.get(%s) + d.get(1):(, TypeError('expected bytes() or str() instance, but got int',)) + d.get(b"\0"):(, TypeError('expected bytes with no null',)) + d.get("\0"):(, TypeError('expected bytes with no null',)) + <<< Finished + d.pop("a"):(, KeyError('a',)) + dl.pop("a"):(, error('dictionary is locked',)) + >> DictionaryContains + "" in d:(, ValueError('empty keys are not allowed',)) + 0 in d:(, TypeError('expected bytes() or str() instance, but got int',)) + >> DictionaryIterNext + for i in ned: ned["a"] = 1:(, RuntimeError('hashtab changed during iteration',)) + >> DictionaryAssItem + dl["b"] = 1:(, error('dictionary is locked',)) + >>> Testing StringToChars using d[%s] = 1 + d[1] = 1:(, TypeError('expected bytes() or str() instance, but got int',)) + d[b"\0"] = 1:(, TypeError('expected bytes with no null',)) + d["\0"] = 1:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d["a"] = {%s : 1} + d["a"] = {1 : 1}:(, TypeError('expected bytes() or str() instance, but got int',)) + d["a"] = {b"\0" : 1}:(, TypeError('expected bytes with no null',)) + d["a"] = {"\0" : 1}:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d["a"] = {"abcF" : {%s : 1}} + d["a"] = {"abcF" : {1 : 1}}:(, TypeError('expected bytes() or str() instance, but got int',)) + d["a"] = {"abcF" : {b"\0" : 1}}:(, TypeError('expected bytes with no null',)) + d["a"] = {"abcF" : {"\0" : 1}}:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d["a"] = {"abcF" : Mapping({%s : 1})} + d["a"] = {"abcF" : Mapping({1 : 1})}:(, TypeError('expected bytes() or str() instance, but got int',)) + d["a"] = {"abcF" : Mapping({b"\0" : 1})}:(, TypeError('expected bytes with no null',)) + d["a"] = {"abcF" : Mapping({"\0" : 1})}:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using d["a"] = {"abcF" : %s} + d["a"] = {"abcF" : FailingIter()}:(, TypeError('unable to convert FailingIter to a Vim structure',)) + d["a"] = {"abcF" : FailingIterNext()}:(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d["a"] = {"abcF" : %s} + d["a"] = {"abcF" : None}:NOT FAILED + d["a"] = {"abcF" : {b"": 1}}:(, ValueError('empty keys are not allowed',)) + d["a"] = {"abcF" : {"": 1}}:(, ValueError('empty keys are not allowed',)) + d["a"] = {"abcF" : FailingMapping()}:(, NotImplementedError('keys',)) + d["a"] = {"abcF" : FailingMappingKey()}:(, NotImplementedError('getitem:mappingkey',)) + d["a"] = {"abcF" : FailingNumber()}:(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using d["a"] = Mapping({%s : 1}) + d["a"] = Mapping({1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) + d["a"] = Mapping({b"\0" : 1}):(, TypeError('expected bytes with no null',)) + d["a"] = Mapping({"\0" : 1}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d["a"] = Mapping({"abcG" : {%s : 1}}) + d["a"] = Mapping({"abcG" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) + d["a"] = Mapping({"abcG" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) + d["a"] = Mapping({"abcG" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d["a"] = Mapping({"abcG" : Mapping({%s : 1})}) + d["a"] = Mapping({"abcG" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) + d["a"] = Mapping({"abcG" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) + d["a"] = Mapping({"abcG" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using d["a"] = Mapping({"abcG" : %s}) + d["a"] = Mapping({"abcG" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) + d["a"] = Mapping({"abcG" : FailingIterNext()}):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d["a"] = Mapping({"abcG" : %s}) + d["a"] = Mapping({"abcG" : None}):NOT FAILED + d["a"] = Mapping({"abcG" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) + d["a"] = Mapping({"abcG" : {"": 1}}):(, ValueError('empty keys are not allowed',)) + d["a"] = Mapping({"abcG" : FailingMapping()}):(, NotImplementedError('keys',)) + d["a"] = Mapping({"abcG" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) + d["a"] = Mapping({"abcG" : FailingNumber()}):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using d["a"] = %s + d["a"] = FailingIter():(, TypeError('unable to convert FailingIter to a Vim structure',)) + d["a"] = FailingIterNext():(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d["a"] = %s + d["a"] = None:NOT FAILED + d["a"] = {b"": 1}:(, ValueError('empty keys are not allowed',)) + d["a"] = {"": 1}:(, ValueError('empty keys are not allowed',)) + d["a"] = FailingMapping():(, NotImplementedError('keys',)) + d["a"] = FailingMappingKey():(, NotImplementedError('getitem:mappingkey',)) + d["a"] = FailingNumber():(, NotImplementedError('int',)) + <<< Finished + >> DictionaryUpdate + >>> kwargs + >>> iter + d.update(FailingMapping()):(, NotImplementedError('keys',)) + d.update([FailingIterNext()]):(, NotImplementedError('next',)) + d.update([FailingIterNextN(1)]):(, NotImplementedError('next N',)) + >>> Testing *Iter* using d.update(%s) + d.update(FailingIter()):(, NotImplementedError('iter',)) + d.update(FailingIterNext()):(, NotImplementedError('next',)) + <<< Finished + >>> Testing StringToChars using d.update({%s : 1}) + d.update({1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update({b"\0" : 1}):(, TypeError('expected bytes with no null',)) + d.update({"\0" : 1}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update({"abcF" : {%s : 1}}) + d.update({"abcF" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update({"abcF" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) + d.update({"abcF" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update({"abcF" : Mapping({%s : 1})}) + d.update({"abcF" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update({"abcF" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) + d.update({"abcF" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using d.update({"abcF" : %s}) + d.update({"abcF" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) + d.update({"abcF" : FailingIterNext()}):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d.update({"abcF" : %s}) + d.update({"abcF" : None}):NOT FAILED + d.update({"abcF" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) + d.update({"abcF" : {"": 1}}):(, ValueError('empty keys are not allowed',)) + d.update({"abcF" : FailingMapping()}):(, NotImplementedError('keys',)) + d.update({"abcF" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) + d.update({"abcF" : FailingNumber()}):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using d.update(Mapping({%s : 1})) + d.update(Mapping({1 : 1})):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update(Mapping({b"\0" : 1})):(, TypeError('expected bytes with no null',)) + d.update(Mapping({"\0" : 1})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update(Mapping({"abcG" : {%s : 1}})) + d.update(Mapping({"abcG" : {1 : 1}})):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update(Mapping({"abcG" : {b"\0" : 1}})):(, TypeError('expected bytes with no null',)) + d.update(Mapping({"abcG" : {"\0" : 1}})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update(Mapping({"abcG" : Mapping({%s : 1})})) + d.update(Mapping({"abcG" : Mapping({1 : 1})})):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update(Mapping({"abcG" : Mapping({b"\0" : 1})})):(, TypeError('expected bytes with no null',)) + d.update(Mapping({"abcG" : Mapping({"\0" : 1})})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using d.update(Mapping({"abcG" : %s})) + d.update(Mapping({"abcG" : FailingIter()})):(, TypeError('unable to convert FailingIter to a Vim structure',)) + d.update(Mapping({"abcG" : FailingIterNext()})):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d.update(Mapping({"abcG" : %s})) + d.update(Mapping({"abcG" : None})):NOT FAILED + d.update(Mapping({"abcG" : {b"": 1}})):(, ValueError('empty keys are not allowed',)) + d.update(Mapping({"abcG" : {"": 1}})):(, ValueError('empty keys are not allowed',)) + d.update(Mapping({"abcG" : FailingMapping()})):(, NotImplementedError('keys',)) + d.update(Mapping({"abcG" : FailingMappingKey()})):(, NotImplementedError('getitem:mappingkey',)) + d.update(Mapping({"abcG" : FailingNumber()})):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using d.update(%s) + d.update(FailingIter()):(, NotImplementedError('iter',)) + d.update(FailingIterNext()):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d.update(%s) + d.update(None):(, TypeError("'NoneType' object is not iterable",)) + d.update({b"": 1}):(, ValueError('empty keys are not allowed',)) + d.update({"": 1}):(, ValueError('empty keys are not allowed',)) + d.update(FailingMapping()):(, NotImplementedError('keys',)) + d.update(FailingMappingKey()):(, NotImplementedError('getitem:mappingkey',)) + d.update(FailingNumber()):(, TypeError("'FailingNumber' object is not iterable",)) + <<< Finished + >>> Testing StringToChars using d.update(((%s, 0),)) + d.update(((1, 0),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update(((b"\0", 0),)):(, TypeError('expected bytes with no null',)) + d.update((("\0", 0),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update((("a", {%s : 1}),)) + d.update((("a", {1 : 1}),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update((("a", {b"\0" : 1}),)):(, TypeError('expected bytes with no null',)) + d.update((("a", {"\0" : 1}),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update((("a", {"abcF" : {%s : 1}}),)) + d.update((("a", {"abcF" : {1 : 1}}),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update((("a", {"abcF" : {b"\0" : 1}}),)):(, TypeError('expected bytes with no null',)) + d.update((("a", {"abcF" : {"\0" : 1}}),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update((("a", {"abcF" : Mapping({%s : 1})}),)) + d.update((("a", {"abcF" : Mapping({1 : 1})}),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update((("a", {"abcF" : Mapping({b"\0" : 1})}),)):(, TypeError('expected bytes with no null',)) + d.update((("a", {"abcF" : Mapping({"\0" : 1})}),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using d.update((("a", {"abcF" : %s}),)) + d.update((("a", {"abcF" : FailingIter()}),)):(, TypeError('unable to convert FailingIter to a Vim structure',)) + d.update((("a", {"abcF" : FailingIterNext()}),)):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d.update((("a", {"abcF" : %s}),)) + d.update((("a", {"abcF" : None}),)):(, error("failed to add key 'a' to dictionary",)) + d.update((("a", {"abcF" : {b"": 1}}),)):(, ValueError('empty keys are not allowed',)) + d.update((("a", {"abcF" : {"": 1}}),)):(, ValueError('empty keys are not allowed',)) + d.update((("a", {"abcF" : FailingMapping()}),)):(, NotImplementedError('keys',)) + d.update((("a", {"abcF" : FailingMappingKey()}),)):(, NotImplementedError('getitem:mappingkey',)) + d.update((("a", {"abcF" : FailingNumber()}),)):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using d.update((("a", Mapping({%s : 1})),)) + d.update((("a", Mapping({1 : 1})),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update((("a", Mapping({b"\0" : 1})),)):(, TypeError('expected bytes with no null',)) + d.update((("a", Mapping({"\0" : 1})),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : {%s : 1}})),)) + d.update((("a", Mapping({"abcG" : {1 : 1}})),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update((("a", Mapping({"abcG" : {b"\0" : 1}})),)):(, TypeError('expected bytes with no null',)) + d.update((("a", Mapping({"abcG" : {"\0" : 1}})),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : Mapping({%s : 1})})),)) + d.update((("a", Mapping({"abcG" : Mapping({1 : 1})})),)):(, TypeError('expected bytes() or str() instance, but got int',)) + d.update((("a", Mapping({"abcG" : Mapping({b"\0" : 1})})),)):(, TypeError('expected bytes with no null',)) + d.update((("a", Mapping({"abcG" : Mapping({"\0" : 1})})),)):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using d.update((("a", Mapping({"abcG" : %s})),)) + d.update((("a", Mapping({"abcG" : FailingIter()})),)):(, TypeError('unable to convert FailingIter to a Vim structure',)) + d.update((("a", Mapping({"abcG" : FailingIterNext()})),)):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d.update((("a", Mapping({"abcG" : %s})),)) + d.update((("a", Mapping({"abcG" : None})),)):(, error("failed to add key 'a' to dictionary",)) + d.update((("a", Mapping({"abcG" : {b"": 1}})),)):(, ValueError('empty keys are not allowed',)) + d.update((("a", Mapping({"abcG" : {"": 1}})),)):(, ValueError('empty keys are not allowed',)) + d.update((("a", Mapping({"abcG" : FailingMapping()})),)):(, NotImplementedError('keys',)) + d.update((("a", Mapping({"abcG" : FailingMappingKey()})),)):(, NotImplementedError('getitem:mappingkey',)) + d.update((("a", Mapping({"abcG" : FailingNumber()})),)):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using d.update((("a", %s),)) + d.update((("a", FailingIter()),)):(, TypeError('unable to convert FailingIter to a Vim structure',)) + d.update((("a", FailingIterNext()),)):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using d.update((("a", %s),)) + d.update((("a", None),)):(, error("failed to add key 'a' to dictionary",)) + d.update((("a", {b"": 1}),)):(, ValueError('empty keys are not allowed',)) + d.update((("a", {"": 1}),)):(, ValueError('empty keys are not allowed',)) + d.update((("a", FailingMapping()),)):(, NotImplementedError('keys',)) + d.update((("a", FailingMappingKey()),)):(, NotImplementedError('getitem:mappingkey',)) + d.update((("a", FailingNumber()),)):(, NotImplementedError('int',)) + <<< Finished + >> DictionaryPopItem + d.popitem(1, 2):(, TypeError('popitem() takes no arguments (2 given)',)) + >> DictionaryHasKey + d.has_key():(, TypeError('has_key() takes exactly one argument (0 given)',)) + > List + >> ListConstructor + vim.List(1, 2):(, TypeError('function takes at most 1 argument (2 given)',)) + vim.List(a=1):(, TypeError('list constructor does not accept keyword arguments',)) + >>> Testing *Iter* using vim.List(%s) + vim.List(FailingIter()):(, NotImplementedError('iter',)) + vim.List(FailingIterNext()):(, NotImplementedError('next',)) + <<< Finished + >>> Testing StringToChars using vim.List([{%s : 1}]) + vim.List([{1 : 1}]):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.List([{b"\0" : 1}]):(, TypeError('expected bytes with no null',)) + vim.List([{"\0" : 1}]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using vim.List([{"abcF" : {%s : 1}}]) + vim.List([{"abcF" : {1 : 1}}]):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.List([{"abcF" : {b"\0" : 1}}]):(, TypeError('expected bytes with no null',)) + vim.List([{"abcF" : {"\0" : 1}}]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using vim.List([{"abcF" : Mapping({%s : 1})}]) + vim.List([{"abcF" : Mapping({1 : 1})}]):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.List([{"abcF" : Mapping({b"\0" : 1})}]):(, TypeError('expected bytes with no null',)) + vim.List([{"abcF" : Mapping({"\0" : 1})}]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using vim.List([{"abcF" : %s}]) + vim.List([{"abcF" : FailingIter()}]):(, TypeError('unable to convert FailingIter to a Vim structure',)) + vim.List([{"abcF" : FailingIterNext()}]):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using vim.List([{"abcF" : %s}]) + vim.List([{"abcF" : None}]):NOT FAILED + vim.List([{"abcF" : {b"": 1}}]):(, ValueError('empty keys are not allowed',)) + vim.List([{"abcF" : {"": 1}}]):(, ValueError('empty keys are not allowed',)) + vim.List([{"abcF" : FailingMapping()}]):(, NotImplementedError('keys',)) + vim.List([{"abcF" : FailingMappingKey()}]):(, NotImplementedError('getitem:mappingkey',)) + vim.List([{"abcF" : FailingNumber()}]):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using vim.List([Mapping({%s : 1})]) + vim.List([Mapping({1 : 1})]):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.List([Mapping({b"\0" : 1})]):(, TypeError('expected bytes with no null',)) + vim.List([Mapping({"\0" : 1})]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using vim.List([Mapping({"abcG" : {%s : 1}})]) + vim.List([Mapping({"abcG" : {1 : 1}})]):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.List([Mapping({"abcG" : {b"\0" : 1}})]):(, TypeError('expected bytes with no null',)) + vim.List([Mapping({"abcG" : {"\0" : 1}})]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using vim.List([Mapping({"abcG" : Mapping({%s : 1})})]) + vim.List([Mapping({"abcG" : Mapping({1 : 1})})]):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.List([Mapping({"abcG" : Mapping({b"\0" : 1})})]):(, TypeError('expected bytes with no null',)) + vim.List([Mapping({"abcG" : Mapping({"\0" : 1})})]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using vim.List([Mapping({"abcG" : %s})]) + vim.List([Mapping({"abcG" : FailingIter()})]):(, TypeError('unable to convert FailingIter to a Vim structure',)) + vim.List([Mapping({"abcG" : FailingIterNext()})]):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using vim.List([Mapping({"abcG" : %s})]) + vim.List([Mapping({"abcG" : None})]):NOT FAILED + vim.List([Mapping({"abcG" : {b"": 1}})]):(, ValueError('empty keys are not allowed',)) + vim.List([Mapping({"abcG" : {"": 1}})]):(, ValueError('empty keys are not allowed',)) + vim.List([Mapping({"abcG" : FailingMapping()})]):(, NotImplementedError('keys',)) + vim.List([Mapping({"abcG" : FailingMappingKey()})]):(, NotImplementedError('getitem:mappingkey',)) + vim.List([Mapping({"abcG" : FailingNumber()})]):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using vim.List([%s]) + vim.List([FailingIter()]):(, TypeError('unable to convert FailingIter to a Vim structure',)) + vim.List([FailingIterNext()]):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using vim.List([%s]) + vim.List([None]):NOT FAILED + vim.List([{b"": 1}]):(, ValueError('empty keys are not allowed',)) + vim.List([{"": 1}]):(, ValueError('empty keys are not allowed',)) + vim.List([FailingMapping()]):(, NotImplementedError('keys',)) + vim.List([FailingMappingKey()]):(, NotImplementedError('getitem:mappingkey',)) + vim.List([FailingNumber()]):(, NotImplementedError('int',)) + <<< Finished + >> ListItem + l[1000]:(, IndexError('list index out of range',)) + >> ListAssItem + ll[1] = 2:(, error('list is locked',)) + l[1000] = 3:(, IndexError('list index out of range',)) + >> ListAssSlice + ll[1:100] = "abcJ":(, error('list is locked',)) + >>> Testing *Iter* using l[:] = %s + l[:] = FailingIter():(, NotImplementedError('iter',)) + l[:] = FailingIterNext():(, NotImplementedError('next',)) + <<< Finished + nel[1:10:2] = "abcK":(, ValueError('attempt to assign sequence of size greater than 2 to extended slice',)) + (b'a', b'b', b'c', b'O') + nel[1:10:2] = "a":(, ValueError('attempt to assign sequence of size 1 to extended slice of size 2',)) + (b'a', b'b', b'c', b'O') + nel[1:1:-1] = "a":(, ValueError('attempt to assign sequence of size greater than 0 to extended slice',)) + (b'a', b'b', b'c', b'O') + nel[:] = FailingIterNextN(2):(, NotImplementedError('next N',)) + (b'a', b'b', b'c', b'O') + >>> Testing StringToChars using l[:] = [{%s : 1}] + l[:] = [{1 : 1}]:(, TypeError('expected bytes() or str() instance, but got int',)) + l[:] = [{b"\0" : 1}]:(, TypeError('expected bytes with no null',)) + l[:] = [{"\0" : 1}]:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l[:] = [{"abcF" : {%s : 1}}] + l[:] = [{"abcF" : {1 : 1}}]:(, TypeError('expected bytes() or str() instance, but got int',)) + l[:] = [{"abcF" : {b"\0" : 1}}]:(, TypeError('expected bytes with no null',)) + l[:] = [{"abcF" : {"\0" : 1}}]:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l[:] = [{"abcF" : Mapping({%s : 1})}] + l[:] = [{"abcF" : Mapping({1 : 1})}]:(, TypeError('expected bytes() or str() instance, but got int',)) + l[:] = [{"abcF" : Mapping({b"\0" : 1})}]:(, TypeError('expected bytes with no null',)) + l[:] = [{"abcF" : Mapping({"\0" : 1})}]:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using l[:] = [{"abcF" : %s}] + l[:] = [{"abcF" : FailingIter()}]:(, TypeError('unable to convert FailingIter to a Vim structure',)) + l[:] = [{"abcF" : FailingIterNext()}]:(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using l[:] = [{"abcF" : %s}] + l[:] = [{"abcF" : None}]:NOT FAILED + l[:] = [{"abcF" : {b"": 1}}]:(, ValueError('empty keys are not allowed',)) + l[:] = [{"abcF" : {"": 1}}]:(, ValueError('empty keys are not allowed',)) + l[:] = [{"abcF" : FailingMapping()}]:(, NotImplementedError('keys',)) + l[:] = [{"abcF" : FailingMappingKey()}]:(, NotImplementedError('getitem:mappingkey',)) + l[:] = [{"abcF" : FailingNumber()}]:(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using l[:] = [Mapping({%s : 1})] + l[:] = [Mapping({1 : 1})]:(, TypeError('expected bytes() or str() instance, but got int',)) + l[:] = [Mapping({b"\0" : 1})]:(, TypeError('expected bytes with no null',)) + l[:] = [Mapping({"\0" : 1})]:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l[:] = [Mapping({"abcG" : {%s : 1}})] + l[:] = [Mapping({"abcG" : {1 : 1}})]:(, TypeError('expected bytes() or str() instance, but got int',)) + l[:] = [Mapping({"abcG" : {b"\0" : 1}})]:(, TypeError('expected bytes with no null',)) + l[:] = [Mapping({"abcG" : {"\0" : 1}})]:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l[:] = [Mapping({"abcG" : Mapping({%s : 1})})] + l[:] = [Mapping({"abcG" : Mapping({1 : 1})})]:(, TypeError('expected bytes() or str() instance, but got int',)) + l[:] = [Mapping({"abcG" : Mapping({b"\0" : 1})})]:(, TypeError('expected bytes with no null',)) + l[:] = [Mapping({"abcG" : Mapping({"\0" : 1})})]:(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using l[:] = [Mapping({"abcG" : %s})] + l[:] = [Mapping({"abcG" : FailingIter()})]:(, TypeError('unable to convert FailingIter to a Vim structure',)) + l[:] = [Mapping({"abcG" : FailingIterNext()})]:(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using l[:] = [Mapping({"abcG" : %s})] + l[:] = [Mapping({"abcG" : None})]:NOT FAILED + l[:] = [Mapping({"abcG" : {b"": 1}})]:(, ValueError('empty keys are not allowed',)) + l[:] = [Mapping({"abcG" : {"": 1}})]:(, ValueError('empty keys are not allowed',)) + l[:] = [Mapping({"abcG" : FailingMapping()})]:(, NotImplementedError('keys',)) + l[:] = [Mapping({"abcG" : FailingMappingKey()})]:(, NotImplementedError('getitem:mappingkey',)) + l[:] = [Mapping({"abcG" : FailingNumber()})]:(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using l[:] = [%s] + l[:] = [FailingIter()]:(, TypeError('unable to convert FailingIter to a Vim structure',)) + l[:] = [FailingIterNext()]:(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using l[:] = [%s] + l[:] = [None]:NOT FAILED + l[:] = [{b"": 1}]:(, ValueError('empty keys are not allowed',)) + l[:] = [{"": 1}]:(, ValueError('empty keys are not allowed',)) + l[:] = [FailingMapping()]:(, NotImplementedError('keys',)) + l[:] = [FailingMappingKey()]:(, NotImplementedError('getitem:mappingkey',)) + l[:] = [FailingNumber()]:(, NotImplementedError('int',)) + <<< Finished + >> ListConcatInPlace + >>> Testing *Iter* using l.extend(%s) + l.extend(FailingIter()):(, NotImplementedError('iter',)) + l.extend(FailingIterNext()):(, NotImplementedError('next',)) + <<< Finished + >>> Testing StringToChars using l.extend([{%s : 1}]) + l.extend([{1 : 1}]):(, TypeError('expected bytes() or str() instance, but got int',)) + l.extend([{b"\0" : 1}]):(, TypeError('expected bytes with no null',)) + l.extend([{"\0" : 1}]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l.extend([{"abcF" : {%s : 1}}]) + l.extend([{"abcF" : {1 : 1}}]):(, TypeError('expected bytes() or str() instance, but got int',)) + l.extend([{"abcF" : {b"\0" : 1}}]):(, TypeError('expected bytes with no null',)) + l.extend([{"abcF" : {"\0" : 1}}]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l.extend([{"abcF" : Mapping({%s : 1})}]) + l.extend([{"abcF" : Mapping({1 : 1})}]):(, TypeError('expected bytes() or str() instance, but got int',)) + l.extend([{"abcF" : Mapping({b"\0" : 1})}]):(, TypeError('expected bytes with no null',)) + l.extend([{"abcF" : Mapping({"\0" : 1})}]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using l.extend([{"abcF" : %s}]) + l.extend([{"abcF" : FailingIter()}]):(, TypeError('unable to convert FailingIter to a Vim structure',)) + l.extend([{"abcF" : FailingIterNext()}]):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using l.extend([{"abcF" : %s}]) + l.extend([{"abcF" : None}]):NOT FAILED + l.extend([{"abcF" : {b"": 1}}]):(, ValueError('empty keys are not allowed',)) + l.extend([{"abcF" : {"": 1}}]):(, ValueError('empty keys are not allowed',)) + l.extend([{"abcF" : FailingMapping()}]):(, NotImplementedError('keys',)) + l.extend([{"abcF" : FailingMappingKey()}]):(, NotImplementedError('getitem:mappingkey',)) + l.extend([{"abcF" : FailingNumber()}]):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using l.extend([Mapping({%s : 1})]) + l.extend([Mapping({1 : 1})]):(, TypeError('expected bytes() or str() instance, but got int',)) + l.extend([Mapping({b"\0" : 1})]):(, TypeError('expected bytes with no null',)) + l.extend([Mapping({"\0" : 1})]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l.extend([Mapping({"abcG" : {%s : 1}})]) + l.extend([Mapping({"abcG" : {1 : 1}})]):(, TypeError('expected bytes() or str() instance, but got int',)) + l.extend([Mapping({"abcG" : {b"\0" : 1}})]):(, TypeError('expected bytes with no null',)) + l.extend([Mapping({"abcG" : {"\0" : 1}})]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using l.extend([Mapping({"abcG" : Mapping({%s : 1})})]) + l.extend([Mapping({"abcG" : Mapping({1 : 1})})]):(, TypeError('expected bytes() or str() instance, but got int',)) + l.extend([Mapping({"abcG" : Mapping({b"\0" : 1})})]):(, TypeError('expected bytes with no null',)) + l.extend([Mapping({"abcG" : Mapping({"\0" : 1})})]):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using l.extend([Mapping({"abcG" : %s})]) + l.extend([Mapping({"abcG" : FailingIter()})]):(, TypeError('unable to convert FailingIter to a Vim structure',)) + l.extend([Mapping({"abcG" : FailingIterNext()})]):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using l.extend([Mapping({"abcG" : %s})]) + l.extend([Mapping({"abcG" : None})]):NOT FAILED + l.extend([Mapping({"abcG" : {b"": 1}})]):(, ValueError('empty keys are not allowed',)) + l.extend([Mapping({"abcG" : {"": 1}})]):(, ValueError('empty keys are not allowed',)) + l.extend([Mapping({"abcG" : FailingMapping()})]):(, NotImplementedError('keys',)) + l.extend([Mapping({"abcG" : FailingMappingKey()})]):(, NotImplementedError('getitem:mappingkey',)) + l.extend([Mapping({"abcG" : FailingNumber()})]):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using l.extend([%s]) + l.extend([FailingIter()]):(, TypeError('unable to convert FailingIter to a Vim structure',)) + l.extend([FailingIterNext()]):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using l.extend([%s]) + l.extend([None]):NOT FAILED + l.extend([{b"": 1}]):(, ValueError('empty keys are not allowed',)) + l.extend([{"": 1}]):(, ValueError('empty keys are not allowed',)) + l.extend([FailingMapping()]):(, NotImplementedError('keys',)) + l.extend([FailingMappingKey()]):(, NotImplementedError('getitem:mappingkey',)) + l.extend([FailingNumber()]):(, NotImplementedError('int',)) + <<< Finished + >> ListSetattr + del l.locked:(, AttributeError('cannot delete vim.List attributes',)) + l.locked = FailingTrue():(, NotImplementedError('bool',)) + l.xxx = True:(, AttributeError('cannot set attribute xxx',)) + > Function + >> FunctionConstructor + >>> FunctionConstructor + vim.Function("123"):(, ValueError('unnamed function 123 does not exist',)) + vim.Function("xxx_non_existent_function_xxx"):(, ValueError('function xxx_non_existent_function_xxx does not exist',)) + vim.Function("xxx#non#existent#function#xxx"):NOT FAILED + vim.Function("xxx_non_existent_function_xxx2", args=[]):(, ValueError('function xxx_non_existent_function_xxx2 does not exist',)) + vim.Function("xxx_non_existent_function_xxx3", self={}):(, ValueError('function xxx_non_existent_function_xxx3 does not exist',)) + vim.Function("xxx_non_existent_function_xxx4", args=[], self={}):(, ValueError('function xxx_non_existent_function_xxx4 does not exist',)) + >>> FunctionNew + vim.Function("tr", self="abcFuncSelf"):(, AttributeError('keys',)) + vim.Function("tr", args=427423):(, TypeError('unable to convert int to a Vim list',)) + vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2"):(, AttributeError('keys',)) + vim.Function(self="abcFuncSelf2", args="abcFuncArgs2"):(, AttributeError('keys',)) + vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2"):(, AttributeError('keys',)) + vim.Function("tr", ""):(, TypeError('function takes exactly 1 argument (2 given)',)) + >> FunctionCall + >>> Testing StringToChars using f({%s : 1}) + f({1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) + f({b"\0" : 1}):(, TypeError('expected bytes with no null',)) + f({"\0" : 1}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using f({"abcF" : {%s : 1}}) + f({"abcF" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) + f({"abcF" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) + f({"abcF" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using f({"abcF" : Mapping({%s : 1})}) + f({"abcF" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) + f({"abcF" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) + f({"abcF" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using f({"abcF" : %s}) + f({"abcF" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) + f({"abcF" : FailingIterNext()}):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using f({"abcF" : %s}) + f({"abcF" : None}):NOT FAILED + f({"abcF" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) + f({"abcF" : {"": 1}}):(, ValueError('empty keys are not allowed',)) + f({"abcF" : FailingMapping()}):(, NotImplementedError('keys',)) + f({"abcF" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) + f({"abcF" : FailingNumber()}):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using f(Mapping({%s : 1})) + f(Mapping({1 : 1})):(, TypeError('expected bytes() or str() instance, but got int',)) + f(Mapping({b"\0" : 1})):(, TypeError('expected bytes with no null',)) + f(Mapping({"\0" : 1})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using f(Mapping({"abcG" : {%s : 1}})) + f(Mapping({"abcG" : {1 : 1}})):(, TypeError('expected bytes() or str() instance, but got int',)) + f(Mapping({"abcG" : {b"\0" : 1}})):(, TypeError('expected bytes with no null',)) + f(Mapping({"abcG" : {"\0" : 1}})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using f(Mapping({"abcG" : Mapping({%s : 1})})) + f(Mapping({"abcG" : Mapping({1 : 1})})):(, TypeError('expected bytes() or str() instance, but got int',)) + f(Mapping({"abcG" : Mapping({b"\0" : 1})})):(, TypeError('expected bytes with no null',)) + f(Mapping({"abcG" : Mapping({"\0" : 1})})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using f(Mapping({"abcG" : %s})) + f(Mapping({"abcG" : FailingIter()})):(, TypeError('unable to convert FailingIter to a Vim structure',)) + f(Mapping({"abcG" : FailingIterNext()})):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using f(Mapping({"abcG" : %s})) + f(Mapping({"abcG" : None})):NOT FAILED + f(Mapping({"abcG" : {b"": 1}})):(, ValueError('empty keys are not allowed',)) + f(Mapping({"abcG" : {"": 1}})):(, ValueError('empty keys are not allowed',)) + f(Mapping({"abcG" : FailingMapping()})):(, NotImplementedError('keys',)) + f(Mapping({"abcG" : FailingMappingKey()})):(, NotImplementedError('getitem:mappingkey',)) + f(Mapping({"abcG" : FailingNumber()})):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using f(%s) + f(FailingIter()):(, TypeError('unable to convert FailingIter to a Vim structure',)) + f(FailingIterNext()):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using f(%s) + f(None):NOT FAILED + f({b"": 1}):(, ValueError('empty keys are not allowed',)) + f({"": 1}):(, ValueError('empty keys are not allowed',)) + f(FailingMapping()):(, NotImplementedError('keys',)) + f(FailingMappingKey()):(, NotImplementedError('getitem:mappingkey',)) + f(FailingNumber()):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using fd(self={%s : 1}) + fd(self={1 : 1}):(, TypeError('expected bytes() or str() instance, but got int',)) + fd(self={b"\0" : 1}):(, TypeError('expected bytes with no null',)) + fd(self={"\0" : 1}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using fd(self={"abcF" : {%s : 1}}) + fd(self={"abcF" : {1 : 1}}):(, TypeError('expected bytes() or str() instance, but got int',)) + fd(self={"abcF" : {b"\0" : 1}}):(, TypeError('expected bytes with no null',)) + fd(self={"abcF" : {"\0" : 1}}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using fd(self={"abcF" : Mapping({%s : 1})}) + fd(self={"abcF" : Mapping({1 : 1})}):(, TypeError('expected bytes() or str() instance, but got int',)) + fd(self={"abcF" : Mapping({b"\0" : 1})}):(, TypeError('expected bytes with no null',)) + fd(self={"abcF" : Mapping({"\0" : 1})}):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using fd(self={"abcF" : %s}) + fd(self={"abcF" : FailingIter()}):(, TypeError('unable to convert FailingIter to a Vim structure',)) + fd(self={"abcF" : FailingIterNext()}):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using fd(self={"abcF" : %s}) + fd(self={"abcF" : None}):NOT FAILED + fd(self={"abcF" : {b"": 1}}):(, ValueError('empty keys are not allowed',)) + fd(self={"abcF" : {"": 1}}):(, ValueError('empty keys are not allowed',)) + fd(self={"abcF" : FailingMapping()}):(, NotImplementedError('keys',)) + fd(self={"abcF" : FailingMappingKey()}):(, NotImplementedError('getitem:mappingkey',)) + fd(self={"abcF" : FailingNumber()}):(, NotImplementedError('int',)) + <<< Finished + >>> Testing StringToChars using fd(self=Mapping({%s : 1})) + fd(self=Mapping({1 : 1})):(, TypeError('expected bytes() or str() instance, but got int',)) + fd(self=Mapping({b"\0" : 1})):(, TypeError('expected bytes with no null',)) + fd(self=Mapping({"\0" : 1})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using fd(self=Mapping({"abcG" : {%s : 1}})) + fd(self=Mapping({"abcG" : {1 : 1}})):(, TypeError('expected bytes() or str() instance, but got int',)) + fd(self=Mapping({"abcG" : {b"\0" : 1}})):(, TypeError('expected bytes with no null',)) + fd(self=Mapping({"abcG" : {"\0" : 1}})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing StringToChars using fd(self=Mapping({"abcG" : Mapping({%s : 1})})) + fd(self=Mapping({"abcG" : Mapping({1 : 1})})):(, TypeError('expected bytes() or str() instance, but got int',)) + fd(self=Mapping({"abcG" : Mapping({b"\0" : 1})})):(, TypeError('expected bytes with no null',)) + fd(self=Mapping({"abcG" : Mapping({"\0" : 1})})):(, TypeError('expected bytes with no null',)) + <<< Finished + >>> Testing *Iter* using fd(self=Mapping({"abcG" : %s})) + fd(self=Mapping({"abcG" : FailingIter()})):(, TypeError('unable to convert FailingIter to a Vim structure',)) + fd(self=Mapping({"abcG" : FailingIterNext()})):(, NotImplementedError('next',)) + <<< Finished + >>> Testing ConvertFromPyObject using fd(self=Mapping({"abcG" : %s})) + fd(self=Mapping({"abcG" : None})):NOT FAILED + fd(self=Mapping({"abcG" : {b"": 1}})):(, ValueError('empty keys are not allowed',)) + fd(self=Mapping({"abcG" : {"": 1}})):(, ValueError('empty keys are not allowed',)) + fd(self=Mapping({"abcG" : FailingMapping()})):(, NotImplementedError('keys',)) + fd(self=Mapping({"abcG" : FailingMappingKey()})):(, NotImplementedError('getitem:mappingkey',)) + fd(self=Mapping({"abcG" : FailingNumber()})):(, NotImplementedError('int',)) + <<< Finished + >>> Testing *Iter* using fd(self=%s) + fd(self=FailingIter()):(, TypeError('unable to convert FailingIter to a Vim dictionary',)) + fd(self=FailingIterNext()):(, TypeError('unable to convert FailingIterNext to a Vim dictionary',)) + <<< Finished + >>> Testing ConvertFromPyObject using fd(self=%s) + fd(self=None):(, TypeError('unable to convert NoneType to a Vim dictionary',)) + fd(self={b"": 1}):(, ValueError('empty keys are not allowed',)) + fd(self={"": 1}):(, ValueError('empty keys are not allowed',)) + fd(self=FailingMapping()):(, NotImplementedError('keys',)) + fd(self=FailingMappingKey()):(, NotImplementedError('getitem:mappingkey',)) + fd(self=FailingNumber()):(, TypeError('unable to convert FailingNumber to a Vim dictionary',)) + <<< Finished + >>> Testing ConvertFromPyMapping using fd(self=%s) + fd(self=[]):(, AttributeError('keys',)) + <<< Finished + > TabPage + >> TabPageAttr + vim.current.tabpage.xxx:(, AttributeError("'vim.tabpage' object has no attribute 'xxx'",)) + > TabList + >> TabListItem + vim.tabpages[1000]:(, IndexError('no such tab page',)) + > Window + >> WindowAttr + vim.current.window.xxx:(, AttributeError("'vim.window' object has no attribute 'xxx'",)) + >> WindowSetattr + vim.current.window.buffer = 0:(, TypeError('readonly attribute: buffer',)) + vim.current.window.cursor = (100000000, 100000000):(, error('cursor position outside buffer',)) + vim.current.window.cursor = True:(, TypeError('argument must be 2-item sequence, not bool',)) + >>> Testing NumberToLong using vim.current.window.height = %s + vim.current.window.height = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) + vim.current.window.height = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) + vim.current.window.height = -1:(, ValueError('number must be greater or equal to zero',)) + <<< Finished + >>> Testing NumberToLong using vim.current.window.width = %s + vim.current.window.width = []:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) + vim.current.window.width = None:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) + vim.current.window.width = -1:(, ValueError('number must be greater or equal to zero',)) + <<< Finished + vim.current.window.xxxxxx = True:(, AttributeError('xxxxxx',)) + > WinList + >> WinListItem + vim.windows[1000]:(, IndexError('no such window',)) + > Buffer + >> StringToLine (indirect) + vim.current.buffer[0] = "\na":(, error('string cannot contain newlines',)) + vim.current.buffer[0] = b"\na":(, error('string cannot contain newlines',)) + >> SetBufferLine (indirect) + vim.current.buffer[0] = True:(, TypeError('bad argument type for built-in operation',)) + >> SetBufferLineList (indirect) + vim.current.buffer[:] = True:(, TypeError('bad argument type for built-in operation',)) + vim.current.buffer[:] = ["\na", "bc"]:(, error('string cannot contain newlines',)) + >> InsertBufferLines (indirect) + vim.current.buffer.append(None):(, TypeError('bad argument type for built-in operation',)) + vim.current.buffer.append(["\na", "bc"]):(, error('string cannot contain newlines',)) + vim.current.buffer.append("\nbc"):(, error('string cannot contain newlines',)) + >> RBItem + vim.current.buffer[100000000]:(, IndexError('line number out of range',)) + >> RBAsItem + vim.current.buffer[100000000] = "":(, IndexError('line number out of range',)) + >> BufferAttr + vim.current.buffer.xxx:(, AttributeError("'vim.buffer' object has no attribute 'xxx'",)) + >> BufferSetattr + vim.current.buffer.name = True:(, TypeError('expected bytes() or str() instance, but got bool',)) + vim.current.buffer.xxx = True:(, AttributeError('xxx',)) + >> BufferMark + vim.current.buffer.mark(0):(, TypeError('expected bytes() or str() instance, but got int',)) + vim.current.buffer.mark("abcM"):(, ValueError('mark name must be a single character',)) + vim.current.buffer.mark("!"):(, error('invalid mark name',)) + >> BufferRange + vim.current.buffer.range(1, 2, 3):(, TypeError('function takes exactly 2 arguments (3 given)',)) + > BufMap + >> BufMapItem + vim.buffers[100000000]:(, KeyError(100000000,)) + >>> Testing NumberToLong using vim.buffers[%s] + vim.buffers[[]]:(, TypeError('expected int() or something supporting coercing to int(), but got list',)) + vim.buffers[None]:(, TypeError('expected int() or something supporting coercing to int(), but got NoneType',)) + vim.buffers[-1]:(, ValueError('number must be greater than zero',)) + vim.buffers[0]:(, ValueError('number must be greater than zero',)) + <<< Finished + > Current + >> CurrentGetattr + vim.current.xxx:(, AttributeError("'vim.currentdata' object has no attribute 'xxx'",)) + >> CurrentSetattr + vim.current.line = True:(, TypeError('bad argument type for built-in operation',)) + vim.current.buffer = True:(, TypeError('expected vim.Buffer object, but got bool',)) + vim.current.window = True:(, TypeError('expected vim.Window object, but got bool',)) + vim.current.tabpage = True:(, TypeError('expected vim.TabPage object, but got bool',)) + vim.current.xxx = True:(, AttributeError('xxx',)) + END + + call assert_equal(expected, getline(2, '$')) + close! + endfunc + + " Test import + func Test_python3_import() + new + py3 cb = vim.current.buffer + + py3 << trim EOF + sys.path.insert(0, os.path.join(os.getcwd(), 'python_before')) + sys.path.append(os.path.join(os.getcwd(), 'python_after')) + vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\') + l = [] + def callback(path): + l.append(os.path.relpath(path)) + vim.foreach_rtp(callback) + cb.append(repr(l)) + del l + def callback(path): + return os.path.relpath(path) + cb.append(repr(vim.foreach_rtp(callback))) + del callback + from module import dir as d + from modulex import ddir + cb.append(d + ',' + ddir) + import before + cb.append(before.dir) + import after + cb.append(after.dir) + import topmodule as tm + import topmodule.submodule as tms + import topmodule.submodule.subsubmodule.subsubsubmodule as tmsss + cb.append(tm.__file__.replace(os.path.sep, '/')[-len('modulex/topmodule/__init__.py'):]) + cb.append(tms.__file__.replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/__init__.py'):]) + cb.append(tmsss.__file__.replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/subsubmodule/subsubsubmodule.py'):]) + + del before + del after + del d + del ddir + del tm + del tms + del tmsss + EOF + + let expected =<< trim END + ['.'] + '.' + 3,xx + before + after + pythonx/topmodule/__init__.py + pythonx/topmodule/submodule/__init__.py + pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py + END + call assert_equal(expected, getline(2, '$')) + close! + endfunc + + " Test exceptions + func Test_python3_exception() + func Exe(e) + execute a:e + endfunc + + new + py3 cb = vim.current.buffer + + py3 << trim EOF + Exe = vim.bindeval('function("Exe")') + ee('vim.command("throw \'abcN\'")') + ee('Exe("throw \'def\'")') + ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")') + ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")') + ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")') + ee('vim.eval("xxx_unknown_function_xxx()")') + ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")') + del Exe + EOF + delfunction Exe + + let expected =<< trim END + vim.command("throw 'abcN'"):(, error('abcN',)) + Exe("throw 'def'"):(, error('def',)) + vim.eval("Exe('throw ''ghi''')"):(, error('ghi',)) + vim.eval("Exe('echoerr ''jkl''')"):(, error('Vim(echoerr):jkl',)) + vim.eval("Exe('xxx_non_existent_command_xxx')"):(, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) + vim.eval("xxx_unknown_function_xxx()"):(, error('Vim:E117: Unknown function: xxx_unknown_function_xxx',)) + vim.bindeval("Exe('xxx_non_existent_command_xxx')"):(, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)) + END + call assert_equal(expected, getline(2, '$')) + close! + endfunc + + " Regression: interrupting vim.command propagates to next vim.command + func Test_python3_keyboard_interrupt() + new + py3 cb = vim.current.buffer + py3 << trim EOF + def test_keyboard_interrupt(): + try: + vim.command('while 1 | endwhile') + except KeyboardInterrupt: + cb.append('Caught KeyboardInterrupt') + except Exception: + cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info())) + else: + cb.append('!!!!!!!! No exception') + try: + vim.command('$ put =\'Running :put\'') + except KeyboardInterrupt: + cb.append('!!!!!!!! Caught KeyboardInterrupt') + except Exception: + cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info())) + else: + cb.append('No exception') + EOF + + debuggreedy + call inputsave() + call feedkeys("s\ns\ns\ns\nq\n") + redir => output + debug silent! py3 test_keyboard_interrupt() + redir END + 0 debuggreedy + call inputrestore() + py3 del test_keyboard_interrupt + + let expected =<< trim END + Caught KeyboardInterrupt + Running :put + No exception + END + call assert_equal(expected, getline(2, '$')) + call assert_equal('', output) + close! + endfunc + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.1122/src/version.c 2020-07-03 21:09:48.865268894 +0200 --- src/version.c 2020-07-03 21:14:50.880391036 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1123, /**/ -- Any resemblance between the above views and those of my employer, my terminal, or the view out my window are purely coincidental. Any resemblance between the above and my own views is non-deterministic. The question of the existence of views in the absence of anyone to hold them is left as an exercise for the reader. The question of the existence of the reader is left as an exercise for the second god coefficient. (A discussion of non-orthogonal, non-integral polytheism is beyond the scope of this article.) (Ralph Jennings) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///