diff options
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/testdir/Make_all.mak | 1 | ||||
-rw-r--r-- | src/testdir/Make_vms.mms | 2 | ||||
-rw-r--r-- | src/testdir/test86.in | 1711 | ||||
-rw-r--r-- | src/testdir/test86.ok | 1445 | ||||
-rw-r--r-- | src/testdir/test_python2.vim | 3372 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 3368 insertions, 3167 deletions
diff --git a/src/Makefile b/src/Makefile index 105820a93e..9166662970 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2308,7 +2308,7 @@ test1 \ test42 test44 test49 \ test52 test59 \ test70 \ - test86 test87 \ + test87 \ test99: cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE) diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index a0884cdc87..14062d8396 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -21,7 +21,6 @@ SCRIPTS_ALL = \ # Tests that run on most systems, but not on Amiga. SCRIPTS_MORE1 = \ test52.out \ - test86.out \ test87.out diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms index a89bb244fd..ff6deb4657 100644 --- a/src/testdir/Make_vms.mms +++ b/src/testdir/Make_vms.mms @@ -116,7 +116,7 @@ SCRIPT_GDIFF = test47.out .ENDIF .IFDEF HAVE_PYTHON -SCRIPT_PYTHON = test86.out test87.out +SCRIPT_PYTHON = test87.out .ENDIF .in.out : diff --git a/src/testdir/test86.in b/src/testdir/test86.in deleted file mode 100644 index e24c13d1ca..0000000000 --- a/src/testdir/test86.in +++ /dev/null @@ -1,1711 +0,0 @@ -Tests for various python features. vim: set ft=vim : - -NOTE: This will cause errors when run under valgrind. -This would require recompiling Python with: - ./configure --without-pymalloc -See http://svn.python.org/view/python/trunk/Misc/README.valgrind?view=markup - -STARTTEST -:so small.vim -:set encoding=latin1 -:set noswapfile -:if !has('python') || !has('quickfix') | e! test.ok | wq! test.out | endif -:lang C -:fun Test() -:py import vim -:py cb = vim.current.buffer -:let l = [] -:py l=vim.bindeval('l') -:py f=vim.bindeval('function("strlen")') -:" Extending List directly with different types -:py l.extend([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 -:py l[0]=0 -:$put =string(l) -:py l[-2]=f -:$put =string(l) -:" -:" Extending Dictionary directly with different types -:let d = {} -:fun d.f() -: return 1 -:endfun -py << 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() - cmpfun = lambda a, b: cmp(repr(a), repr(b)) - dk.sort(cmpfun) - dv.sort(cmpfun) - di.sort(cmpfun) -EOF -:$put =pyeval('d[''f''](self={})') -:$put =pyeval('repr(dk)') -:$put =substitute(pyeval('repr(dv)'),'0x\x\+','','g') -:$put =substitute(pyeval('repr(di)'),'0x\x\+','','g') -:for [key, Val] in sort(items(d)) -: $put =string(key) . ' : ' . string(Val) -: unlet key Val -:endfor -:py del dk -:py del di -:py del dv -:" -:" removing items with del -:py del l[2] -:$put =string(l) -:let l = range(8) -:py l=vim.bindeval('l') -:try -: py del l[:3] -: py del l[1:] -:catch -: $put =v:exception -:endtry -:$put =string(l) -:" -:py del d['-1'] -:py del d['f'] -:$put =string(pyeval('d.get(''b'', 1)')) -:$put =string(pyeval('d.pop(''b'')')) -:$put =string(pyeval('d.get(''b'', 1)')) -:$put =string(pyeval('d.pop(''1'', 2)')) -:$put =string(pyeval('d.pop(''1'', 2)')) -:$put =pyeval('repr(d.has_key(''0''))') -:$put =pyeval('repr(d.has_key(''1''))') -:$put =pyeval('repr(''0'' in d)') -:$put =pyeval('repr(''1'' in d)') -:$put =pyeval('repr(list(iter(d)))') -:$put =string(d) -:$put =pyeval('repr(d.popitem())') -:$put =pyeval('repr(d.get(''0''))') -:$put =pyeval('repr(list(iter(d)))') -:" -:" removing items out of range: silently skip items that don't exist -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:" The following two ranges delete nothing as they match empty list: -:py del l[2:1] -:$put =string(l) -:py del l[2:2] -:$put =string(l) -:py del l[2:3] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[2:4] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[2:5] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[2:6] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:" The following two ranges delete nothing as they match empty list: -:py del l[-1:2] -:$put =string(l) -:py del l[-2:2] -:$put =string(l) -:py del l[-3:2] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[-4:2] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[-5:2] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[-6:2] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[::2] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[3:0:-2] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py del l[2:4:-2] -:$put =string(l) -:" -:" Slice assignment to a list -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[0:0]=['a'] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[1:2]=['b'] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[2:4]=['c'] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[4:4]=['d'] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[-1:2]=['e'] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[-10:2]=['f'] -:$put =string(l) -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:py l[2:-10]=['g'] -:$put =string(l) -:let l = [] -:py l=vim.bindeval('l') -:py l[0:0]=['h'] -:$put =string(l) -:let l = range(8) -:py l=vim.bindeval('l') -:py l[2:6:2] = [10, 20] -:$put =string(l) -:let l = range(8) -:py l=vim.bindeval('l') -:py l[6:2:-2] = [10, 20] -:$put =string(l) -:let l = range(8) -:py l=vim.bindeval('l') -:py l[6:2] = () -:$put =string(l) -:let l = range(8) -:py l=vim.bindeval('l') -:py l[6:2:1] = () -:$put =string(l) -:let l = range(8) -:py l=vim.bindeval('l') -:py l[2:2:1] = () -:$put =string(l) -:" -:" Locked variables -:let l = [0, 1, 2, 3] -:py l=vim.bindeval('l') -:lockvar! l -py << 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 -py << trim EOF - import sys - def ee(expr, g=globals(), l=locals()): - try: - exec(expr, g, l) - except: - ei = sys.exc_info() - msg = emsg(ei) - msg = msg.replace('TypeError:(\'argument 1 ', 'TypeError:(\'') - if expr.find('None') > -1: - msg = msg.replace('TypeError:(\'iteration over non-sequence\',)', - 'TypeError:("\'NoneType\' object is not iterable",)') - if expr.find('FailingNumber') > -1: - msg = msg.replace(', not \'FailingNumber\'', '').replace('"', '\'') - msg = msg.replace('TypeError:(\'iteration over non-sequence\',)', - 'TypeError:("\'FailingNumber\' object is not iterable",)') - if msg.find('(\'\'') > -1 or msg.find('(\'can\'t') > -1: - msg = msg.replace('(\'', '("').replace('\',)', '",)') - # 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 expr == 'fd(self=[])': - # HACK: PyMapping_Check changed meaning - msg = msg.replace('AttributeError:(\'keys\',)', - 'TypeError:(\'unable to convert list to vim dictionary\',)') - vim.current.buffer.append(expr + ':' + msg) - else: - vim.current.buffer.append(expr + ':NOT FAILED') -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')] -:py l=vim.bindeval('l') -:py l.extend(list(l[0](1, 2, 3))) -:$put =string(l) -:py l.extend(list(l[1](1, 2, 3, self={'a': 'b'}))) -:$put =string(l) -:py l.extend([l[0].name]) -:$put =string(l) -:py ee('l[1](1, 2, 3)') -:py f=l[0] -:delfunction New -:py ee('f(1, 2, 3)') -:if has('float') -: let l=[0.0] -: py l=vim.bindeval('l') -: py l.extend([0.0]) -: $put =string(l) -:else -: $put ='[0.0, 0.0]' -:endif -:let messages=[] -:delfunction DictNew -py << trim EOF - d=vim.bindeval('{}') - m=vim.bindeval('messages') - def em(expr, g=globals(), l=locals()): - try: - exec(expr, g, l) - except: - m.extend([sys.exc_type.__name__]) - - em('d["abc1"]') - em('d["abc1"]="\\0"') - em('d["abc1"]=vim') - em('d[""]=1') - em('d["a\\0b"]=1') - em('d[u"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 'py '.name.'=vim.bindeval("'.s.'")' -: let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".pyeval(name.".".v:val)'), ';') -: $put =toput -:endfor -:silent! let d.abc2=1 -:silent! let dl.abc3=1 -:py d.locked=True -:py 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 'py '.name.'=vim.bindeval("'.s.'")' -: let toput=s.' : locked:'.pyeval(name.'.locked') -: $put =toput -:endfor -:silent! call extend(l, [0]) -:silent! call extend(ll, [0]) -:py l.locked=True -:py ll.locked=False -:silent! call extend(l, [1]) -:silent! call extend(ll, [1]) -:put ='l:'.string(l) -:put ='ll:'.string(ll) -:unlet l ll -:" -:" pyeval() -:let l=pyeval('range(3)') -:$put =string(l) -:let d=pyeval('{"a": "b", "c": 1, "d": ["e"]}') -:$put =sort(items(d)) -:let v:errmsg = '' -:$put ='pyeval(\"None\") = ' . pyeval('None') . v:errmsg -:if has('float') -: let f=pyeval('0.0') -: $put =string(f) -:else -: $put ='0.0' -:endif -:" Invalid values: -:for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim'] -: try -: let v=pyeval(e) -: catch -: let toput=e.":\t".v:exception[:13] -: $put =toput -: endtry -:endfor -:" -:" threading -:let l = [0] -:py l=vim.bindeval('l') -py << 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 -:py t.running = False -:py t.join() -:" Check if the background thread is working. Count should be 10, but on a -:" busy system (AppVeyor) it can be much lower. -:py l[0] = t.t > 4 -:py del time -:py del threading -:py del t -:$put =string(l) -:" -:" settrace -:let l = [] -:py l=vim.bindeval('l') -py << trim EOF - import sys - - def traceit(frame, event, arg): - global l - if event == "line": - l.extend([frame.f_lineno]) - return traceit - - def trace_main(): - for i in range(5): - pass -EOF -:py sys.settrace(traceit) -:py trace_main() -:py sys.settrace(None) -:py del traceit -:py del trace_main -:$put =string(l) -:" -:" Slice -:py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]') -:py l = ll[:4] -:$put =string(pyeval('l')) -:py l = ll[2:] -:$put =string(pyeval('l')) -:py l = ll[:-4] -:$put =string(pyeval('l')) -:py l = ll[-2:] -:$put =string(pyeval('l')) -:py l = ll[2:4] -:$put =string(pyeval('l')) -:py l = ll[4:2] -:$put =string(pyeval('l')) -:py l = ll[-4:-2] -:$put =string(pyeval('l')) -:py l = ll[-2:-4] -:$put =string(pyeval('l')) -:py l = ll[:] -:$put =string(pyeval('l')) -:py l = ll[0:6] -:$put =string(pyeval('l')) -:py l = ll[-10:10] -:$put =string(pyeval('l')) -:py l = ll[4:2:-1] -:$put =string(pyeval('l')) -:py l = ll[::2] -:$put =string(pyeval('l')) -:py l = ll[4:2:1] -:$put =string(pyeval('l')) -:py del l -:" -:" Vars -:let g:foo = 'bac' -:let w:abc3 = 'def' -:let b:baz = 'bar' -:let t:bar = 'jkl' -:try -: throw "Abc" -:catch -: put =pyeval('vim.vvars[''exception'']') -:endtry -:put =pyeval('vim.vars[''foo'']') -:put =pyeval('vim.current.window.vars[''abc3'']') -:put =pyeval('vim.current.buffer.vars[''baz'']') -:put =pyeval('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 -py << trim EOF - def e(s, g=globals(), l=locals()): - try: - exec(s, g, l) - except: - vim.command('return ' + repr(sys.exc_type.__name__)) - - def ev(s, g=globals(), l=locals()): - try: - return eval(s, g, l) - except: - vim.command('let exc=' + repr(sys.exc_type.__name__)) - return 0 -EOF -:fun E(s) -: python e(vim.eval('a:s')) -:endfun -:fun Ev(s) -: let r=pyeval('ev(vim.eval("a:s"))') -: if exists('exc') -: throw exc -: endif -: return r -:endfun -:py gopts1=vim.options -:py wopts1=vim.windows[2].options -:py wopts2=vim.windows[0].options -:py wopts3=vim.windows[1].options -:py bopts1=vim.buffers[vim.bindeval("g:bufs")[2]].options -:py bopts2=vim.buffers[vim.bindeval("g:bufs")[1]].options -:py bopts3=vim.buffers[vim.bindeval("g:bufs")[0]].options -:$put ='wopts iters equal: '.pyeval('list(wopts1) == list(wopts2)') -:$put ='bopts iters equal: '.pyeval('list(bopts1) == list(bopts2)') -:py gset=set(iter(gopts1)) -:py wset=set(iter(wopts1)) -:py 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 -: py oname=vim.eval('oname') -: py oval1=vim.bindeval('oval1') -: py oval2=vim.bindeval('oval2') -: py oval3=vim.bindeval('oval3') -: if invval is 0 || invval is 1 -: py invval=bool(vim.bindeval('invval')) -: else -: py invval=vim.bindeval('invval') -: endif -: if bool -: py oval1=bool(oval1) -: py oval2=bool(oval2) -: py oval3=bool(oval3) -: endif -: put ='>>> '.oname -: $put =' g/w/b:'.pyeval('oname in gset').'/'.pyeval('oname in wset').'/'.pyeval('oname in bset') -: $put =' g/w/b (in):'.pyeval('oname in gopts1').'/'.pyeval('oname in wopts1').'/'.pyeval('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 -:py del ev -:py del e -:only -:for buf in g:bufs[1:] -: execute 'bwipeout!' buf -:endfor -:py del gopts1 -:py del wopts1 -:py del wopts2 -:py del wopts3 -:py del bopts1 -:py del bopts2 -:py del bopts3 -:py del oval1 -:py del oval2 -:py del oval3 -:py del oname -:py del invval -:" -:" Test buffer object -:vnew -:put ='First line' -:put ='Second line' -:put ='Third line' -:1 delete _ -:py b=vim.current.buffer -:wincmd w -:mark a -:augroup BUFS -: autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")')) -: autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")')) -:augroup END -py << 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")', 'b.name = "!"'): - 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 -:augroup BUFS -: autocmd! -:augroup END -:augroup! BUFS -:" -:" Test vim.buffers object -:set hidden -:edit a -:buffer # -:edit b -:buffer # -:edit c -:buffer # -py << trim EOF - try: - from __builtin__ import next - except ImportError: - next = lambda o: o.next() - # 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 -py << trim EOF - cb.append('Number of tabs: ' + str(len(vim.tabpages))) - cb.append('Current tab pages:') - def W(w): - if repr(w).find('(unknown)') != -1: - return '<window object (unknown)>' - else: - return repr(w) - - start = len(cb) - - def Cursor(w): - 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 long: - raise TypeError - if aval < 0: - raise ValueError - except Exception: - cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + sys.exc_type.__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 -py << 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 -py << 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 -py << 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(pyeval('vim.Dictionary({})')) -:$put =string(pyeval('vim.Dictionary(a=1)')) -:$put =string(pyeval('vim.Dictionary(((''a'', 1),))')) -:$put =string(pyeval('vim.List()')) -:$put =string(pyeval('vim.List(iter(''abc7''))')) -:$put =string(pyeval('vim.Function(''tr'')')) -:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4])')) -:$put =string(pyeval('vim.Function(''tr'', args=[])')) -:$put =string(pyeval('vim.Function(''tr'', self={})')) -:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})')) -:$put ='auto_rebind' -:$put =string(pyeval('vim.Function(''tr'', auto_rebind=False)')) -:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) -:$put =string(pyeval('vim.Function(''tr'', args=[], auto_rebind=False)')) -:$put =string(pyeval('vim.Function(''tr'', self={}, auto_rebind=False)')) -:$put =string(pyeval('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': []}) -:py Pt = vim.bindeval('Pt') -:unlet Pt -:py del Pt -py << 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: ' + vim.Function('string')(ret) - 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(pyeval('a')) -:$put ='s(pa1): '.string(pyeval('pa1')) -:$put ='s(pa2): '.string(pyeval('pa2')) -:$put ='s(pa3): '.string(pyeval('pa3')) -:$put ='s(pa4): '.string(pyeval('pa4')) -:$put ='s(sa): '.string(pyeval('sa')) -:$put ='s(psa1): '.string(pyeval('psa1')) -:$put ='s(psa2): '.string(pyeval('psa2')) -:$put ='s(psa3): '.string(pyeval('psa3')) -:$put ='s(psa4): '.string(pyeval('psa4')) -:$put ='s(psa5): '.string(pyeval('psa5')) -:$put ='s(psa6): '.string(pyeval('psa6')) -:$put ='s(psa7): '.string(pyeval('psa7')) -:$put ='s(psa8): '.string(pyeval('psa8')) -:$put ='s(psa9): '.string(pyeval('psa9')) -:$put ='s(psaA): '.string(pyeval('psaA')) -:$put ='s(psaB): '.string(pyeval('psaB')) -:$put ='s(psaC): '.string(pyeval('psaC')) -: -:for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] -: let d = {'f': pyeval(v)} -: $put ='d.'.v.'(): '.string(d.f()) -:endfor -: -:py ecall('a()', a, ) -:py ecall('pa1()', pa1, ) -:py ecall('pa2()', pa2, ) -:py ecall('pa3()', pa3, ) -:py ecall('pa4()', pa4, ) -:py ecall('sa()', sa, ) -:py ecall('psa1()', psa1, ) -:py ecall('psa2()', psa2, ) -:py ecall('psa3()', psa3, ) -:py ecall('psa4()', psa4, ) -: -:py ecall('a(42, 43)', a, 42, 43) -:py ecall('pa1(42, 43)', pa1, 42, 43) -:py ecall('pa2(42, 43)', pa2, 42, 43) -:py ecall('pa3(42, 43)', pa3, 42, 43) -:py ecall('pa4(42, 43)', pa4, 42, 43) -:py ecall('sa(42, 43)', sa, 42, 43) -:py ecall('psa1(42, 43)', psa1, 42, 43) -:py ecall('psa2(42, 43)', psa2, 42, 43) -:py ecall('psa3(42, 43)', psa3, 42, 43) -:py ecall('psa4(42, 43)', psa4, 42, 43) -: -:py ecall('a(42, self={"20": 1})', a, 42, self={'20': 1}) -:py ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1}) -:py ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1}) -:py ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1}) -:py ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1}) -:py ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1}) -:py ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1}) -:py ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1}) -:py ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1}) -:py ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1}) -: -:py ecall('a(self={"20": 1})', a, self={'20': 1}) -:py ecall('pa1(self={"20": 1})', pa1, self={'20': 1}) -:py ecall('pa2(self={"20": 1})', pa2, self={'20': 1}) -:py ecall('pa3(self={"20": 1})', pa3, self={'20': 1}) -:py ecall('pa4(self={"20": 1})', pa4, self={'20': 1}) -:py ecall('sa(self={"20": 1})', sa, self={'20': 1}) -:py ecall('psa1(self={"20": 1})', psa1, self={'20': 1}) -:py ecall('psa2(self={"20": 1})', psa2, self={'20': 1}) -:py ecall('psa3(self={"20": 1})', psa3, self={'20': 1}) -:py ecall('psa4(self={"20": 1})', psa4, self={'20': 1}) -py << trim EOF - def s(v): - if v is None: - 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)) - 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)) < |