blob: 6f3cce0fa02c6591bbf4e913ac1f4c363535d47b [file] [log] [blame]
Bram Moolenaardb913952012-06-29 12:54:53 +02001Tests for various python features. vim: set ft=vim :
2
3STARTTEST
4:so small.vim
5:if !has('python3') | e! test.ok | wq! test.out | endif
6:py3 import vim
7:fun Test()
8:let l = []
9:py3 l=vim.bindeval('l')
10:py3 f=vim.bindeval('function("strlen")')
11:" Extending List directly with different types
12:py3 l+=[1, "as'd", [1, 2, f, {'a': 1}]]
13:$put =string(l)
14:$put =string(l[-1])
15:try
16: $put =string(l[-4])
17:catch
18: $put =v:exception[:13]
19:endtry
20:" List assignment
21:py3 l[0]=0
22:$put =string(l)
23:py3 l[-2]=f
24:$put =string(l)
25:"
26:" Extending Dictionary directly with different types
27:let d = {}
28:py3 d=vim.bindeval('d')
29:py3 d['1']='asd'
30:py3 d['b']=[1, 2, f]
31:py3 d['-1']={'a': 1}
32:let dkeys = []
33:py3 dk=vim.bindeval('dkeys')
34:py3 dkeys=d.keys()
35:py3 dkeys.sort()
36:py3 dk+=dkeys
37:$put =string(dkeys)
38:for [key, val] in sort(items(d))
39: $put =string(key) . ' : ' . string(val)
40: unlet key val
41:endfor
42:"
43:" removing items with del
44:py3 del l[2]
45:$put =string(l)
46:let l = range(8)
47:py3 l=vim.bindeval('l')
48:try
49: py3 del l[:3]
50: py3 del l[1:]
51:catch
52: $put =v:exception
53:endtry
54:$put =string(l)
55:"
56:py3 del d['-1']
57:$put =string(d)
58:"
59:" removing items out of range: silently skip items that don't exist
60:let l = [0, 1, 2, 3]
61:py3 l=vim.bindeval('l')
62:" The following two ranges delete nothing as they match empty list:
63:py3 del l[2:1]
64:$put =string(l)
65:py3 del l[2:2]
66:$put =string(l)
67:py3 del l[2:3]
68:$put =string(l)
69:let l = [0, 1, 2, 3]
70:py3 l=vim.bindeval('l')
71:py3 del l[2:4]
72:$put =string(l)
73:let l = [0, 1, 2, 3]
74:py3 l=vim.bindeval('l')
75:py3 del l[2:5]
76:$put =string(l)
77:let l = [0, 1, 2, 3]
78:py3 l=vim.bindeval('l')
79:py3 del l[2:6]
80:$put =string(l)
81:let l = [0, 1, 2, 3]
82:py3 l=vim.bindeval('l')
83:" The following two ranges delete nothing as they match empty list:
84:py3 del l[-1:2]
85:$put =string(l)
86:py3 del l[-2:2]
87:$put =string(l)
88:py3 del l[-3:2]
89:$put =string(l)
90:let l = [0, 1, 2, 3]
91:py3 l=vim.bindeval('l')
92:py3 del l[-4:2]
93:$put =string(l)
94:let l = [0, 1, 2, 3]
95:py3 l=vim.bindeval('l')
96:py3 del l[-5:2]
97:$put =string(l)
98:let l = [0, 1, 2, 3]
99:py3 l=vim.bindeval('l')
100:py3 del l[-6:2]
101:$put =string(l)
102:"
103:" Slice assignment to a list
104:let l = [0, 1, 2, 3]
105:py3 l=vim.bindeval('l')
106:py3 l[0:0]=['a']
107:$put =string(l)
108:let l = [0, 1, 2, 3]
109:py3 l=vim.bindeval('l')
110:py3 l[1:2]=['b']
111:$put =string(l)
112:let l = [0, 1, 2, 3]
113:py3 l=vim.bindeval('l')
114:py3 l[2:4]=['c']
115:$put =string(l)
116:let l = [0, 1, 2, 3]
117:py3 l=vim.bindeval('l')
118:py3 l[4:4]=['d']
119:$put =string(l)
120:let l = [0, 1, 2, 3]
121:py3 l=vim.bindeval('l')
122:py3 l[-1:2]=['e']
123:$put =string(l)
124:let l = [0, 1, 2, 3]
125:py3 l=vim.bindeval('l')
126:py3 l[-10:2]=['f']
127:$put =string(l)
128:let l = [0, 1, 2, 3]
129:py3 l=vim.bindeval('l')
130:py3 l[2:-10]=['g']
131:$put =string(l)
132:let l = []
133:py3 l=vim.bindeval('l')
134:py3 l[0:0]=['h']
135:$put =string(l)
136:"
137:" Locked variables
138:let l = [0, 1, 2, 3]
139:py3 l=vim.bindeval('l')
140:lockvar! l
141:py3 l[2]='i'
142:$put =string(l)
143:unlockvar! l
144:"
145:" Function calls
146:function New(...)
147:return ['NewStart']+a:000+['NewEnd']
148:endfunction
149:function DictNew(...) dict
150:return ['DictNewStart']+a:000+['DictNewEnd', self]
151:endfunction
152:let l=[function('New'), function('DictNew')]
153:py3 l=vim.bindeval('l')
154:py3 l.extend(list(l[0](1, 2, 3)))
155:$put =string(l)
156:py3 l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
157:$put =string(l)
158:py3 l+=[l[0].name]
159:$put =string(l)
160:try
161: py3 l[1](1, 2, 3)
162:catch
163: $put =v:exception[:13]
164:endtry
165:delfunction New
166:try
167: py3 l[0](1, 2, 3)
168:catch
169: $put =v:exception[:13]
170:endtry
171:if has('float')
172: let l=[0.0]
173: py3 l=vim.bindeval('l')
174: py3 l.extend([0.0])
175: $put =string(l)
176:else
177: $put ='[0.0, 0.0]'
178:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200179:let messages=[]
180:py3 <<EOF
181d=vim.bindeval('{}')
182m=vim.bindeval('messages')
183try:
184 d['abc']
185except Exception as e:
186 m.extend([e.__class__.__name__])
187
188try:
189 d['abc']="\0"
190except Exception as e:
191 m.extend([e.__class__.__name__])
192
193try:
194 d['abc']=vim
195except Exception as e:
196 m.extend([e.__class__.__name__])
197
198try:
199 d['']=1
200except Exception as e:
201 m.extend([e.__class__.__name__])
202
203try:
204 d['a\0b']=1
205except Exception as e:
206 m.extend([e.__class__.__name__])
207
208try:
209 d[b'a\0b']=1
210except Exception as e:
211 m.extend([e.__class__.__name__])
212EOF
213:$put =messages
Bram Moolenaar66b79852012-09-21 14:00:35 +0200214:unlet messages
215:" locked and scope attributes
216:let d={} | let dl={} | lockvar dl
217:for s in split("d dl v: g:")
218: let name=tr(s, ':', 's')
219: execute 'py3 '.name.'=vim.bindeval("'.s.'")'
220: let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".py3eval(name.".".v:val)'), ';')
221: $put =toput
222:endfor
223:silent! let d.abc=1
224:silent! let dl.abc=1
225:py3 d.locked=True
226:py3 dl.locked=False
227:silent! let d.def=1
228:silent! let dl.def=1
229:put ='d:'.string(d)
230:put ='dl:'.string(dl)
231:unlet d dl
232:
233:let l=[] | let ll=[] | lockvar ll
234:for s in split("l ll")
235: let name=tr(s, ':', 's')
236: execute 'py3 '.name.'=vim.bindeval("'.s.'")'
237: let toput=s.' : locked:'.py3eval(name.'.locked')
238: $put =toput
239:endfor
240:silent! call extend(l, [0])
241:silent! call extend(ll, [0])
242:py3 l.locked=True
243:py3 ll.locked=False
244:silent! call extend(l, [1])
245:silent! call extend(ll, [1])
246:put ='l:'.string(l)
247:put ='ll:'.string(ll)
248:unlet l ll
Bram Moolenaardb913952012-06-29 12:54:53 +0200249:"
250:" py3eval()
251:let l=py3eval('[0, 1, 2]')
252:$put =string(l)
253:let d=py3eval('{"a": "b", "c": 1, "d": ["e"]}')
254:$put =sort(items(d))
Bram Moolenaardb913952012-06-29 12:54:53 +0200255:if has('float')
256: let f=py3eval('0.0')
257: $put =string(f)
258:else
259: $put ='0.0'
260:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200261:" Invalid values:
262:for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim']
263: try
264: let v=py3eval(e)
265: catch
266: let toput=e.":\t".v:exception[:13]
267: $put =toput
268: endtry
269:endfor
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100270:"
271:" threading
272:let l = [0]
273:py3 l=vim.bindeval('l')
274:py3 <<EOF
275import threading
276import time
277
278class T(threading.Thread):
279 def __init__(self):
280 threading.Thread.__init__(self)
281 self.t = 0
282 self.running = True
283
284 def run(self):
285 while self.running:
286 self.t += 1
287 time.sleep(0.1)
288
289t = T()
290t.start()
291EOF
292:sleep 1
293:py3 t.running = False
294:py3 t.join()
295:py3 l[0] = t.t > 8 # check if the background thread is working
296:$put =string(l)
297:"
298:" settrace
299:let l = []
300:py3 l=vim.bindeval('l')
301:py3 <<EOF
302import sys
303
304def traceit(frame, event, arg):
305 global l
306 if event == "line":
307 l += [frame.f_lineno]
308 return traceit
309
310def trace_main():
311 for i in range(5):
312 pass
313EOF
314:py3 sys.settrace(traceit)
315:py3 trace_main()
316:py3 sys.settrace(None)
317:$put =string(l)
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200318:"
319:" Vars
320:let g:foo = 'bac'
321:let w:abc = 'def'
322:let b:baz = 'bar'
323:try
324: throw "Abc"
325:catch
326: put =py3eval('vim.vvars[''exception'']')
327:endtry
328:put =py3eval('vim.vars[''foo'']')
329:put =py3eval('vim.current.window.vars[''abc'']')
330:put =py3eval('vim.current.buffer.vars[''baz'']')
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200331:"
332:" Options
333:" paste: boolean, global
334:" previewheight number, global
335:" operatorfunc: string, global
336:" number: boolean, window-local
337:" numberwidth: number, window-local
338:" colorcolumn: string, window-local
339:" statusline: string, window-local/global
340:" autoindent: boolean, buffer-local
341:" iminsert: number, buffer-local
342:" omnifunc: string, buffer-local
343:" preserveindent: boolean, buffer-local/global
344:" path: string, buffer-local/global
345:let g:bufs=[bufnr('%')]
346:new
347:let g:bufs+=[bufnr('%')]
348:vnew
349:let g:bufs+=[bufnr('%')]
350:wincmd j
351:vnew
352:let g:bufs+=[bufnr('%')]
353:wincmd l
354:fun RecVars(opt)
355: let gval =string(eval('&g:'.a:opt))
356: let wvals=join(map(range(1, 4), 'v:val.":".string(getwinvar(v:val, "&".a:opt))'))
357: let bvals=join(map(copy(g:bufs), 'v:val.":".string(getbufvar(v:val, "&".a:opt))'))
358: put =' G: '.gval
359: put =' W: '.wvals
360: put =' B: '.wvals
361:endfun
362py3 << EOF
363def e(s, g=globals(), l=locals()):
364 try:
365 exec(s, g, l)
366 except Exception as e:
367 vim.command('throw ' + repr(e.__class__.__name__))
368
369def ev(s, g=globals(), l=locals()):
370 try:
371 return eval(s, g, l)
372 except Exception as e:
373 vim.command('throw ' + repr(e.__class__.__name__))
374 return 0
375EOF
376:function E(s)
377: python3 e(vim.eval('a:s'))
378:endfunction
379:function Ev(s)
380: return py3eval('ev(vim.eval("a:s"))')
381:endfunction
382:py3 gopts1=vim.options
383:py3 wopts1=vim.windows[2].options
384:py3 wopts2=vim.windows[0].options
385:py3 wopts3=vim.windows[1].options
386:py3 bopts1=vim.buffers[vim.bindeval("g:bufs")[2]].options
387:py3 bopts2=vim.buffers[vim.bindeval("g:bufs")[1]].options
388:py3 bopts3=vim.buffers[vim.bindeval("g:bufs")[0]].options
389:let lst=[]
390:let lst+=[['paste', 1, 0, 1, 2, 1, 1, 0 ]]
391:let lst+=[['previewheight', 5, 1, 6, 'a', 0, 1, 0 ]]
392:let lst+=[['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0 ]]
393:let lst+=[['number', 0, 1, 1, 0, 1, 0, 1 ]]
394:let lst+=[['numberwidth', 2, 3, 5, -100, 0, 0, 1 ]]
395:let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc', 0, 0, 1 ]]
396:let lst+=[['statusline', '1', '2', '4', 0, 0, 1, 1 ]]
397:let lst+=[['autoindent', 0, 1, 1, 2, 1, 0, 2 ]]
398:let lst+=[['iminsert', 0, 2, 1, 3, 0, 0, 2 ]]
399:let lst+=[['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2 ]]
400:let lst+=[['preserveindent', 0, 1, 1, 2, 1, 1, 2 ]]
401:let lst+=[['path', '.,,', ',,', '.', 0, 0, 1, 2 ]]
402:for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
403: py3 oname=vim.eval('oname')
404: py3 oval1=vim.bindeval('oval1')
405: py3 oval2=vim.bindeval('oval2')
406: py3 oval3=vim.bindeval('oval3')
407: if invval is 0 || invval is 1
408: py3 invval=bool(vim.bindeval('invval'))
409: else
410: py3 invval=vim.bindeval('invval')
411: endif
412: if bool
413: py3 oval1=bool(oval1)
414: py3 oval2=bool(oval2)
415: py3 oval3=bool(oval3)
416: endif
417: put ='>>> '.oname
418: for v in ['gopts1', 'wopts1', 'bopts1']
419: try
420: put =' p/'.v.': '.Ev('repr('.v.'['''.oname.'''])')
421: catch
422: put =' p/'.v.'! '.v:exception
423: endtry
424: try
425: call E(v.'["'.oname.'"]=invval')
426: catch
427: put =' inv: '.string(invval).'! '.v:exception
428: endtry
429: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
430: let val=substitute(vv, '^.opts', 'oval', '')
431: try
432: call E(vv.'["'.oname.'"]='.val)
433: catch
434: put =' '.vv.'! '.v:exception
435: endtry
436: endfor
437: endfor
438: call RecVars(oname)
439: for v in ['wopts3', 'bopts3']
440: try
441: call E('del '.v.'["'.oname.'"]')
442: catch
443: put =' del '.v.'! '.v:exception
444: endtry
445: endfor
446: call RecVars(oname)
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200447:endfor
448:only
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200449:"
450:" Test buffer object
451:vnew
452:put ='First line'
453:put ='Second line'
454:put ='Third line'
455:1 delete _
456:py3 b=vim.current.buffer
457:wincmd w
458:mark a
459py3 << EOF
460cb = vim.current.buffer
461# Tests BufferAppend and BufferItem
462cb.append(b[0])
463# Tests BufferSlice and BufferAssSlice
464cb.append('abc') # Will be overwritten
465cb[-1:] = b[:-2]
466# Test BufferLength and BufferAssSlice
467cb.append('def') # Will not be overwritten
468cb[len(cb):] = b[:]
469# Test BufferAssItem and BufferMark
470cb.append('ghi') # Will be overwritten
471cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
472# Test BufferRepr
473cb.append(repr(cb) + repr(b))
474# Modify foreign buffer
475b.append('foo')
476b[0]='bar'
477b[0:0]=['baz']
478vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
479# Test CheckBuffer
480vim.command('bwipeout! ' + str(b.number))
481for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
482 try:
483 exec(expr)
484 except vim.error:
485 pass
486 else:
487 # Usually a SEGV here
488 # Should not happen in any case
489 cb.append('No exception for ' + expr)
490EOF
Bram Moolenaardb913952012-06-29 12:54:53 +0200491:endfun
492:"
493:call Test()
494:"
495:delfunc Test
496:call garbagecollect(1)
497:"
498:/^start:/,$wq! test.out
499ENDTEST
500
501start: