blob: 28adb709d6e9c941e7d38e939a1240261311f3e9 [file] [log] [blame]
Bram Moolenaardb913952012-06-29 12:54:53 +02001Tests for various python features. vim: set ft=vim :
2
Bram Moolenaar995a8cd2013-02-20 16:54:27 +01003NOTE: This will cause errors when run under valgrind.
4This would require recompiling Python with:
5 ./configure --without-pymalloc
6See http://svn.python.org/view/python/trunk/Misc/README.valgrind?view=markup
7
Bram Moolenaardb913952012-06-29 12:54:53 +02008STARTTEST
9:so small.vim
10:if !has('python') | e! test.ok | wq! test.out | endif
Bram Moolenaarc24c1ac2013-05-16 20:47:56 +020011:lang C
Bram Moolenaardb913952012-06-29 12:54:53 +020012:py import vim
13:fun Test()
14:let l = []
15:py l=vim.bindeval('l')
16:py f=vim.bindeval('function("strlen")')
17:" Extending List directly with different types
18:py l.extend([1, "as'd", [1, 2, f, {'a': 1}]])
19:$put =string(l)
20:$put =string(l[-1])
21:try
22: $put =string(l[-4])
23:catch
24: $put =v:exception[:13]
25:endtry
26:" List assignment
27:py l[0]=0
28:$put =string(l)
29:py l[-2]=f
30:$put =string(l)
31:"
32:" Extending Dictionary directly with different types
33:let d = {}
Bram Moolenaara9922d62013-05-30 13:01:18 +020034py << EOF
35d=vim.bindeval('d')
36d['1']='asd'
37d.update(b=[1, 2, f])
38d.update((('-1', {'a': 1}),))
39d.update({'0': -1})
40dk = d.keys()
41dv = d.values()
42di = d.items()
43dk.sort(key=repr)
44dv.sort(key=repr)
45di.sort(key=repr)
46EOF
47:$put =pyeval('repr(dk)')
48:$put =substitute(pyeval('repr(dv)'),'0x\x\+','','g')
49:$put =substitute(pyeval('repr(di)'),'0x\x\+','','g')
Bram Moolenaardb913952012-06-29 12:54:53 +020050:for [key, val] in sort(items(d))
51: $put =string(key) . ' : ' . string(val)
52: unlet key val
53:endfor
54:"
55:" removing items with del
56:py del l[2]
57:$put =string(l)
58:let l = range(8)
59:py l=vim.bindeval('l')
60:try
61: py del l[:3]
62: py del l[1:]
63:catch
64: $put =v:exception
65:endtry
66:$put =string(l)
67:"
68:py del d['-1']
Bram Moolenaara9922d62013-05-30 13:01:18 +020069:$put =string(pyeval('d.get(''b'', 1)'))
70:$put =string(pyeval('d.pop(''b'')'))
71:$put =string(pyeval('d.get(''b'', 1)'))
72:$put =string(pyeval('d.pop(''1'', 2)'))
73:$put =string(pyeval('d.pop(''1'', 2)'))
74:$put =pyeval('repr(d.has_key(''0''))')
75:$put =pyeval('repr(d.has_key(''1''))')
76:$put =pyeval('repr(''0'' in d)')
77:$put =pyeval('repr(''1'' in d)')
78:$put =pyeval('repr(list(iter(d)))')
Bram Moolenaardb913952012-06-29 12:54:53 +020079:$put =string(d)
Bram Moolenaara9922d62013-05-30 13:01:18 +020080:$put =pyeval('repr(d.popitem(''0''))')
81:$put =pyeval('repr(d.get(''0''))')
82:$put =pyeval('repr(list(iter(d)))')
Bram Moolenaardb913952012-06-29 12:54:53 +020083:"
84:" removing items out of range: silently skip items that don't exist
85:let l = [0, 1, 2, 3]
86:py l=vim.bindeval('l')
87:" The following two ranges delete nothing as they match empty list:
88:py del l[2:1]
89:$put =string(l)
90:py del l[2:2]
91:$put =string(l)
92:py del l[2:3]
93:$put =string(l)
94:let l = [0, 1, 2, 3]
95:py l=vim.bindeval('l')
96:py del l[2:4]
97:$put =string(l)
98:let l = [0, 1, 2, 3]
99:py l=vim.bindeval('l')
100:py del l[2:5]
101:$put =string(l)
102:let l = [0, 1, 2, 3]
103:py l=vim.bindeval('l')
104:py del l[2:6]
105:$put =string(l)
106:let l = [0, 1, 2, 3]
107:py l=vim.bindeval('l')
108:" The following two ranges delete nothing as they match empty list:
109:py del l[-1:2]
110:$put =string(l)
111:py del l[-2:2]
112:$put =string(l)
113:py del l[-3:2]
114:$put =string(l)
115:let l = [0, 1, 2, 3]
116:py l=vim.bindeval('l')
117:py del l[-4:2]
118:$put =string(l)
119:let l = [0, 1, 2, 3]
120:py l=vim.bindeval('l')
121:py del l[-5:2]
122:$put =string(l)
123:let l = [0, 1, 2, 3]
124:py l=vim.bindeval('l')
125:py del l[-6:2]
126:$put =string(l)
127:"
128:" Slice assignment to a list
129:let l = [0, 1, 2, 3]
130:py l=vim.bindeval('l')
131:py l[0:0]=['a']
132:$put =string(l)
133:let l = [0, 1, 2, 3]
134:py l=vim.bindeval('l')
135:py l[1:2]=['b']
136:$put =string(l)
137:let l = [0, 1, 2, 3]
138:py l=vim.bindeval('l')
139:py l[2:4]=['c']
140:$put =string(l)
141:let l = [0, 1, 2, 3]
142:py l=vim.bindeval('l')
143:py l[4:4]=['d']
144:$put =string(l)
145:let l = [0, 1, 2, 3]
146:py l=vim.bindeval('l')
147:py l[-1:2]=['e']
148:$put =string(l)
149:let l = [0, 1, 2, 3]
150:py l=vim.bindeval('l')
151:py l[-10:2]=['f']
152:$put =string(l)
153:let l = [0, 1, 2, 3]
154:py l=vim.bindeval('l')
155:py l[2:-10]=['g']
156:$put =string(l)
157:let l = []
158:py l=vim.bindeval('l')
159:py l[0:0]=['h']
160:$put =string(l)
161:"
162:" Locked variables
163:let l = [0, 1, 2, 3]
164:py l=vim.bindeval('l')
165:lockvar! l
166:py l[2]='i'
167:$put =string(l)
168:unlockvar! l
169:"
170:" Function calls
171:function New(...)
172:return ['NewStart']+a:000+['NewEnd']
173:endfunction
174:function DictNew(...) dict
175:return ['DictNewStart']+a:000+['DictNewEnd', self]
176:endfunction
177:let l=[function('New'), function('DictNew')]
178:py l=vim.bindeval('l')
179:py l.extend(list(l[0](1, 2, 3)))
180:$put =string(l)
181:py l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
182:$put =string(l)
183:py l.extend([l[0].name])
184:$put =string(l)
185:try
186: py l[1](1, 2, 3)
187:catch
188: $put =v:exception[:16]
189:endtry
190:delfunction New
191:try
192: py l[0](1, 2, 3)
193:catch
194: $put =v:exception[:16]
195:endtry
196:if has('float')
197: let l=[0.0]
198: py l=vim.bindeval('l')
199: py l.extend([0.0])
200: $put =string(l)
201:else
202: $put ='[0.0, 0.0]'
203:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200204:let messages=[]
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200205py <<EOF
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200206d=vim.bindeval('{}')
207m=vim.bindeval('messages')
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200208def em(expr, g=globals(), l=locals()):
209 try:
210 exec(expr, g, l)
211 except:
212 m.extend([sys.exc_type.__name__])
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200213
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200214em('d["abc"]')
215em('d["abc"]="\\0"')
216em('d["abc"]=vim')
217em('d[""]=1')
218em('d["a\\0b"]=1')
219em('d[u"a\\0b"]=1')
Bram Moolenaara9922d62013-05-30 13:01:18 +0200220
221em('d.pop("abc")')
222em('d.popitem("abc")')
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200223EOF
224:$put =messages
Bram Moolenaar66b79852012-09-21 14:00:35 +0200225:unlet messages
226:" locked and scope attributes
227:let d={} | let dl={} | lockvar dl
228:for s in split("d dl v: g:")
229: let name=tr(s, ':', 's')
230: execute 'py '.name.'=vim.bindeval("'.s.'")'
231: let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".pyeval(name.".".v:val)'), ';')
232: $put =toput
233:endfor
234:silent! let d.abc=1
235:silent! let dl.abc=1
236:py d.locked=True
237:py dl.locked=False
238:silent! let d.def=1
239:silent! let dl.def=1
240:put ='d:'.string(d)
241:put ='dl:'.string(dl)
242:unlet d dl
243:
244:let l=[] | let ll=[] | lockvar ll
245:for s in split("l ll")
246: let name=tr(s, ':', 's')
247: execute 'py '.name.'=vim.bindeval("'.s.'")'
248: let toput=s.' : locked:'.pyeval(name.'.locked')
249: $put =toput
250:endfor
251:silent! call extend(l, [0])
252:silent! call extend(ll, [0])
253:py l.locked=True
254:py ll.locked=False
255:silent! call extend(l, [1])
256:silent! call extend(ll, [1])
257:put ='l:'.string(l)
258:put ='ll:'.string(ll)
259:unlet l ll
Bram Moolenaardb913952012-06-29 12:54:53 +0200260:"
261:" pyeval()
262:let l=pyeval('range(3)')
263:$put =string(l)
264:let d=pyeval('{"a": "b", "c": 1, "d": ["e"]}')
265:$put =sort(items(d))
Bram Moolenaardb913952012-06-29 12:54:53 +0200266:if has('float')
267: let f=pyeval('0.0')
268: $put =string(f)
269:else
270: $put ='0.0'
271:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200272:" Invalid values:
273:for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim']
274: try
275: let v=pyeval(e)
276: catch
277: let toput=e.":\t".v:exception[:13]
278: $put =toput
279: endtry
280:endfor
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100281:"
282:" threading
283:let l = [0]
284:py l=vim.bindeval('l')
285:py <<EOF
286import threading
287import time
288
289class T(threading.Thread):
290 def __init__(self):
291 threading.Thread.__init__(self)
292 self.t = 0
293 self.running = True
294
295 def run(self):
296 while self.running:
297 self.t += 1
298 time.sleep(0.1)
299
300t = T()
301t.start()
302EOF
303:sleep 1
304:py t.running = False
305:py t.join()
306:py l[0] = t.t > 8 # check if the background thread is working
307:$put =string(l)
308:"
309:" settrace
310:let l = []
311:py l=vim.bindeval('l')
312:py <<EOF
313import sys
314
315def traceit(frame, event, arg):
316 global l
317 if event == "line":
318 l.extend([frame.f_lineno])
319 return traceit
320
321def trace_main():
322 for i in range(5):
323 pass
324EOF
325:py sys.settrace(traceit)
326:py trace_main()
327:py sys.settrace(None)
328:$put =string(l)
Bram Moolenaar24b11fb2013-04-05 19:32:36 +0200329:"
330:" Slice
331:py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
332:py l = ll[:4]
333:$put =string(pyeval('l'))
334:py l = ll[2:]
335:$put =string(pyeval('l'))
336:py l = ll[:-4]
337:$put =string(pyeval('l'))
338:py l = ll[-2:]
339:$put =string(pyeval('l'))
340:py l = ll[2:4]
341:$put =string(pyeval('l'))
342:py l = ll[4:2]
343:$put =string(pyeval('l'))
344:py l = ll[-4:-2]
345:$put =string(pyeval('l'))
346:py l = ll[-2:-4]
347:$put =string(pyeval('l'))
348:py l = ll[:]
349:$put =string(pyeval('l'))
350:py l = ll[0:6]
351:$put =string(pyeval('l'))
352:py l = ll[-10:10]
353:$put =string(pyeval('l'))
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200354:"
355:" Vars
356:let g:foo = 'bac'
357:let w:abc = 'def'
358:let b:baz = 'bar'
Bram Moolenaara4720012013-05-15 16:27:37 +0200359:let t:bar = 'jkl'
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200360:try
361: throw "Abc"
362:catch
363: put =pyeval('vim.vvars[''exception'']')
364:endtry
365:put =pyeval('vim.vars[''foo'']')
366:put =pyeval('vim.current.window.vars[''abc'']')
367:put =pyeval('vim.current.buffer.vars[''baz'']')
Bram Moolenaara4720012013-05-15 16:27:37 +0200368:put =pyeval('vim.current.tabpage.vars[''bar'']')
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200369:"
370:" Options
371:" paste: boolean, global
372:" previewheight number, global
373:" operatorfunc: string, global
374:" number: boolean, window-local
375:" numberwidth: number, window-local
376:" colorcolumn: string, window-local
377:" statusline: string, window-local/global
378:" autoindent: boolean, buffer-local
Bram Moolenaar55b8ad32013-05-17 13:38:04 +0200379:" shiftwidth: number, buffer-local
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200380:" omnifunc: string, buffer-local
381:" preserveindent: boolean, buffer-local/global
382:" path: string, buffer-local/global
383:let g:bufs=[bufnr('%')]
384:new
385:let g:bufs+=[bufnr('%')]
386:vnew
387:let g:bufs+=[bufnr('%')]
388:wincmd j
389:vnew
390:let g:bufs+=[bufnr('%')]
391:wincmd l
392:fun RecVars(opt)
393: let gval =string(eval('&g:'.a:opt))
394: let wvals=join(map(range(1, 4), 'v:val.":".string(getwinvar(v:val, "&".a:opt))'))
395: let bvals=join(map(copy(g:bufs), 'v:val.":".string(getbufvar(v:val, "&".a:opt))'))
396: put =' G: '.gval
397: put =' W: '.wvals
398: put =' B: '.wvals
399:endfun
400py << EOF
401def e(s, g=globals(), l=locals()):
402 try:
403 exec(s, g, l)
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200404 except:
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200405 vim.command('return ' + repr(sys.exc_type.__name__))
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200406
407def ev(s, g=globals(), l=locals()):
408 try:
409 return eval(s, g, l)
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200410 except:
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200411 vim.command('let exc=' + repr(sys.exc_type.__name__))
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200412 return 0
413EOF
414:function E(s)
415: python e(vim.eval('a:s'))
416:endfunction
417:function Ev(s)
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200418: let r=pyeval('ev(vim.eval("a:s"))')
419: if exists('exc')
420: throw exc
421: endif
422: return r
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200423:endfunction
424:py gopts1=vim.options
425:py wopts1=vim.windows[2].options
426:py wopts2=vim.windows[0].options
427:py wopts3=vim.windows[1].options
428:py bopts1=vim.buffers[vim.bindeval("g:bufs")[2]].options
429:py bopts2=vim.buffers[vim.bindeval("g:bufs")[1]].options
430:py bopts3=vim.buffers[vim.bindeval("g:bufs")[0]].options
431:let lst=[]
432:let lst+=[['paste', 1, 0, 1, 2, 1, 1, 0 ]]
433:let lst+=[['previewheight', 5, 1, 6, 'a', 0, 1, 0 ]]
434:let lst+=[['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0 ]]
435:let lst+=[['number', 0, 1, 1, 0, 1, 0, 1 ]]
436:let lst+=[['numberwidth', 2, 3, 5, -100, 0, 0, 1 ]]
437:let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc', 0, 0, 1 ]]
438:let lst+=[['statusline', '1', '2', '4', 0, 0, 1, 1 ]]
439:let lst+=[['autoindent', 0, 1, 1, 2, 1, 0, 2 ]]
Bram Moolenaar55b8ad32013-05-17 13:38:04 +0200440:let lst+=[['shiftwidth', 0, 2, 1, 3, 0, 0, 2 ]]
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200441:let lst+=[['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2 ]]
442:let lst+=[['preserveindent', 0, 1, 1, 2, 1, 1, 2 ]]
443:let lst+=[['path', '.,,', ',,', '.', 0, 0, 1, 2 ]]
444:for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
445: py oname=vim.eval('oname')
446: py oval1=vim.bindeval('oval1')
447: py oval2=vim.bindeval('oval2')
448: py oval3=vim.bindeval('oval3')
449: if invval is 0 || invval is 1
450: py invval=bool(vim.bindeval('invval'))
451: else
452: py invval=vim.bindeval('invval')
453: endif
454: if bool
455: py oval1=bool(oval1)
456: py oval2=bool(oval2)
457: py oval3=bool(oval3)
458: endif
459: put ='>>> '.oname
460: for v in ['gopts1', 'wopts1', 'bopts1']
461: try
462: put =' p/'.v.': '.Ev('repr('.v.'['''.oname.'''])')
463: catch
464: put =' p/'.v.'! '.v:exception
465: endtry
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200466: let r=E(v.'['''.oname.''']=invval')
467: if r isnot 0
468: put =' inv: '.string(invval).'! '.r
469: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200470: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
471: let val=substitute(vv, '^.opts', 'oval', '')
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200472: let r=E(vv.'['''.oname.''']='.val)
473: if r isnot 0
474: put =' '.vv.'! '.r
475: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200476: endfor
477: endfor
478: call RecVars(oname)
479: for v in ['wopts3', 'bopts3']
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200480: let r=E('del '.v.'["'.oname.'"]')
481: if r isnot 0
482: put =' del '.v.'! '.r
483: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200484: endfor
485: call RecVars(oname)
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200486:endfor
487:only
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200488:for buf in g:bufs[1:]
489: execute 'bwipeout!' buf
490:endfor
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200491:"
492:" Test buffer object
493:vnew
494:put ='First line'
495:put ='Second line'
496:put ='Third line'
497:1 delete _
498:py b=vim.current.buffer
499:wincmd w
500:mark a
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200501:augroup BUFS
502: autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
503: autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
504:augroup END
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200505py << EOF
506cb = vim.current.buffer
507# Tests BufferAppend and BufferItem
508cb.append(b[0])
509# Tests BufferSlice and BufferAssSlice
510cb.append('abc') # Will be overwritten
511cb[-1:] = b[:-2]
512# Test BufferLength and BufferAssSlice
513cb.append('def') # Will not be overwritten
514cb[len(cb):] = b[:]
515# Test BufferAssItem and BufferMark
516cb.append('ghi') # Will be overwritten
517cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
518# Test BufferRepr
519cb.append(repr(cb) + repr(b))
520# Modify foreign buffer
521b.append('foo')
522b[0]='bar'
523b[0:0]=['baz']
524vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200525# Test assigning to name property
526old_name = cb.name
527cb.name = 'foo'
528cb.append(cb.name[-11:])
529b.name = 'bar'
530cb.append(b.name[-11:])
531cb.name = old_name
532cb.append(cb.name[-17:])
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200533# Test CheckBuffer
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200534for _b in vim.buffers:
535 if _b is not cb:
536 vim.command('bwipeout! ' + str(_b.number))
537del _b
Bram Moolenaar9e822c02013-05-29 22:15:30 +0200538cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200539for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")', 'b.name = "!"'):
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200540 try:
541 exec(expr)
542 except vim.error:
543 pass
544 else:
545 # Usually a SEGV here
546 # Should not happen in any case
547 cb.append('No exception for ' + expr)
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200548vim.command('cd .')
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200549EOF
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200550:augroup BUFS
551: autocmd!
552:augroup END
553:augroup! BUFS
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200554:"
555:" Test vim.buffers object
556:set hidden
557:edit a
558:buffer #
559:edit b
560:buffer #
561:edit c
562:buffer #
563py << EOF
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200564try:
565 from __builtin__ import next
566except ImportError:
567 next = lambda o: o.next()
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200568# Check GCing iterator that was not fully exhausted
569i = iter(vim.buffers)
570cb.append('i:' + str(next(i)))
571# and also check creating more then one iterator at a time
572i2 = iter(vim.buffers)
573cb.append('i2:' + str(next(i2)))
574cb.append('i:' + str(next(i)))
575# The following should trigger GC and not cause any problems
576del i
577del i2
578i3 = iter(vim.buffers)
579cb.append('i3:' + str(next(i3)))
580del i3
581
582prevnum = 0
583for b in vim.buffers:
584 # Check buffer order
585 if prevnum >= b.number:
586 cb.append('!!! Buffer numbers not in strictly ascending order')
587 # Check indexing: vim.buffers[number].number == number
588 cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + '=' + repr(b))
589 prevnum = b.number
590
591cb.append(str(len(vim.buffers)))
592
593bnums = list(map(lambda b: b.number, vim.buffers))[1:]
594
595# Test wiping out buffer with existing iterator
596i4 = iter(vim.buffers)
597cb.append('i4:' + str(next(i4)))
598vim.command('bwipeout! ' + str(bnums.pop(0)))
599try:
600 next(i4)
601except vim.error:
602 pass
603else:
604 cb.append('!!!! No vim.error')
605i4 = iter(vim.buffers)
606vim.command('bwipeout! ' + str(bnums.pop(-1)))
607vim.command('bwipeout! ' + str(bnums.pop(-1)))
608cb.append('i4:' + str(next(i4)))
609try:
610 next(i4)
611except StopIteration:
612 cb.append('StopIteration')
613EOF
Bram Moolenaara4720012013-05-15 16:27:37 +0200614:"
615:" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
616:tabnew 0
617:tabnew 1
618:vnew a.1
619:tabnew 2
620:vnew a.2
621:vnew b.2
622:vnew c.2
623py << EOF
624cb.append('Number of tabs: ' + str(len(vim.tabpages)))
625cb.append('Current tab pages:')
626def W(w):
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200627 if repr(w).find('(unknown)') != -1:
Bram Moolenaara4720012013-05-15 16:27:37 +0200628 return '<window object (unknown)>'
629 else:
630 return repr(w)
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200631
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200632start = len(cb)
633
634def Cursor(w):
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200635 if w.buffer is cb:
636 return repr((start - w.cursor[0], w.cursor[1]))
637 else:
638 return repr(w.cursor)
639
Bram Moolenaara4720012013-05-15 16:27:37 +0200640for t in vim.tabpages:
641 cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window))
642 cb.append(' Windows:')
643 for w in t.windows:
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200644 cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w))
Bram Moolenaara4720012013-05-15 16:27:37 +0200645 # Other values depend on the size of the terminal, so they are checked partly:
646 for attr in ('height', 'row', 'width', 'col'):
647 try:
648 aval = getattr(w, attr)
649 if type(aval) is not long:
650 raise TypeError
651 if aval < 0:
652 raise ValueError
653 except Exception:
654 cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + sys.exc_type.__name__)
655 w.cursor = (len(w.buffer), 0)
656cb.append('Number of windows in current tab page: ' + str(len(vim.windows)))
657if list(vim.windows) != list(vim.current.tabpage.windows):
658 cb.append('!!!!!! Windows differ')
659EOF
660:"
661:" Test vim.current
662py << EOF
663def H(o):
664 return repr(o)
665cb.append('Current tab page: ' + repr(vim.current.tabpage))
666cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
667cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer))
668# Assigning: fails
669try:
670 vim.current.window = vim.tabpages[0].window
671except ValueError:
672 cb.append('ValueError at assigning foreign tab window')
673
674for attr in ('window', 'tabpage', 'buffer'):
675 try:
676 setattr(vim.current, attr, None)
677 except TypeError:
678 cb.append('Type error at assigning None to vim.current.' + attr)
679
680# Assigning: success
681vim.current.tabpage = vim.tabpages[-2]
682vim.current.buffer = cb
683vim.current.window = vim.windows[0]
684vim.current.window.cursor = (len(vim.current.buffer), 0)
685cb.append('Current tab page: ' + repr(vim.current.tabpage))
686cb.append('Current window: ' + repr(vim.current.window))
687cb.append('Current buffer: ' + repr(vim.current.buffer))
688cb.append('Current line: ' + repr(vim.current.line))
Bram Moolenaar9e822c02013-05-29 22:15:30 +0200689ws = list(vim.windows)
690ts = list(vim.tabpages)
Bram Moolenaara4720012013-05-15 16:27:37 +0200691for b in vim.buffers:
692 if b is not cb:
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200693 vim.command('bwipeout! ' + str(b.number))
Bram Moolenaar9e822c02013-05-29 22:15:30 +0200694cb.append('w.valid: ' + repr([w.valid for w in ws]))
695cb.append('t.valid: ' + repr([t.valid for t in ts]))
Bram Moolenaara4720012013-05-15 16:27:37 +0200696EOF
697:tabonly!
698:only!
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200699:"
700:" Test types
701py << EOF
702for expr, attr in (
703 ('vim.vars', 'Dictionary'),
704 ('vim.options', 'Options'),
705 ('vim.bindeval("{}")', 'Dictionary'),
706 ('vim.bindeval("[]")', 'List'),
707 ('vim.bindeval("function(\'tr\')")', 'Function'),
708 ('vim.current.buffer', 'Buffer'),
709 ('vim.current.range', 'Range'),
710 ('vim.current.window', 'Window'),
711 ('vim.current.tabpage', 'TabPage'),
712):
713 cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
714EOF
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200715:"
Bram Moolenaardd8aca62013-05-29 22:36:10 +0200716:" Test __dir__() method
717py << EOF
718for name, o in (
719 ('current', vim.current),
720 ('buffer', vim.current.buffer),
721 ('window', vim.current.window),
722 ('tabpage', vim.current.tabpage),
723 ('range', vim.current.range),
724 ('dictionary', vim.bindeval('{}')),
725 ('list', vim.bindeval('[]')),
726 ('function', vim.bindeval('function("tr")')),
727 ('output', sys.stdout),
728 ):
729 cb.append(name + ':' + ','.join(dir(o)))
730del name
731del o
732EOF
733:"
Bram Moolenaara9922d62013-05-30 13:01:18 +0200734:" Test vim.*.__new__
735:$put =string(pyeval('vim.Dictionary({})'))
736:$put =string(pyeval('vim.Dictionary(a=1)'))
737:$put =string(pyeval('vim.Dictionary(((''a'', 1),))'))
Bram Moolenaar01a7a722013-05-30 12:26:58 +0200738:"
739:" Test stdout/stderr
740:redir => messages
741:py sys.stdout.write('abc') ; sys.stdout.write('def')
742:py sys.stderr.write('abc') ; sys.stderr.write('def')
743:py sys.stdout.writelines(iter('abc'))
744:py sys.stderr.writelines(iter('abc'))
745:redir END
746:$put =string(substitute(messages, '\d\+', '', 'g'))
Bram Moolenaara9922d62013-05-30 13:01:18 +0200747:" Test subclassing
748py << EOF
749class DupDict(vim.Dictionary):
750 def __setitem__(self, key, value):
751 super(DupDict, self).__setitem__(key, value)
752 super(DupDict, self).__setitem__('dup_' + key, value)
753dd = DupDict()
754dd['a'] = 'b'
755EOF
756:$put =string(sort(keys(pyeval('dd'))))
Bram Moolenaar01a7a722013-05-30 12:26:58 +0200757:"
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200758:" Test exceptions
759:fun Exe(e)
760: execute a:e
761:endfun
762py << EOF
763def ee(expr, g=globals(), l=locals()):
764 try:
765 exec(expr, g, l)
766 except:
767 cb.append(repr(sys.exc_info()[:2]))
768Exe = vim.bindeval('function("Exe")')
769ee('vim.command("throw \'abc\'")')
770ee('Exe("throw \'def\'")')
771ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
772ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
773ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
774ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
775EOF
Bram Moolenaardb913952012-06-29 12:54:53 +0200776:endfun
777:"
778:call Test()
779:"
780:delfunc Test
781:call garbagecollect(1)
782:"
783:/^start:/,$wq! test.out
Bram Moolenaar66b79852012-09-21 14:00:35 +0200784:call getchar()
Bram Moolenaardb913952012-06-29 12:54:53 +0200785ENDTEST
786
787start: