blob: ae90b27cf4d88362ffc169471fd984303f2c9dba [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 = {}
34:py d=vim.bindeval('d')
35:py d['1']='asd'
36:py d['b']=[1, 2, f]
37:py d['-1']={'a': 1}
38:let dkeys = []
39:py dk=vim.bindeval('dkeys')
40:py dkeys=d.keys()
41:py dkeys.sort()
42:py dk.extend(dkeys)
43:$put =string(dkeys)
44:for [key, val] in sort(items(d))
45: $put =string(key) . ' : ' . string(val)
46: unlet key val
47:endfor
48:"
49:" removing items with del
50:py del l[2]
51:$put =string(l)
52:let l = range(8)
53:py l=vim.bindeval('l')
54:try
55: py del l[:3]
56: py del l[1:]
57:catch
58: $put =v:exception
59:endtry
60:$put =string(l)
61:"
62:py del d['-1']
63:$put =string(d)
64:"
65:" removing items out of range: silently skip items that don't exist
66:let l = [0, 1, 2, 3]
67:py l=vim.bindeval('l')
68:" The following two ranges delete nothing as they match empty list:
69:py del l[2:1]
70:$put =string(l)
71:py del l[2:2]
72:$put =string(l)
73:py del l[2:3]
74:$put =string(l)
75:let l = [0, 1, 2, 3]
76:py l=vim.bindeval('l')
77:py del l[2:4]
78:$put =string(l)
79:let l = [0, 1, 2, 3]
80:py l=vim.bindeval('l')
81:py del l[2:5]
82:$put =string(l)
83:let l = [0, 1, 2, 3]
84:py l=vim.bindeval('l')
85:py del l[2:6]
86:$put =string(l)
87:let l = [0, 1, 2, 3]
88:py l=vim.bindeval('l')
89:" The following two ranges delete nothing as they match empty list:
90:py del l[-1:2]
91:$put =string(l)
92:py del l[-2:2]
93:$put =string(l)
94:py del l[-3:2]
95:$put =string(l)
96:let l = [0, 1, 2, 3]
97:py l=vim.bindeval('l')
98:py del l[-4:2]
99:$put =string(l)
100:let l = [0, 1, 2, 3]
101:py l=vim.bindeval('l')
102:py del l[-5:2]
103:$put =string(l)
104:let l = [0, 1, 2, 3]
105:py l=vim.bindeval('l')
106:py del l[-6:2]
107:$put =string(l)
108:"
109:" Slice assignment to a list
110:let l = [0, 1, 2, 3]
111:py l=vim.bindeval('l')
112:py l[0:0]=['a']
113:$put =string(l)
114:let l = [0, 1, 2, 3]
115:py l=vim.bindeval('l')
116:py l[1:2]=['b']
117:$put =string(l)
118:let l = [0, 1, 2, 3]
119:py l=vim.bindeval('l')
120:py l[2:4]=['c']
121:$put =string(l)
122:let l = [0, 1, 2, 3]
123:py l=vim.bindeval('l')
124:py l[4:4]=['d']
125:$put =string(l)
126:let l = [0, 1, 2, 3]
127:py l=vim.bindeval('l')
128:py l[-1:2]=['e']
129:$put =string(l)
130:let l = [0, 1, 2, 3]
131:py l=vim.bindeval('l')
132:py l[-10:2]=['f']
133:$put =string(l)
134:let l = [0, 1, 2, 3]
135:py l=vim.bindeval('l')
136:py l[2:-10]=['g']
137:$put =string(l)
138:let l = []
139:py l=vim.bindeval('l')
140:py l[0:0]=['h']
141:$put =string(l)
142:"
143:" Locked variables
144:let l = [0, 1, 2, 3]
145:py l=vim.bindeval('l')
146:lockvar! l
147:py l[2]='i'
148:$put =string(l)
149:unlockvar! l
150:"
151:" Function calls
152:function New(...)
153:return ['NewStart']+a:000+['NewEnd']
154:endfunction
155:function DictNew(...) dict
156:return ['DictNewStart']+a:000+['DictNewEnd', self]
157:endfunction
158:let l=[function('New'), function('DictNew')]
159:py l=vim.bindeval('l')
160:py l.extend(list(l[0](1, 2, 3)))
161:$put =string(l)
162:py l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
163:$put =string(l)
164:py l.extend([l[0].name])
165:$put =string(l)
166:try
167: py l[1](1, 2, 3)
168:catch
169: $put =v:exception[:16]
170:endtry
171:delfunction New
172:try
173: py l[0](1, 2, 3)
174:catch
175: $put =v:exception[:16]
176:endtry
177:if has('float')
178: let l=[0.0]
179: py l=vim.bindeval('l')
180: py l.extend([0.0])
181: $put =string(l)
182:else
183: $put ='[0.0, 0.0]'
184:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200185:let messages=[]
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200186py <<EOF
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200187d=vim.bindeval('{}')
188m=vim.bindeval('messages')
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200189def em(expr, g=globals(), l=locals()):
190 try:
191 exec(expr, g, l)
192 except:
193 m.extend([sys.exc_type.__name__])
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200194
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200195em('d["abc"]')
196em('d["abc"]="\\0"')
197em('d["abc"]=vim')
198em('d[""]=1')
199em('d["a\\0b"]=1')
200em('d[u"a\\0b"]=1')
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200201EOF
202:$put =messages
Bram Moolenaar66b79852012-09-21 14:00:35 +0200203:unlet messages
204:" locked and scope attributes
205:let d={} | let dl={} | lockvar dl
206:for s in split("d dl v: g:")
207: let name=tr(s, ':', 's')
208: execute 'py '.name.'=vim.bindeval("'.s.'")'
209: let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".pyeval(name.".".v:val)'), ';')
210: $put =toput
211:endfor
212:silent! let d.abc=1
213:silent! let dl.abc=1
214:py d.locked=True
215:py dl.locked=False
216:silent! let d.def=1
217:silent! let dl.def=1
218:put ='d:'.string(d)
219:put ='dl:'.string(dl)
220:unlet d dl
221:
222:let l=[] | let ll=[] | lockvar ll
223:for s in split("l ll")
224: let name=tr(s, ':', 's')
225: execute 'py '.name.'=vim.bindeval("'.s.'")'
226: let toput=s.' : locked:'.pyeval(name.'.locked')
227: $put =toput
228:endfor
229:silent! call extend(l, [0])
230:silent! call extend(ll, [0])
231:py l.locked=True
232:py ll.locked=False
233:silent! call extend(l, [1])
234:silent! call extend(ll, [1])
235:put ='l:'.string(l)
236:put ='ll:'.string(ll)
237:unlet l ll
Bram Moolenaardb913952012-06-29 12:54:53 +0200238:"
239:" pyeval()
240:let l=pyeval('range(3)')
241:$put =string(l)
242:let d=pyeval('{"a": "b", "c": 1, "d": ["e"]}')
243:$put =sort(items(d))
Bram Moolenaardb913952012-06-29 12:54:53 +0200244:if has('float')
245: let f=pyeval('0.0')
246: $put =string(f)
247:else
248: $put ='0.0'
249:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200250:" Invalid values:
251:for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim']
252: try
253: let v=pyeval(e)
254: catch
255: let toput=e.":\t".v:exception[:13]
256: $put =toput
257: endtry
258:endfor
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100259:"
260:" threading
261:let l = [0]
262:py l=vim.bindeval('l')
263:py <<EOF
264import threading
265import time
266
267class T(threading.Thread):
268 def __init__(self):
269 threading.Thread.__init__(self)
270 self.t = 0
271 self.running = True
272
273 def run(self):
274 while self.running:
275 self.t += 1
276 time.sleep(0.1)
277
278t = T()
279t.start()
280EOF
281:sleep 1
282:py t.running = False
283:py t.join()
284:py l[0] = t.t > 8 # check if the background thread is working
285:$put =string(l)
286:"
287:" settrace
288:let l = []
289:py l=vim.bindeval('l')
290:py <<EOF
291import sys
292
293def traceit(frame, event, arg):
294 global l
295 if event == "line":
296 l.extend([frame.f_lineno])
297 return traceit
298
299def trace_main():
300 for i in range(5):
301 pass
302EOF
303:py sys.settrace(traceit)
304:py trace_main()
305:py sys.settrace(None)
306:$put =string(l)
Bram Moolenaar24b11fb2013-04-05 19:32:36 +0200307:"
308:" Slice
309:py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
310:py l = ll[:4]
311:$put =string(pyeval('l'))
312:py l = ll[2:]
313:$put =string(pyeval('l'))
314:py l = ll[:-4]
315:$put =string(pyeval('l'))
316:py l = ll[-2:]
317:$put =string(pyeval('l'))
318:py l = ll[2:4]
319:$put =string(pyeval('l'))
320:py l = ll[4:2]
321:$put =string(pyeval('l'))
322:py l = ll[-4:-2]
323:$put =string(pyeval('l'))
324:py l = ll[-2:-4]
325:$put =string(pyeval('l'))
326:py l = ll[:]
327:$put =string(pyeval('l'))
328:py l = ll[0:6]
329:$put =string(pyeval('l'))
330:py l = ll[-10:10]
331:$put =string(pyeval('l'))
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200332:"
333:" Vars
334:let g:foo = 'bac'
335:let w:abc = 'def'
336:let b:baz = 'bar'
Bram Moolenaara4720012013-05-15 16:27:37 +0200337:let t:bar = 'jkl'
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200338:try
339: throw "Abc"
340:catch
341: put =pyeval('vim.vvars[''exception'']')
342:endtry
343:put =pyeval('vim.vars[''foo'']')
344:put =pyeval('vim.current.window.vars[''abc'']')
345:put =pyeval('vim.current.buffer.vars[''baz'']')
Bram Moolenaara4720012013-05-15 16:27:37 +0200346:put =pyeval('vim.current.tabpage.vars[''bar'']')
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200347:"
348:" Options
349:" paste: boolean, global
350:" previewheight number, global
351:" operatorfunc: string, global
352:" number: boolean, window-local
353:" numberwidth: number, window-local
354:" colorcolumn: string, window-local
355:" statusline: string, window-local/global
356:" autoindent: boolean, buffer-local
Bram Moolenaar55b8ad32013-05-17 13:38:04 +0200357:" shiftwidth: number, buffer-local
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200358:" omnifunc: string, buffer-local
359:" preserveindent: boolean, buffer-local/global
360:" path: string, buffer-local/global
361:let g:bufs=[bufnr('%')]
362:new
363:let g:bufs+=[bufnr('%')]
364:vnew
365:let g:bufs+=[bufnr('%')]
366:wincmd j
367:vnew
368:let g:bufs+=[bufnr('%')]
369:wincmd l
370:fun RecVars(opt)
371: let gval =string(eval('&g:'.a:opt))
372: let wvals=join(map(range(1, 4), 'v:val.":".string(getwinvar(v:val, "&".a:opt))'))
373: let bvals=join(map(copy(g:bufs), 'v:val.":".string(getbufvar(v:val, "&".a:opt))'))
374: put =' G: '.gval
375: put =' W: '.wvals
376: put =' B: '.wvals
377:endfun
378py << EOF
379def e(s, g=globals(), l=locals()):
380 try:
381 exec(s, g, l)
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200382 except:
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200383 vim.command('return ' + repr(sys.exc_type.__name__))
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200384
385def ev(s, g=globals(), l=locals()):
386 try:
387 return eval(s, g, l)
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200388 except:
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200389 vim.command('let exc=' + repr(sys.exc_type.__name__))
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200390 return 0
391EOF
392:function E(s)
393: python e(vim.eval('a:s'))
394:endfunction
395:function Ev(s)
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200396: let r=pyeval('ev(vim.eval("a:s"))')
397: if exists('exc')
398: throw exc
399: endif
400: return r
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200401:endfunction
402:py gopts1=vim.options
403:py wopts1=vim.windows[2].options
404:py wopts2=vim.windows[0].options
405:py wopts3=vim.windows[1].options
406:py bopts1=vim.buffers[vim.bindeval("g:bufs")[2]].options
407:py bopts2=vim.buffers[vim.bindeval("g:bufs")[1]].options
408:py bopts3=vim.buffers[vim.bindeval("g:bufs")[0]].options
409:let lst=[]
410:let lst+=[['paste', 1, 0, 1, 2, 1, 1, 0 ]]
411:let lst+=[['previewheight', 5, 1, 6, 'a', 0, 1, 0 ]]
412:let lst+=[['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0 ]]
413:let lst+=[['number', 0, 1, 1, 0, 1, 0, 1 ]]
414:let lst+=[['numberwidth', 2, 3, 5, -100, 0, 0, 1 ]]
415:let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc', 0, 0, 1 ]]
416:let lst+=[['statusline', '1', '2', '4', 0, 0, 1, 1 ]]
417:let lst+=[['autoindent', 0, 1, 1, 2, 1, 0, 2 ]]
Bram Moolenaar55b8ad32013-05-17 13:38:04 +0200418:let lst+=[['shiftwidth', 0, 2, 1, 3, 0, 0, 2 ]]
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200419:let lst+=[['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2 ]]
420:let lst+=[['preserveindent', 0, 1, 1, 2, 1, 1, 2 ]]
421:let lst+=[['path', '.,,', ',,', '.', 0, 0, 1, 2 ]]
422:for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
423: py oname=vim.eval('oname')
424: py oval1=vim.bindeval('oval1')
425: py oval2=vim.bindeval('oval2')
426: py oval3=vim.bindeval('oval3')
427: if invval is 0 || invval is 1
428: py invval=bool(vim.bindeval('invval'))
429: else
430: py invval=vim.bindeval('invval')
431: endif
432: if bool
433: py oval1=bool(oval1)
434: py oval2=bool(oval2)
435: py oval3=bool(oval3)
436: endif
437: put ='>>> '.oname
438: for v in ['gopts1', 'wopts1', 'bopts1']
439: try
440: put =' p/'.v.': '.Ev('repr('.v.'['''.oname.'''])')
441: catch
442: put =' p/'.v.'! '.v:exception
443: endtry
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200444: let r=E(v.'['''.oname.''']=invval')
445: if r isnot 0
446: put =' inv: '.string(invval).'! '.r
447: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200448: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
449: let val=substitute(vv, '^.opts', 'oval', '')
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200450: let r=E(vv.'['''.oname.''']='.val)
451: if r isnot 0
452: put =' '.vv.'! '.r
453: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200454: endfor
455: endfor
456: call RecVars(oname)
457: for v in ['wopts3', 'bopts3']
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200458: let r=E('del '.v.'["'.oname.'"]')
459: if r isnot 0
460: put =' del '.v.'! '.r
461: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200462: endfor
463: call RecVars(oname)
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200464:endfor
465:only
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200466:for buf in g:bufs[1:]
467: execute 'bwipeout!' buf
468:endfor
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200469:"
470:" Test buffer object
471:vnew
472:put ='First line'
473:put ='Second line'
474:put ='Third line'
475:1 delete _
476:py b=vim.current.buffer
477:wincmd w
478:mark a
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200479:augroup BUFS
480: autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
481: autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
482:augroup END
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200483py << EOF
484cb = vim.current.buffer
485# Tests BufferAppend and BufferItem
486cb.append(b[0])
487# Tests BufferSlice and BufferAssSlice
488cb.append('abc') # Will be overwritten
489cb[-1:] = b[:-2]
490# Test BufferLength and BufferAssSlice
491cb.append('def') # Will not be overwritten
492cb[len(cb):] = b[:]
493# Test BufferAssItem and BufferMark
494cb.append('ghi') # Will be overwritten
495cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
496# Test BufferRepr
497cb.append(repr(cb) + repr(b))
498# Modify foreign buffer
499b.append('foo')
500b[0]='bar'
501b[0:0]=['baz']
502vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200503# Test assigning to name property
504old_name = cb.name
505cb.name = 'foo'
506cb.append(cb.name[-11:])
507b.name = 'bar'
508cb.append(b.name[-11:])
509cb.name = old_name
510cb.append(cb.name[-17:])
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200511# Test CheckBuffer
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200512for _b in vim.buffers:
513 if _b is not cb:
514 vim.command('bwipeout! ' + str(_b.number))
515del _b
516for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")', 'b.name = "!"'):
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200517 try:
518 exec(expr)
519 except vim.error:
520 pass
521 else:
522 # Usually a SEGV here
523 # Should not happen in any case
524 cb.append('No exception for ' + expr)
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200525vim.command('cd .')
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200526EOF
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200527:augroup BUFS
528: autocmd!
529:augroup END
530:augroup! BUFS
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200531:"
532:" Test vim.buffers object
533:set hidden
534:edit a
535:buffer #
536:edit b
537:buffer #
538:edit c
539:buffer #
540py << EOF
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200541try:
542 from __builtin__ import next
543except ImportError:
544 next = lambda o: o.next()
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200545# Check GCing iterator that was not fully exhausted
546i = iter(vim.buffers)
547cb.append('i:' + str(next(i)))
548# and also check creating more then one iterator at a time
549i2 = iter(vim.buffers)
550cb.append('i2:' + str(next(i2)))
551cb.append('i:' + str(next(i)))
552# The following should trigger GC and not cause any problems
553del i
554del i2
555i3 = iter(vim.buffers)
556cb.append('i3:' + str(next(i3)))
557del i3
558
559prevnum = 0
560for b in vim.buffers:
561 # Check buffer order
562 if prevnum >= b.number:
563 cb.append('!!! Buffer numbers not in strictly ascending order')
564 # Check indexing: vim.buffers[number].number == number
565 cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + '=' + repr(b))
566 prevnum = b.number
567
568cb.append(str(len(vim.buffers)))
569
570bnums = list(map(lambda b: b.number, vim.buffers))[1:]
571
572# Test wiping out buffer with existing iterator
573i4 = iter(vim.buffers)
574cb.append('i4:' + str(next(i4)))
575vim.command('bwipeout! ' + str(bnums.pop(0)))
576try:
577 next(i4)
578except vim.error:
579 pass
580else:
581 cb.append('!!!! No vim.error')
582i4 = iter(vim.buffers)
583vim.command('bwipeout! ' + str(bnums.pop(-1)))
584vim.command('bwipeout! ' + str(bnums.pop(-1)))
585cb.append('i4:' + str(next(i4)))
586try:
587 next(i4)
588except StopIteration:
589 cb.append('StopIteration')
590EOF
Bram Moolenaara4720012013-05-15 16:27:37 +0200591:"
592:" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
593:tabnew 0
594:tabnew 1
595:vnew a.1
596:tabnew 2
597:vnew a.2
598:vnew b.2
599:vnew c.2
600py << EOF
601cb.append('Number of tabs: ' + str(len(vim.tabpages)))
602cb.append('Current tab pages:')
603def W(w):
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200604 if repr(w).find('(unknown)') != -1:
Bram Moolenaara4720012013-05-15 16:27:37 +0200605 return '<window object (unknown)>'
606 else:
607 return repr(w)
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200608
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200609start = len(cb)
610
611def Cursor(w):
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200612 if w.buffer is cb:
613 return repr((start - w.cursor[0], w.cursor[1]))
614 else:
615 return repr(w.cursor)
616
Bram Moolenaara4720012013-05-15 16:27:37 +0200617for t in vim.tabpages:
618 cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window))
619 cb.append(' Windows:')
620 for w in t.windows:
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200621 cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w))
Bram Moolenaara4720012013-05-15 16:27:37 +0200622 # Other values depend on the size of the terminal, so they are checked partly:
623 for attr in ('height', 'row', 'width', 'col'):
624 try:
625 aval = getattr(w, attr)
626 if type(aval) is not long:
627 raise TypeError
628 if aval < 0:
629 raise ValueError
630 except Exception:
631 cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + sys.exc_type.__name__)
632 w.cursor = (len(w.buffer), 0)
633cb.append('Number of windows in current tab page: ' + str(len(vim.windows)))
634if list(vim.windows) != list(vim.current.tabpage.windows):
635 cb.append('!!!!!! Windows differ')
636EOF
637:"
638:" Test vim.current
639py << EOF
640def H(o):
641 return repr(o)
642cb.append('Current tab page: ' + repr(vim.current.tabpage))
643cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
644cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer))
645# Assigning: fails
646try:
647 vim.current.window = vim.tabpages[0].window
648except ValueError:
649 cb.append('ValueError at assigning foreign tab window')
650
651for attr in ('window', 'tabpage', 'buffer'):
652 try:
653 setattr(vim.current, attr, None)
654 except TypeError:
655 cb.append('Type error at assigning None to vim.current.' + attr)
656
657# Assigning: success
658vim.current.tabpage = vim.tabpages[-2]
659vim.current.buffer = cb
660vim.current.window = vim.windows[0]
661vim.current.window.cursor = (len(vim.current.buffer), 0)
662cb.append('Current tab page: ' + repr(vim.current.tabpage))
663cb.append('Current window: ' + repr(vim.current.window))
664cb.append('Current buffer: ' + repr(vim.current.buffer))
665cb.append('Current line: ' + repr(vim.current.line))
666for b in vim.buffers:
667 if b is not cb:
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200668 vim.command('bwipeout! ' + str(b.number))
Bram Moolenaara4720012013-05-15 16:27:37 +0200669EOF
670:tabonly!
671:only!
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200672:"
673:" Test types
674py << EOF
675for expr, attr in (
676 ('vim.vars', 'Dictionary'),
677 ('vim.options', 'Options'),
678 ('vim.bindeval("{}")', 'Dictionary'),
679 ('vim.bindeval("[]")', 'List'),
680 ('vim.bindeval("function(\'tr\')")', 'Function'),
681 ('vim.current.buffer', 'Buffer'),
682 ('vim.current.range', 'Range'),
683 ('vim.current.window', 'Window'),
684 ('vim.current.tabpage', 'TabPage'),
685):
686 cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
687EOF
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200688:"
689:" Test exceptions
690:fun Exe(e)
691: execute a:e
692:endfun
693py << EOF
694def ee(expr, g=globals(), l=locals()):
695 try:
696 exec(expr, g, l)
697 except:
698 cb.append(repr(sys.exc_info()[:2]))
699Exe = vim.bindeval('function("Exe")')
700ee('vim.command("throw \'abc\'")')
701ee('Exe("throw \'def\'")')
702ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
703ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
704ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
705ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
706EOF
Bram Moolenaardb913952012-06-29 12:54:53 +0200707:endfun
708:"
709:call Test()
710:"
711:delfunc Test
712:call garbagecollect(1)
713:"
714:/^start:/,$wq! test.out
Bram Moolenaar66b79852012-09-21 14:00:35 +0200715:call getchar()
Bram Moolenaardb913952012-06-29 12:54:53 +0200716ENDTEST
717
718start: