blob: d138a8d6a9ee5321591dbeafc59ba109619bcd64 [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
479py << EOF
480cb = vim.current.buffer
481# Tests BufferAppend and BufferItem
482cb.append(b[0])
483# Tests BufferSlice and BufferAssSlice
484cb.append('abc') # Will be overwritten
485cb[-1:] = b[:-2]
486# Test BufferLength and BufferAssSlice
487cb.append('def') # Will not be overwritten
488cb[len(cb):] = b[:]
489# Test BufferAssItem and BufferMark
490cb.append('ghi') # Will be overwritten
491cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
492# Test BufferRepr
493cb.append(repr(cb) + repr(b))
494# Modify foreign buffer
495b.append('foo')
496b[0]='bar'
497b[0:0]=['baz']
498vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
499# Test CheckBuffer
500vim.command('bwipeout! ' + str(b.number))
501for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
502 try:
503 exec(expr)
504 except vim.error:
505 pass
506 else:
507 # Usually a SEGV here
508 # Should not happen in any case
509 cb.append('No exception for ' + expr)
510EOF
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200511:"
512:" Test vim.buffers object
513:set hidden
514:edit a
515:buffer #
516:edit b
517:buffer #
518:edit c
519:buffer #
520py << EOF
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200521try:
522 from __builtin__ import next
523except ImportError:
524 next = lambda o: o.next()
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200525# Check GCing iterator that was not fully exhausted
526i = iter(vim.buffers)
527cb.append('i:' + str(next(i)))
528# and also check creating more then one iterator at a time
529i2 = iter(vim.buffers)
530cb.append('i2:' + str(next(i2)))
531cb.append('i:' + str(next(i)))
532# The following should trigger GC and not cause any problems
533del i
534del i2
535i3 = iter(vim.buffers)
536cb.append('i3:' + str(next(i3)))
537del i3
538
539prevnum = 0
540for b in vim.buffers:
541 # Check buffer order
542 if prevnum >= b.number:
543 cb.append('!!! Buffer numbers not in strictly ascending order')
544 # Check indexing: vim.buffers[number].number == number
545 cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + '=' + repr(b))
546 prevnum = b.number
547
548cb.append(str(len(vim.buffers)))
549
550bnums = list(map(lambda b: b.number, vim.buffers))[1:]
551
552# Test wiping out buffer with existing iterator
553i4 = iter(vim.buffers)
554cb.append('i4:' + str(next(i4)))
555vim.command('bwipeout! ' + str(bnums.pop(0)))
556try:
557 next(i4)
558except vim.error:
559 pass
560else:
561 cb.append('!!!! No vim.error')
562i4 = iter(vim.buffers)
563vim.command('bwipeout! ' + str(bnums.pop(-1)))
564vim.command('bwipeout! ' + str(bnums.pop(-1)))
565cb.append('i4:' + str(next(i4)))
566try:
567 next(i4)
568except StopIteration:
569 cb.append('StopIteration')
570EOF
Bram Moolenaara4720012013-05-15 16:27:37 +0200571:"
572:" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
573:tabnew 0
574:tabnew 1
575:vnew a.1
576:tabnew 2
577:vnew a.2
578:vnew b.2
579:vnew c.2
580py << EOF
581cb.append('Number of tabs: ' + str(len(vim.tabpages)))
582cb.append('Current tab pages:')
583def W(w):
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200584 if repr(w).find('(unknown)') != -1:
Bram Moolenaara4720012013-05-15 16:27:37 +0200585 return '<window object (unknown)>'
586 else:
587 return repr(w)
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200588
589def Cursor(w, start=len(cb)):
590 if w.buffer is cb:
591 return repr((start - w.cursor[0], w.cursor[1]))
592 else:
593 return repr(w.cursor)
594
Bram Moolenaara4720012013-05-15 16:27:37 +0200595for t in vim.tabpages:
596 cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window))
597 cb.append(' Windows:')
598 for w in t.windows:
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200599 cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w))
Bram Moolenaara4720012013-05-15 16:27:37 +0200600 # Other values depend on the size of the terminal, so they are checked partly:
601 for attr in ('height', 'row', 'width', 'col'):
602 try:
603 aval = getattr(w, attr)
604 if type(aval) is not long:
605 raise TypeError
606 if aval < 0:
607 raise ValueError
608 except Exception:
609 cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + sys.exc_type.__name__)
610 w.cursor = (len(w.buffer), 0)
611cb.append('Number of windows in current tab page: ' + str(len(vim.windows)))
612if list(vim.windows) != list(vim.current.tabpage.windows):
613 cb.append('!!!!!! Windows differ')
614EOF
615:"
616:" Test vim.current
617py << EOF
618def H(o):
619 return repr(o)
620cb.append('Current tab page: ' + repr(vim.current.tabpage))
621cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
622cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer))
623# Assigning: fails
624try:
625 vim.current.window = vim.tabpages[0].window
626except ValueError:
627 cb.append('ValueError at assigning foreign tab window')
628
629for attr in ('window', 'tabpage', 'buffer'):
630 try:
631 setattr(vim.current, attr, None)
632 except TypeError:
633 cb.append('Type error at assigning None to vim.current.' + attr)
634
635# Assigning: success
636vim.current.tabpage = vim.tabpages[-2]
637vim.current.buffer = cb
638vim.current.window = vim.windows[0]
639vim.current.window.cursor = (len(vim.current.buffer), 0)
640cb.append('Current tab page: ' + repr(vim.current.tabpage))
641cb.append('Current window: ' + repr(vim.current.window))
642cb.append('Current buffer: ' + repr(vim.current.buffer))
643cb.append('Current line: ' + repr(vim.current.line))
644for b in vim.buffers:
645 if b is not cb:
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200646 vim.command('bwipeout! ' + str(b.number))
Bram Moolenaara4720012013-05-15 16:27:37 +0200647EOF
648:tabonly!
649:only!
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200650:"
651:" Test types
652py << EOF
653for expr, attr in (
654 ('vim.vars', 'Dictionary'),
655 ('vim.options', 'Options'),
656 ('vim.bindeval("{}")', 'Dictionary'),
657 ('vim.bindeval("[]")', 'List'),
658 ('vim.bindeval("function(\'tr\')")', 'Function'),
659 ('vim.current.buffer', 'Buffer'),
660 ('vim.current.range', 'Range'),
661 ('vim.current.window', 'Window'),
662 ('vim.current.tabpage', 'TabPage'),
663):
664 cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
665EOF
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200666:"
667:" Test exceptions
668:fun Exe(e)
669: execute a:e
670:endfun
671py << EOF
672def ee(expr, g=globals(), l=locals()):
673 try:
674 exec(expr, g, l)
675 except:
676 cb.append(repr(sys.exc_info()[:2]))
677Exe = vim.bindeval('function("Exe")')
678ee('vim.command("throw \'abc\'")')
679ee('Exe("throw \'def\'")')
680ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
681ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
682ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
683ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
684EOF
Bram Moolenaardb913952012-06-29 12:54:53 +0200685:endfun
686:"
687:call Test()
688:"
689:delfunc Test
690:call garbagecollect(1)
691:"
692:/^start:/,$wq! test.out
Bram Moolenaar66b79852012-09-21 14:00:35 +0200693:call getchar()
Bram Moolenaardb913952012-06-29 12:54:53 +0200694ENDTEST
695
696start: