blob: fc61848e0a03bfa5ec4bfc83644a371ba3446481 [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
8
Bram Moolenaardb913952012-06-29 12:54:53 +02009STARTTEST
10:so small.vim
11:if !has('python') | e! test.ok | wq! test.out | endif
12: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=[]
186:py <<EOF
187d=vim.bindeval('{}')
188m=vim.bindeval('messages')
189try:
190 d['abc']
191except Exception as e:
192 m.extend([e.__class__.__name__])
193
194try:
195 d['abc']="\0"
196except Exception as e:
197 m.extend([e.__class__.__name__])
198
199try:
200 d['abc']=vim
201except Exception as e:
202 m.extend([e.__class__.__name__])
203
204try:
205 d['']=1
206except Exception as e:
207 m.extend([e.__class__.__name__])
208
209try:
210 d['a\0b']=1
211except Exception as e:
212 m.extend([e.__class__.__name__])
213
214try:
215 d[b'a\0b']=1
216except Exception as e:
217 m.extend([e.__class__.__name__])
218EOF
219:$put =messages
Bram Moolenaar66b79852012-09-21 14:00:35 +0200220:unlet messages
221:" locked and scope attributes
222:let d={} | let dl={} | lockvar dl
223:for s in split("d dl v: g:")
224: let name=tr(s, ':', 's')
225: execute 'py '.name.'=vim.bindeval("'.s.'")'
226: let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".pyeval(name.".".v:val)'), ';')
227: $put =toput
228:endfor
229:silent! let d.abc=1
230:silent! let dl.abc=1
231:py d.locked=True
232:py dl.locked=False
233:silent! let d.def=1
234:silent! let dl.def=1
235:put ='d:'.string(d)
236:put ='dl:'.string(dl)
237:unlet d dl
238:
239:let l=[] | let ll=[] | lockvar ll
240:for s in split("l ll")
241: let name=tr(s, ':', 's')
242: execute 'py '.name.'=vim.bindeval("'.s.'")'
243: let toput=s.' : locked:'.pyeval(name.'.locked')
244: $put =toput
245:endfor
246:silent! call extend(l, [0])
247:silent! call extend(ll, [0])
248:py l.locked=True
249:py ll.locked=False
250:silent! call extend(l, [1])
251:silent! call extend(ll, [1])
252:put ='l:'.string(l)
253:put ='ll:'.string(ll)
254:unlet l ll
Bram Moolenaardb913952012-06-29 12:54:53 +0200255:"
256:" pyeval()
257:let l=pyeval('range(3)')
258:$put =string(l)
259:let d=pyeval('{"a": "b", "c": 1, "d": ["e"]}')
260:$put =sort(items(d))
Bram Moolenaardb913952012-06-29 12:54:53 +0200261:if has('float')
262: let f=pyeval('0.0')
263: $put =string(f)
264:else
265: $put ='0.0'
266:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200267:" Invalid values:
268:for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim']
269: try
270: let v=pyeval(e)
271: catch
272: let toput=e.":\t".v:exception[:13]
273: $put =toput
274: endtry
275:endfor
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100276:"
277:" threading
278:let l = [0]
279:py l=vim.bindeval('l')
280:py <<EOF
281import threading
282import time
283
284class T(threading.Thread):
285 def __init__(self):
286 threading.Thread.__init__(self)
287 self.t = 0
288 self.running = True
289
290 def run(self):
291 while self.running:
292 self.t += 1
293 time.sleep(0.1)
294
295t = T()
296t.start()
297EOF
298:sleep 1
299:py t.running = False
300:py t.join()
301:py l[0] = t.t > 8 # check if the background thread is working
302:$put =string(l)
303:"
304:" settrace
305:let l = []
306:py l=vim.bindeval('l')
307:py <<EOF
308import sys
309
310def traceit(frame, event, arg):
311 global l
312 if event == "line":
313 l.extend([frame.f_lineno])
314 return traceit
315
316def trace_main():
317 for i in range(5):
318 pass
319EOF
320:py sys.settrace(traceit)
321:py trace_main()
322:py sys.settrace(None)
323:$put =string(l)
Bram Moolenaar24b11fb2013-04-05 19:32:36 +0200324:"
325:" Slice
326:py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
327:py l = ll[:4]
328:$put =string(pyeval('l'))
329:py l = ll[2:]
330:$put =string(pyeval('l'))
331:py l = ll[:-4]
332:$put =string(pyeval('l'))
333:py l = ll[-2:]
334:$put =string(pyeval('l'))
335:py l = ll[2:4]
336:$put =string(pyeval('l'))
337:py l = ll[4:2]
338:$put =string(pyeval('l'))
339:py l = ll[-4:-2]
340:$put =string(pyeval('l'))
341:py l = ll[-2:-4]
342:$put =string(pyeval('l'))
343:py l = ll[:]
344:$put =string(pyeval('l'))
345:py l = ll[0:6]
346:$put =string(pyeval('l'))
347:py l = ll[-10:10]
348:$put =string(pyeval('l'))
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200349:"
350:" Vars
351:let g:foo = 'bac'
352:let w:abc = 'def'
353:let b:baz = 'bar'
354:try
355: throw "Abc"
356:catch
357: put =pyeval('vim.vvars[''exception'']')
358:endtry
359:put =pyeval('vim.vars[''foo'']')
360:put =pyeval('vim.current.window.vars[''abc'']')
361:put =pyeval('vim.current.buffer.vars[''baz'']')
Bram Moolenaardb913952012-06-29 12:54:53 +0200362:endfun
363:"
364:call Test()
365:"
366:delfunc Test
367:call garbagecollect(1)
368:"
369:/^start:/,$wq! test.out
Bram Moolenaar66b79852012-09-21 14:00:35 +0200370:call getchar()
Bram Moolenaardb913952012-06-29 12:54:53 +0200371ENDTEST
372
373start: