blob: e24c13d1ca0ae752e39ffe4d96392e6e8b94adba [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
Bram Moolenaar8600e402013-05-30 13:28:41 +020010:set encoding=latin1
Bram Moolenaar9f3685a2013-06-12 14:20:36 +020011:set noswapfile
Bram Moolenaar5a4c3082019-12-01 15:23:11 +010012:if !has('python') || !has('quickfix') | e! test.ok | wq! test.out | endif
Bram Moolenaarc24c1ac2013-05-16 20:47:56 +020013:lang C
Bram Moolenaardb913952012-06-29 12:54:53 +020014:fun Test()
Bram Moolenaar841fbd22013-06-23 14:37:07 +020015:py import vim
Bram Moolenaar8110a092016-04-14 15:56:09 +020016:py cb = vim.current.buffer
Bram Moolenaardb913952012-06-29 12:54:53 +020017:let l = []
18:py l=vim.bindeval('l')
19:py f=vim.bindeval('function("strlen")')
20:" Extending List directly with different types
21:py l.extend([1, "as'd", [1, 2, f, {'a': 1}]])
22:$put =string(l)
23:$put =string(l[-1])
24:try
25: $put =string(l[-4])
26:catch
27: $put =v:exception[:13]
28:endtry
29:" List assignment
30:py l[0]=0
31:$put =string(l)
32:py l[-2]=f
33:$put =string(l)
34:"
35:" Extending Dictionary directly with different types
36:let d = {}
Bram Moolenaar355fd9b2013-05-30 13:14:13 +020037:fun d.f()
38: return 1
39:endfun
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +020040py << trim EOF
41 d=vim.bindeval('d')
42 d['1']='asd'
43 d.update() # Must not do anything, including throwing errors
44 d.update(b=[1, 2, f])
45 d.update((('-1', {'a': 1}),))
46 d.update({'0': -1})
47 dk = d.keys()
48 dv = d.values()
49 di = d.items()
50 cmpfun = lambda a, b: cmp(repr(a), repr(b))
51 dk.sort(cmpfun)
52 dv.sort(cmpfun)
53 di.sort(cmpfun)
Bram Moolenaara9922d62013-05-30 13:01:18 +020054EOF
Bram Moolenaar355fd9b2013-05-30 13:14:13 +020055:$put =pyeval('d[''f''](self={})')
Bram Moolenaara9922d62013-05-30 13:01:18 +020056:$put =pyeval('repr(dk)')
57:$put =substitute(pyeval('repr(dv)'),'0x\x\+','','g')
58:$put =substitute(pyeval('repr(di)'),'0x\x\+','','g')
Bram Moolenaar355fd9b2013-05-30 13:14:13 +020059:for [key, Val] in sort(items(d))
60: $put =string(key) . ' : ' . string(Val)
61: unlet key Val
Bram Moolenaardb913952012-06-29 12:54:53 +020062:endfor
Bram Moolenaar841fbd22013-06-23 14:37:07 +020063:py del dk
64:py del di
65:py del dv
Bram Moolenaardb913952012-06-29 12:54:53 +020066:"
67:" removing items with del
68:py del l[2]
69:$put =string(l)
70:let l = range(8)
71:py l=vim.bindeval('l')
72:try
73: py del l[:3]
74: py del l[1:]
75:catch
76: $put =v:exception
77:endtry
78:$put =string(l)
79:"
80:py del d['-1']
Bram Moolenaar355fd9b2013-05-30 13:14:13 +020081:py del d['f']
Bram Moolenaara9922d62013-05-30 13:01:18 +020082:$put =string(pyeval('d.get(''b'', 1)'))
83:$put =string(pyeval('d.pop(''b'')'))
84:$put =string(pyeval('d.get(''b'', 1)'))
85:$put =string(pyeval('d.pop(''1'', 2)'))
86:$put =string(pyeval('d.pop(''1'', 2)'))
87:$put =pyeval('repr(d.has_key(''0''))')
88:$put =pyeval('repr(d.has_key(''1''))')
89:$put =pyeval('repr(''0'' in d)')
90:$put =pyeval('repr(''1'' in d)')
91:$put =pyeval('repr(list(iter(d)))')
Bram Moolenaardb913952012-06-29 12:54:53 +020092:$put =string(d)
Bram Moolenaarde71b562013-06-02 17:41:54 +020093:$put =pyeval('repr(d.popitem())')
Bram Moolenaara9922d62013-05-30 13:01:18 +020094:$put =pyeval('repr(d.get(''0''))')
95:$put =pyeval('repr(list(iter(d)))')
Bram Moolenaardb913952012-06-29 12:54:53 +020096:"
97:" removing items out of range: silently skip items that don't exist
98:let l = [0, 1, 2, 3]
99:py l=vim.bindeval('l')
100:" The following two ranges delete nothing as they match empty list:
101:py del l[2:1]
102:$put =string(l)
103:py del l[2:2]
104:$put =string(l)
105:py del l[2:3]
106:$put =string(l)
107:let l = [0, 1, 2, 3]
108:py l=vim.bindeval('l')
109:py del l[2:4]
110:$put =string(l)
111:let l = [0, 1, 2, 3]
112:py l=vim.bindeval('l')
113:py del l[2:5]
114:$put =string(l)
115:let l = [0, 1, 2, 3]
116:py l=vim.bindeval('l')
117:py del l[2:6]
118:$put =string(l)
119:let l = [0, 1, 2, 3]
120:py l=vim.bindeval('l')
121:" The following two ranges delete nothing as they match empty list:
122:py del l[-1:2]
123:$put =string(l)
124:py del l[-2:2]
125:$put =string(l)
126:py del l[-3:2]
127:$put =string(l)
128:let l = [0, 1, 2, 3]
129:py l=vim.bindeval('l')
130:py del l[-4:2]
131:$put =string(l)
132:let l = [0, 1, 2, 3]
133:py l=vim.bindeval('l')
134:py del l[-5:2]
135:$put =string(l)
136:let l = [0, 1, 2, 3]
137:py l=vim.bindeval('l')
138:py del l[-6:2]
139:$put =string(l)
Bram Moolenaar063a46b2014-01-14 16:36:51 +0100140:let l = [0, 1, 2, 3]
141:py l=vim.bindeval('l')
142:py del l[::2]
143:$put =string(l)
144:let l = [0, 1, 2, 3]
145:py l=vim.bindeval('l')
146:py del l[3:0:-2]
147:$put =string(l)
148:let l = [0, 1, 2, 3]
149:py l=vim.bindeval('l')
150:py del l[2:4:-2]
151:$put =string(l)
Bram Moolenaardb913952012-06-29 12:54:53 +0200152:"
153:" Slice assignment to a list
154:let l = [0, 1, 2, 3]
155:py l=vim.bindeval('l')
156:py l[0:0]=['a']
157:$put =string(l)
158:let l = [0, 1, 2, 3]
159:py l=vim.bindeval('l')
160:py l[1:2]=['b']
161:$put =string(l)
162:let l = [0, 1, 2, 3]
163:py l=vim.bindeval('l')
164:py l[2:4]=['c']
165:$put =string(l)
166:let l = [0, 1, 2, 3]
167:py l=vim.bindeval('l')
168:py l[4:4]=['d']
169:$put =string(l)
170:let l = [0, 1, 2, 3]
171:py l=vim.bindeval('l')
172:py l[-1:2]=['e']
173:$put =string(l)
174:let l = [0, 1, 2, 3]
175:py l=vim.bindeval('l')
176:py l[-10:2]=['f']
177:$put =string(l)
178:let l = [0, 1, 2, 3]
179:py l=vim.bindeval('l')
180:py l[2:-10]=['g']
181:$put =string(l)
182:let l = []
183:py l=vim.bindeval('l')
184:py l[0:0]=['h']
185:$put =string(l)
Bram Moolenaar063a46b2014-01-14 16:36:51 +0100186:let l = range(8)
187:py l=vim.bindeval('l')
188:py l[2:6:2] = [10, 20]
189:$put =string(l)
190:let l = range(8)
191:py l=vim.bindeval('l')
192:py l[6:2:-2] = [10, 20]
193:$put =string(l)
194:let l = range(8)
195:py l=vim.bindeval('l')
196:py l[6:2] = ()
197:$put =string(l)
198:let l = range(8)
199:py l=vim.bindeval('l')
200:py l[6:2:1] = ()
201:$put =string(l)
202:let l = range(8)
203:py l=vim.bindeval('l')
204:py l[2:2:1] = ()
205:$put =string(l)
Bram Moolenaardb913952012-06-29 12:54:53 +0200206:"
207:" Locked variables
208:let l = [0, 1, 2, 3]
209:py l=vim.bindeval('l')
210:lockvar! l
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200211py << trim EOF
212 def emsg(ei):
213 return ei[0].__name__ + ':' + repr(ei[1].args)
Bram Moolenaar8110a092016-04-14 15:56:09 +0200214
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200215 try:
216 l[2]='i'
217 except vim.error:
218 cb.append('l[2] threw vim.error: ' + emsg(sys.exc_info()))
Bram Moolenaar8110a092016-04-14 15:56:09 +0200219EOF
Bram Moolenaardb913952012-06-29 12:54:53 +0200220:$put =string(l)
221:unlockvar! l
222:"
223:" Function calls
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200224py << trim EOF
225 import sys
226 def ee(expr, g=globals(), l=locals()):
227 try:
228 exec(expr, g, l)
229 except:
230 ei = sys.exc_info()
231 msg = emsg(ei)
232 msg = msg.replace('TypeError:(\'argument 1 ', 'TypeError:(\'')
233 if expr.find('None') > -1:
234 msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
235 'TypeError:("\'NoneType\' object is not iterable",)')
236 if expr.find('FailingNumber') > -1:
237 msg = msg.replace(', not \'FailingNumber\'', '').replace('"', '\'')
238 msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
239 'TypeError:("\'FailingNumber\' object is not iterable",)')
240 if msg.find('(\'\'') > -1 or msg.find('(\'can\'t') > -1:
241 msg = msg.replace('(\'', '("').replace('\',)', '",)')
242 # Some Python versions say can't, others cannot.
243 if msg.find('can\'t') > -1:
244 msg = msg.replace('can\'t', 'cannot')
245 # Some Python versions use single quote, some double quote
246 if msg.find('"cannot ') > -1:
247 msg = msg.replace('"cannot ', '\'cannot ')
248 if msg.find(' attributes"') > -1:
249 msg = msg.replace(' attributes"', ' attributes\'')
250 if expr == 'fd(self=[])':
251 # HACK: PyMapping_Check changed meaning
252 msg = msg.replace('AttributeError:(\'keys\',)',
253 'TypeError:(\'unable to convert list to vim dictionary\',)')
254 vim.current.buffer.append(expr + ':' + msg)
255 else:
256 vim.current.buffer.append(expr + ':NOT FAILED')
Bram Moolenaar9fee7d42013-11-28 17:04:43 +0100257EOF
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200258:fun New(...)
259: return ['NewStart']+a:000+['NewEnd']
260:endfun
261:fun DictNew(...) dict
262: return ['DictNewStart']+a:000+['DictNewEnd', self]
263:endfun
Bram Moolenaardb913952012-06-29 12:54:53 +0200264:let l=[function('New'), function('DictNew')]
265:py l=vim.bindeval('l')
266:py l.extend(list(l[0](1, 2, 3)))
267:$put =string(l)
268:py l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
269:$put =string(l)
270:py l.extend([l[0].name])
271:$put =string(l)
Bram Moolenaar9fee7d42013-11-28 17:04:43 +0100272:py ee('l[1](1, 2, 3)')
Bram Moolenaar355fd9b2013-05-30 13:14:13 +0200273:py f=l[0]
Bram Moolenaardb913952012-06-29 12:54:53 +0200274:delfunction New
Bram Moolenaar9fee7d42013-11-28 17:04:43 +0100275:py ee('f(1, 2, 3)')
Bram Moolenaardb913952012-06-29 12:54:53 +0200276:if has('float')
277: let l=[0.0]
278: py l=vim.bindeval('l')
279: py l.extend([0.0])
280: $put =string(l)
281:else
282: $put ='[0.0, 0.0]'
283:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200284:let messages=[]
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200285:delfunction DictNew
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200286py << trim EOF
287 d=vim.bindeval('{}')
288 m=vim.bindeval('messages')
289 def em(expr, g=globals(), l=locals()):
290 try:
291 exec(expr, g, l)
292 except:
293 m.extend([sys.exc_type.__name__])
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200294
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200295 em('d["abc1"]')
296 em('d["abc1"]="\\0"')
297 em('d["abc1"]=vim')
298 em('d[""]=1')
299 em('d["a\\0b"]=1')
300 em('d[u"a\\0b"]=1')
Bram Moolenaara9922d62013-05-30 13:01:18 +0200301
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200302 em('d.pop("abc1")')
303 em('d.popitem()')
304 del em
305 del m
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200306EOF
307:$put =messages
Bram Moolenaar66b79852012-09-21 14:00:35 +0200308:unlet messages
309:" locked and scope attributes
310:let d={} | let dl={} | lockvar dl
311:for s in split("d dl v: g:")
312: let name=tr(s, ':', 's')
313: execute 'py '.name.'=vim.bindeval("'.s.'")'
314: let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".pyeval(name.".".v:val)'), ';')
315: $put =toput
316:endfor
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200317:silent! let d.abc2=1
318:silent! let dl.abc3=1
Bram Moolenaar66b79852012-09-21 14:00:35 +0200319:py d.locked=True
320:py dl.locked=False
321:silent! let d.def=1
322:silent! let dl.def=1
323:put ='d:'.string(d)
324:put ='dl:'.string(dl)
325:unlet d dl
326:
327:let l=[] | let ll=[] | lockvar ll
328:for s in split("l ll")
329: let name=tr(s, ':', 's')
330: execute 'py '.name.'=vim.bindeval("'.s.'")'
331: let toput=s.' : locked:'.pyeval(name.'.locked')
332: $put =toput
333:endfor
334:silent! call extend(l, [0])
335:silent! call extend(ll, [0])
336:py l.locked=True
337:py ll.locked=False
338:silent! call extend(l, [1])
339:silent! call extend(ll, [1])
340:put ='l:'.string(l)
341:put ='ll:'.string(ll)
342:unlet l ll
Bram Moolenaardb913952012-06-29 12:54:53 +0200343:"
344:" pyeval()
345:let l=pyeval('range(3)')
346:$put =string(l)
347:let d=pyeval('{"a": "b", "c": 1, "d": ["e"]}')
348:$put =sort(items(d))
Bram Moolenaar77324fc2016-01-17 22:37:03 +0100349:let v:errmsg = ''
350:$put ='pyeval(\"None\") = ' . pyeval('None') . v:errmsg
Bram Moolenaardb913952012-06-29 12:54:53 +0200351:if has('float')
352: let f=pyeval('0.0')
353: $put =string(f)
354:else
355: $put ='0.0'
356:endif
Bram Moolenaarc11073c2012-09-05 19:17:42 +0200357:" Invalid values:
358:for e in ['"\0"', '{"\0": 1}', 'undefined_name', 'vim']
359: try
360: let v=pyeval(e)
361: catch
362: let toput=e.":\t".v:exception[:13]
363: $put =toput
364: endtry
365:endfor
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100366:"
367:" threading
368:let l = [0]
369:py l=vim.bindeval('l')
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200370py << trim EOF
371 import threading
372 import time
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100373
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200374 class T(threading.Thread):
375 def __init__(self):
376 threading.Thread.__init__(self)
377 self.t = 0
378 self.running = True
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100379
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200380 def run(self):
381 while self.running:
382 self.t += 1
383 time.sleep(0.1)
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100384
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200385 t = T()
386 del T
387 t.start()
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100388EOF
389:sleep 1
390:py t.running = False
391:py t.join()
Bram Moolenaar52f6ae12015-12-29 16:34:06 +0100392:" Check if the background thread is working. Count should be 10, but on a
393:" busy system (AppVeyor) it can be much lower.
394:py l[0] = t.t > 4
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200395:py del time
396:py del threading
Bram Moolenaar9fee7d42013-11-28 17:04:43 +0100397:py del t
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100398:$put =string(l)
399:"
400:" settrace
401:let l = []
402:py l=vim.bindeval('l')
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200403py << trim EOF
404 import sys
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100405
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200406 def traceit(frame, event, arg):
407 global l
408 if event == "line":
409 l.extend([frame.f_lineno])
410 return traceit
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100411
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200412 def trace_main():
413 for i in range(5):
414 pass
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100415EOF
416:py sys.settrace(traceit)
417:py trace_main()
Bram Moolenaardee2e312013-06-23 16:35:47 +0200418:py sys.settrace(None)
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200419:py del traceit
420:py del trace_main
Bram Moolenaar76d711c2013-02-13 14:17:08 +0100421:$put =string(l)
Bram Moolenaar24b11fb2013-04-05 19:32:36 +0200422:"
423:" Slice
424:py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
425:py l = ll[:4]
426:$put =string(pyeval('l'))
427:py l = ll[2:]
428:$put =string(pyeval('l'))
429:py l = ll[:-4]
430:$put =string(pyeval('l'))
431:py l = ll[-2:]
432:$put =string(pyeval('l'))
433:py l = ll[2:4]
434:$put =string(pyeval('l'))
435:py l = ll[4:2]
436:$put =string(pyeval('l'))
437:py l = ll[-4:-2]
438:$put =string(pyeval('l'))
439:py l = ll[-2:-4]
440:$put =string(pyeval('l'))
441:py l = ll[:]
442:$put =string(pyeval('l'))
443:py l = ll[0:6]
444:$put =string(pyeval('l'))
445:py l = ll[-10:10]
446:$put =string(pyeval('l'))
Bram Moolenaar063a46b2014-01-14 16:36:51 +0100447:py l = ll[4:2:-1]
448:$put =string(pyeval('l'))
449:py l = ll[::2]
450:$put =string(pyeval('l'))
451:py l = ll[4:2:1]
452:$put =string(pyeval('l'))
453:py del l
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200454:"
455:" Vars
456:let g:foo = 'bac'
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200457:let w:abc3 = 'def'
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200458:let b:baz = 'bar'
Bram Moolenaara4720012013-05-15 16:27:37 +0200459:let t:bar = 'jkl'
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200460:try
461: throw "Abc"
462:catch
463: put =pyeval('vim.vvars[''exception'']')
464:endtry
465:put =pyeval('vim.vars[''foo'']')
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200466:put =pyeval('vim.current.window.vars[''abc3'']')
Bram Moolenaar230bb3f2013-04-24 14:07:45 +0200467:put =pyeval('vim.current.buffer.vars[''baz'']')
Bram Moolenaara4720012013-05-15 16:27:37 +0200468:put =pyeval('vim.current.tabpage.vars[''bar'']')
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200469:"
470:" Options
471:" paste: boolean, global
472:" previewheight number, global
473:" operatorfunc: string, global
474:" number: boolean, window-local
475:" numberwidth: number, window-local
476:" colorcolumn: string, window-local
477:" statusline: string, window-local/global
478:" autoindent: boolean, buffer-local
Bram Moolenaar55b8ad32013-05-17 13:38:04 +0200479:" shiftwidth: number, buffer-local
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200480:" omnifunc: string, buffer-local
481:" preserveindent: boolean, buffer-local/global
482:" path: string, buffer-local/global
483:let g:bufs=[bufnr('%')]
484:new
485:let g:bufs+=[bufnr('%')]
486:vnew
487:let g:bufs+=[bufnr('%')]
488:wincmd j
489:vnew
490:let g:bufs+=[bufnr('%')]
491:wincmd l
492:fun RecVars(opt)
493: let gval =string(eval('&g:'.a:opt))
494: let wvals=join(map(range(1, 4), 'v:val.":".string(getwinvar(v:val, "&".a:opt))'))
495: let bvals=join(map(copy(g:bufs), 'v:val.":".string(getbufvar(v:val, "&".a:opt))'))
496: put =' G: '.gval
497: put =' W: '.wvals
498: put =' B: '.wvals
499:endfun
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200500py << trim EOF
501 def e(s, g=globals(), l=locals()):
502 try:
503 exec(s, g, l)
504 except:
505 vim.command('return ' + repr(sys.exc_type.__name__))
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200506
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200507 def ev(s, g=globals(), l=locals()):
508 try:
509 return eval(s, g, l)
510 except:
511 vim.command('let exc=' + repr(sys.exc_type.__name__))
512 return 0
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200513EOF
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200514:fun E(s)
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200515: python e(vim.eval('a:s'))
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200516:endfun
517:fun Ev(s)
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200518: let r=pyeval('ev(vim.eval("a:s"))')
519: if exists('exc')
520: throw exc
521: endif
522: return r
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200523:endfun
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200524:py gopts1=vim.options
525:py wopts1=vim.windows[2].options
526:py wopts2=vim.windows[0].options
527:py wopts3=vim.windows[1].options
528:py bopts1=vim.buffers[vim.bindeval("g:bufs")[2]].options
529:py bopts2=vim.buffers[vim.bindeval("g:bufs")[1]].options
530:py bopts3=vim.buffers[vim.bindeval("g:bufs")[0]].options
Bram Moolenaar1028f4d2014-01-14 16:55:00 +0100531:$put ='wopts iters equal: '.pyeval('list(wopts1) == list(wopts2)')
532:$put ='bopts iters equal: '.pyeval('list(bopts1) == list(bopts2)')
533:py gset=set(iter(gopts1))
534:py wset=set(iter(wopts1))
535:py bset=set(iter(bopts1))
Bram Moolenaar04188112013-06-01 20:32:12 +0200536:set path=.,..,,
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200537:let lst=[]
538:let lst+=[['paste', 1, 0, 1, 2, 1, 1, 0 ]]
539:let lst+=[['previewheight', 5, 1, 6, 'a', 0, 1, 0 ]]
540:let lst+=[['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0 ]]
541:let lst+=[['number', 0, 1, 1, 0, 1, 0, 1 ]]
542:let lst+=[['numberwidth', 2, 3, 5, -100, 0, 0, 1 ]]
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200543:let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1 ]]
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200544:let lst+=[['statusline', '1', '2', '4', 0, 0, 1, 1 ]]
545:let lst+=[['autoindent', 0, 1, 1, 2, 1, 0, 2 ]]
Bram Moolenaar55b8ad32013-05-17 13:38:04 +0200546:let lst+=[['shiftwidth', 0, 2, 1, 3, 0, 0, 2 ]]
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200547:let lst+=[['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2 ]]
548:let lst+=[['preserveindent', 0, 1, 1, 2, 1, 1, 2 ]]
549:let lst+=[['path', '.,,', ',,', '.', 0, 0, 1, 2 ]]
550:for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
551: py oname=vim.eval('oname')
552: py oval1=vim.bindeval('oval1')
553: py oval2=vim.bindeval('oval2')
554: py oval3=vim.bindeval('oval3')
555: if invval is 0 || invval is 1
556: py invval=bool(vim.bindeval('invval'))
557: else
558: py invval=vim.bindeval('invval')
559: endif
560: if bool
561: py oval1=bool(oval1)
562: py oval2=bool(oval2)
563: py oval3=bool(oval3)
564: endif
565: put ='>>> '.oname
Bram Moolenaar1028f4d2014-01-14 16:55:00 +0100566: $put =' g/w/b:'.pyeval('oname in gset').'/'.pyeval('oname in wset').'/'.pyeval('oname in bset')
567: $put =' g/w/b (in):'.pyeval('oname in gopts1').'/'.pyeval('oname in wopts1').'/'.pyeval('oname in bopts1')
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200568: for v in ['gopts1', 'wopts1', 'bopts1']
569: try
570: put =' p/'.v.': '.Ev('repr('.v.'['''.oname.'''])')
571: catch
572: put =' p/'.v.'! '.v:exception
573: endtry
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200574: let r=E(v.'['''.oname.''']=invval')
575: if r isnot 0
576: put =' inv: '.string(invval).'! '.r
577: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200578: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
579: let val=substitute(vv, '^.opts', 'oval', '')
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200580: let r=E(vv.'['''.oname.''']='.val)
581: if r isnot 0
582: put =' '.vv.'! '.r
583: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200584: endfor
585: endfor
586: call RecVars(oname)
587: for v in ['wopts3', 'bopts3']
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200588: let r=E('del '.v.'["'.oname.'"]')
589: if r isnot 0
590: put =' del '.v.'! '.r
591: endif
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200592: endfor
593: call RecVars(oname)
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200594:endfor
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200595:delfunction RecVars
596:delfunction E
597:delfunction Ev
598:py del ev
599:py del e
Bram Moolenaar84e0f6c2013-05-06 03:52:55 +0200600:only
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200601:for buf in g:bufs[1:]
602: execute 'bwipeout!' buf
603:endfor
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200604:py del gopts1
605:py del wopts1
606:py del wopts2
607:py del wopts3
608:py del bopts1
609:py del bopts2
610:py del bopts3
611:py del oval1
612:py del oval2
613:py del oval3
614:py del oname
615:py del invval
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200616:"
617:" Test buffer object
618:vnew
619:put ='First line'
620:put ='Second line'
621:put ='Third line'
622:1 delete _
623:py b=vim.current.buffer
624:wincmd w
625:mark a
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200626:augroup BUFS
627: autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
628: autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
629:augroup END
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200630py << trim EOF
631 # Tests BufferAppend and BufferItem
632 cb.append(b[0])
633 # Tests BufferSlice and BufferAssSlice
634 cb.append('abc5') # Will be overwritten
635 cb[-1:] = b[:-2]
636 # Test BufferLength and BufferAssSlice
637 cb.append('def') # Will not be overwritten
638 cb[len(cb):] = b[:]
639 # Test BufferAssItem and BufferMark
640 cb.append('ghi') # Will be overwritten
641 cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
642 # Test BufferRepr
643 cb.append(repr(cb) + repr(b))
644 # Modify foreign buffer
645 b.append('foo')
646 b[0]='bar'
647 b[0:0]=['baz']
648 vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
649 # Test assigning to name property
650 import os
651 old_name = cb.name
652 cb.name = 'foo'
653 cb.append(cb.name[-11:].replace(os.path.sep, '/'))
654 b.name = 'bar'
655 cb.append(b.name[-11:].replace(os.path.sep, '/'))
656 cb.name = old_name
657 cb.append(cb.name[-17:].replace(os.path.sep, '/'))
658 del old_name
659 # Test CheckBuffer
660 for _b in vim.buffers:
661 if _b is not cb:
662 vim.command('bwipeout! ' + str(_b.number))
663 del _b
664 cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
665 for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")', 'b.name = "!"'):
666 try:
667 exec(expr)
668 except vim.error:
669 pass
670 else:
671 # Usually a SEGV here
672 # Should not happen in any case
673 cb.append('No exception for ' + expr)
674 vim.command('cd .')
675 del b
Bram Moolenaarbd80f352013-05-12 21:16:23 +0200676EOF
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200677:augroup BUFS
678: autocmd!
679:augroup END
680:augroup! BUFS
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200681:"
682:" Test vim.buffers object
683:set hidden
684:edit a
685:buffer #
686:edit b
687:buffer #
688:edit c
689:buffer #
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200690py << trim EOF
691 try:
692 from __builtin__ import next
693 except ImportError:
694 next = lambda o: o.next()
695 # Check GCing iterator that was not fully exhausted
696 i = iter(vim.buffers)
697 cb.append('i:' + str(next(i)))
698 # and also check creating more than one iterator at a time
699 i2 = iter(vim.buffers)
700 cb.append('i2:' + str(next(i2)))
701 cb.append('i:' + str(next(i)))
702 # The following should trigger GC and not cause any problems
703 del i
704 del i2
705 i3 = iter(vim.buffers)
706 cb.append('i3:' + str(next(i3)))
707 del i3
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200708
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200709 prevnum = 0
710 for b in vim.buffers:
711 # Check buffer order
712 if prevnum >= b.number:
713 cb.append('!!! Buffer numbers not in strictly ascending order')
714 # Check indexing: vim.buffers[number].number == number
715 cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + '=' + repr(b))
716 prevnum = b.number
717 del prevnum
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200718
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200719 cb.append(str(len(vim.buffers)))
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200720
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200721 bnums = list(map(lambda b: b.number, vim.buffers))[1:]
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200722
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200723 # Test wiping out buffer with existing iterator
724 i4 = iter(vim.buffers)
725 cb.append('i4:' + str(next(i4)))
726 vim.command('bwipeout! ' + str(bnums.pop(0)))
727 try:
728 next(i4)
729 except vim.error:
730 pass
731 else:
732 cb.append('!!!! No vim.error')
733 i4 = iter(vim.buffers)
734 vim.command('bwipeout! ' + str(bnums.pop(-1)))
735 vim.command('bwipeout! ' + str(bnums.pop(-1)))
736 cb.append('i4:' + str(next(i4)))
737 try:
738 next(i4)
739 except StopIteration:
740 cb.append('StopIteration')
741 del i4
742 del bnums
Bram Moolenaarb6c589a2013-05-15 14:39:52 +0200743EOF
Bram Moolenaara4720012013-05-15 16:27:37 +0200744:"
745:" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
746:tabnew 0
747:tabnew 1
748:vnew a.1
749:tabnew 2
750:vnew a.2
751:vnew b.2
752:vnew c.2
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200753py << trim EOF
754 cb.append('Number of tabs: ' + str(len(vim.tabpages)))
755 cb.append('Current tab pages:')
756 def W(w):
757 if repr(w).find('(unknown)') != -1:
758 return '<window object (unknown)>'
759 else:
760 return repr(w)
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200761
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200762 start = len(cb)
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200763
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200764 def Cursor(w):
765 if w.buffer is cb:
766 return repr((start - w.cursor[0], w.cursor[1]))
767 else:
768 return repr(w.cursor)
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200769
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200770 for t in vim.tabpages:
771 cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window))
772 cb.append(' Windows:')
773 for w in t.windows:
774 cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w))
775 # Other values depend on the size of the terminal, so they are checked partly:
776 for attr in ('height', 'row', 'width', 'col'):
777 try:
778 aval = getattr(w, attr)
779 if type(aval) is not long:
780 raise TypeError
781 if aval < 0:
782 raise ValueError
783 except Exception:
784 cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + sys.exc_type.__name__)
785 del aval
786 del attr
787 w.cursor = (len(w.buffer), 0)
788 del W
789 del Cursor
790 cb.append('Number of windows in current tab page: ' + str(len(vim.windows)))
791 if list(vim.windows) != list(vim.current.tabpage.windows):
792 cb.append('!!!!!! Windows differ')
Bram Moolenaara4720012013-05-15 16:27:37 +0200793EOF
794:"
795:" Test vim.current
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200796py << trim EOF
797 def H(o):
798 return repr(o)
799 cb.append('Current tab page: ' + repr(vim.current.tabpage))
800 cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
801 cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer))
802 del H
803 # Assigning: fails
804 try:
805 vim.current.window = vim.tabpages[0].window
806 except ValueError:
807 cb.append('ValueError at assigning foreign tab window')
Bram Moolenaara4720012013-05-15 16:27:37 +0200808
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200809 for attr in ('window', 'tabpage', 'buffer'):
810 try:
811 setattr(vim.current, attr, None)
812 except TypeError:
813 cb.append('Type error at assigning None to vim.current.' + attr)
814 del attr
Bram Moolenaara4720012013-05-15 16:27:37 +0200815
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200816 # Assigning: success
817 vim.current.tabpage = vim.tabpages[-2]
818 vim.current.buffer = cb
819 vim.current.window = vim.windows[0]
820 vim.current.window.cursor = (len(vim.current.buffer), 0)
821 cb.append('Current tab page: ' + repr(vim.current.tabpage))
822 cb.append('Current window: ' + repr(vim.current.window))
823 cb.append('Current buffer: ' + repr(vim.current.buffer))
824 cb.append('Current line: ' + repr(vim.current.line))
825 ws = list(vim.windows)
826 ts = list(vim.tabpages)
827 for b in vim.buffers:
828 if b is not cb:
829 vim.command('bwipeout! ' + str(b.number))
830 del b
831 cb.append('w.valid: ' + repr([w.valid for w in ws]))
832 cb.append('t.valid: ' + repr([t.valid for t in ts]))
833 del w
834 del t
835 del ts
836 del ws
Bram Moolenaara4720012013-05-15 16:27:37 +0200837EOF
838:tabonly!
839:only!
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200840:"
841:" Test types
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200842py << trim EOF
843 for expr, attr in (
844 ('vim.vars', 'Dictionary'),
845 ('vim.options', 'Options'),
846 ('vim.bindeval("{}")', 'Dictionary'),
847 ('vim.bindeval("[]")', 'List'),
848 ('vim.bindeval("function(\'tr\')")', 'Function'),
849 ('vim.current.buffer', 'Buffer'),
850 ('vim.current.range', 'Range'),
851 ('vim.current.window', 'Window'),
852 ('vim.current.tabpage', 'TabPage'),
853 ):
854 cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
855 del expr
856 del attr
Bram Moolenaarcac867a2013-05-21 19:50:34 +0200857EOF
Bram Moolenaara7b64ce2013-05-21 20:40:40 +0200858:"
Bram Moolenaardd8aca62013-05-29 22:36:10 +0200859:" Test __dir__() method
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200860py << trim EOF
861 for name, o in (
862 ('current', vim.current),
863 ('buffer', vim.current.buffer),
864 ('window', vim.current.window),
865 ('tabpage', vim.current.tabpage),
866 ('range', vim.current.range),
867 ('dictionary', vim.bindeval('{}')),
868 ('list', vim.bindeval('[]')),
869 ('function', vim.bindeval('function("tr")')),
870 ('output', sys.stdout),
871 ):
872 cb.append(name + ':' + ','.join(dir(o)))
873 del name
874 del o
Bram Moolenaardd8aca62013-05-29 22:36:10 +0200875EOF
876:"
Bram Moolenaara9922d62013-05-30 13:01:18 +0200877:" Test vim.*.__new__
878:$put =string(pyeval('vim.Dictionary({})'))
879:$put =string(pyeval('vim.Dictionary(a=1)'))
880:$put =string(pyeval('vim.Dictionary(((''a'', 1),))'))
Bram Moolenaar78cddbe2013-05-30 13:05:58 +0200881:$put =string(pyeval('vim.List()'))
Bram Moolenaar841fbd22013-06-23 14:37:07 +0200882:$put =string(pyeval('vim.List(iter(''abc7''))'))
Bram Moolenaar355fd9b2013-05-30 13:14:13 +0200883:$put =string(pyeval('vim.Function(''tr'')'))
Bram Moolenaar8110a092016-04-14 15:56:09 +0200884:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4])'))
885:$put =string(pyeval('vim.Function(''tr'', args=[])'))
886:$put =string(pyeval('vim.Function(''tr'', self={})'))
887:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})'))
Bram Moolenaar2177f9f2016-05-25 20:39:09 +0200888:$put ='auto_rebind'
889:$put =string(pyeval('vim.Function(''tr'', auto_rebind=False)'))
890:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)'))
891:$put =string(pyeval('vim.Function(''tr'', args=[], auto_rebind=False)'))
892:$put =string(pyeval('vim.Function(''tr'', self={}, auto_rebind=False)'))
893:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)'))
Bram Moolenaar8110a092016-04-14 15:56:09 +0200894:"
895:" Test vim.Function
896:function Args(...)
897: return a:000
898:endfunction
899:function SelfArgs(...) dict
900: return [a:000, self]
901:endfunction
902:" The following four lines should not crash
903:let Pt = function('tr', [[]], {'l': []})
904:py Pt = vim.bindeval('Pt')
905:unlet Pt
906:py del Pt
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200907py << trim EOF
908 def ecall(out_prefix, func, *args, **kwargs):
909 line = out_prefix + ': '
910 try:
911 ret = func(*args, **kwargs)
912 except Exception:
913 line += '!exception: ' + emsg(sys.exc_info())
914 else:
915 line += '!result: ' + vim.Function('string')(ret)
916 cb.append(line)
917 a = vim.Function('Args')
918 pa1 = vim.Function('Args', args=['abcArgsPA1'])
919 pa2 = vim.Function('Args', args=[])
920 pa3 = vim.Function('Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'})
921 pa4 = vim.Function('Args', self={'abcSelfPA4': 'abcSelfPA4Val'})
922 cb.append('a: ' + repr(a))
923 cb.append('pa1: ' + repr(pa1))
924 cb.append('pa2: ' + repr(pa2))
925 cb.append('pa3: ' + repr(pa3))
926 cb.append('pa4: ' + repr(pa4))
927 sa = vim.Function('SelfArgs')
928 psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1'])
929 psa2 = vim.Function('SelfArgs', args=[])
930 psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'})
931 psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'})
932 psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0)
933 psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=())
934 psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[])
935 psa8 = vim.Function('SelfArgs', auto_rebind=False)
936 psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True)
937 psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1)
938 psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'})
939 psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC'])
940 cb.append('sa: ' + repr(sa))
941 cb.append('psa1: ' + repr(psa1))
942 cb.append('psa2: ' + repr(psa2))
943 cb.append('psa3: ' + repr(psa3))
944 cb.append('psa4: ' + repr(psa4))
945 cb.append('psa5: ' + repr(psa5))
946 cb.append('psa6: ' + repr(psa6))
947 cb.append('psa7: ' + repr(psa7))
948 cb.append('psa8: ' + repr(psa8))
949 cb.append('psa9: ' + repr(psa9))
950 cb.append('psaA: ' + repr(psaA))
951 cb.append('psaB: ' + repr(psaB))
952 cb.append('psaC: ' + repr(psaC))
Bram Moolenaar8110a092016-04-14 15:56:09 +0200953
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200954 psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'})
955 psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]]
956 psar.self['rec'] = psar
957 psar.self['self'] = psar.self
958 psar.self['args'] = psar.args
Bram Moolenaar8110a092016-04-14 15:56:09 +0200959
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200960 try:
961 cb.append('psar: ' + repr(psar))
962 except Exception:
963 cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
Bram Moolenaar8110a092016-04-14 15:56:09 +0200964EOF
965:$put ='s(a): '.string(pyeval('a'))
966:$put ='s(pa1): '.string(pyeval('pa1'))
967:$put ='s(pa2): '.string(pyeval('pa2'))
968:$put ='s(pa3): '.string(pyeval('pa3'))
969:$put ='s(pa4): '.string(pyeval('pa4'))
970:$put ='s(sa): '.string(pyeval('sa'))
971:$put ='s(psa1): '.string(pyeval('psa1'))
972:$put ='s(psa2): '.string(pyeval('psa2'))
973:$put ='s(psa3): '.string(pyeval('psa3'))
974:$put ='s(psa4): '.string(pyeval('psa4'))
Bram Moolenaar2177f9f2016-05-25 20:39:09 +0200975:$put ='s(psa5): '.string(pyeval('psa5'))
976:$put ='s(psa6): '.string(pyeval('psa6'))
977:$put ='s(psa7): '.string(pyeval('psa7'))
978:$put ='s(psa8): '.string(pyeval('psa8'))
979:$put ='s(psa9): '.string(pyeval('psa9'))
980:$put ='s(psaA): '.string(pyeval('psaA'))
981:$put ='s(psaB): '.string(pyeval('psaB'))
982:$put ='s(psaC): '.string(pyeval('psaC'))
983:
984:for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC']
985: let d = {'f': pyeval(v)}
986: $put ='d.'.v.'(): '.string(d.f())
987:endfor
Bram Moolenaar8110a092016-04-14 15:56:09 +0200988:
989:py ecall('a()', a, )
990:py ecall('pa1()', pa1, )
991:py ecall('pa2()', pa2, )
992:py ecall('pa3()', pa3, )
993:py ecall('pa4()', pa4, )
994:py ecall('sa()', sa, )
995:py ecall('psa1()', psa1, )
996:py ecall('psa2()', psa2, )
997:py ecall('psa3()', psa3, )
998:py ecall('psa4()', psa4, )
999:
1000:py ecall('a(42, 43)', a, 42, 43)
1001:py ecall('pa1(42, 43)', pa1, 42, 43)
1002:py ecall('pa2(42, 43)', pa2, 42, 43)
1003:py ecall('pa3(42, 43)', pa3, 42, 43)
1004:py ecall('pa4(42, 43)', pa4, 42, 43)
1005:py ecall('sa(42, 43)', sa, 42, 43)
1006:py ecall('psa1(42, 43)', psa1, 42, 43)
1007:py ecall('psa2(42, 43)', psa2, 42, 43)
1008:py ecall('psa3(42, 43)', psa3, 42, 43)
1009:py ecall('psa4(42, 43)', psa4, 42, 43)
1010:
1011:py ecall('a(42, self={"20": 1})', a, 42, self={'20': 1})
1012:py ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1})
1013:py ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1})
1014:py ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1})
1015:py ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1})
1016:py ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1})
1017:py ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1})
1018:py ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1})
1019:py ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1})
1020:py ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1})
1021:
1022:py ecall('a(self={"20": 1})', a, self={'20': 1})
1023:py ecall('pa1(self={"20": 1})', pa1, self={'20': 1})
1024:py ecall('pa2(self={"20": 1})', pa2, self={'20': 1})
1025:py ecall('pa3(self={"20": 1})', pa3, self={'20': 1})
1026:py ecall('pa4(self={"20": 1})', pa4, self={'20': 1})
1027:py ecall('sa(self={"20": 1})', sa, self={'20': 1})
1028:py ecall('psa1(self={"20": 1})', psa1, self={'20': 1})
1029:py ecall('psa2(self={"20": 1})', psa2, self={'20': 1})
1030:py ecall('psa3(self={"20": 1})', psa3, self={'20': 1})
1031:py ecall('psa4(self={"20": 1})', psa4, self={'20': 1})
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001032py << trim EOF
1033 def s(v):
1034 if v is None:
1035 return repr(v)
1036 else:
1037 return vim.Function('string')(v)
Bram Moolenaar8110a092016-04-14 15:56:09 +02001038
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001039 cb.append('a.args: ' + s(a.args))
1040 cb.append('pa1.args: ' + s(pa1.args))
1041 cb.append('pa2.args: ' + s(pa2.args))
1042 cb.append('pa3.args: ' + s(pa3.args))
1043 cb.append('pa4.args: ' + s(pa4.args))
1044 cb.append('sa.args: ' + s(sa.args))
1045 cb.append('psa1.args: ' + s(psa1.args))
1046 cb.append('psa2.args: ' + s(psa2.args))
1047 cb.append('psa3.args: ' + s(psa3.args))
1048 cb.append('psa4.args: ' + s(psa4.args))
Bram Moolenaar8110a092016-04-14 15:56:09 +02001049
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001050 cb.append('a.self: ' + s(a.self))
1051 cb.append('pa1.self: ' + s(pa1.self))
1052 cb.append('pa2.self: ' + s(pa2.self))
1053 cb.append('pa3.self: ' + s(pa3.self))
1054 cb.append('pa4.self: ' + s(pa4.self))
1055 cb.append('sa.self: ' + s(sa.self))
1056 cb.append('psa1.self: ' + s(psa1.self))
1057 cb.append('psa2.self: ' + s(psa2.self))
1058 cb.append('psa3.self: ' + s(psa3.self))
1059 cb.append('psa4.self: ' + s(psa4.self))
Bram Moolenaar8110a092016-04-14 15:56:09 +02001060
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001061 cb.append('a.name: ' + s(a.name))
1062 cb.append('pa1.name: ' + s(pa1.name))
1063 cb.append('pa2.name: ' + s(pa2.name))
1064 cb.append('pa3.name: ' + s(pa3.name))
1065 cb.append('pa4.name: ' + s(pa4.name))
1066 cb.append('sa.name: ' + s(sa.name))
1067 cb.append('psa1.name: ' + s(psa1.name))
1068 cb.append('psa2.name: ' + s(psa2.name))
1069 cb.append('psa3.name: ' + s(psa3.name))
1070 cb.append('psa4.name: ' + s(psa4.name))
Bram Moolenaar8110a092016-04-14 15:56:09 +02001071
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001072 cb.append('a.auto_rebind: ' + s(a.auto_rebind))
1073 cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind))
1074 cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind))
1075 cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind))
1076 cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind))
1077 cb.append('sa.auto_rebind: ' + s(sa.auto_rebind))
1078 cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind))
1079 cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind))
1080 cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind))
1081 cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind))
1082 cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind))
1083 cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind))
1084 cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind))
1085 cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind))
1086 cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind))
1087 cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind))
1088 cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind))
1089 cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind))
Bram Moolenaar2177f9f2016-05-25 20:39:09 +02001090
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001091 del s
Bram Moolenaar8110a092016-04-14 15:56:09 +02001092
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001093 del a
1094 del pa1
1095 del pa2
1096 del pa3
1097 del pa4
1098 del sa
1099 del psa1
1100 del psa2
1101 del psa3
1102 del psa4
1103 del psa5
1104 del psa6
1105 del psa7
1106 del psa8
1107 del psa9
1108 del psaA
1109 del psaB
1110 del psaC
1111 del psar
Bram Moolenaar8110a092016-04-14 15:56:09 +02001112
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001113 del ecall
Bram Moolenaar8110a092016-04-14 15:56:09 +02001114EOF
Bram Moolenaar01a7a722013-05-30 12:26:58 +02001115:"
1116:" Test stdout/stderr
1117:redir => messages
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001118:py sys.stdout.write('abc8') ; sys.stdout.write('def')
1119:py sys.stderr.write('abc9') ; sys.stderr.write('def')
1120:py sys.stdout.writelines(iter('abcA'))
1121:py sys.stderr.writelines(iter('abcB'))
Bram Moolenaar01a7a722013-05-30 12:26:58 +02001122:redir END
1123:$put =string(substitute(messages, '\d\+', '', 'g'))
Bram Moolenaara9922d62013-05-30 13:01:18 +02001124:" Test subclassing
Bram Moolenaar355fd9b2013-05-30 13:14:13 +02001125:fun Put(...)
1126: $put =string(a:000)
1127: return a:000
1128:endfun
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001129py << trim EOF
1130 class DupDict(vim.Dictionary):
1131 def __setitem__(self, key, value):
1132 super(DupDict, self).__setitem__(key, value)
1133 super(DupDict, self).__setitem__('dup_' + key, value)
1134 dd = DupDict()
1135 dd['a'] = 'b'
Bram Moolenaar78cddbe2013-05-30 13:05:58 +02001136
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001137 class DupList(vim.List):
1138 def __getitem__(self, idx):
1139 return [super(DupList, self).__getitem__(idx)] * 2
Bram Moolenaar78cddbe2013-05-30 13:05:58 +02001140
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001141 dl = DupList()
1142 dl2 = DupList(iter('abcC'))
1143 dl.extend(dl2[0])
Bram Moolenaar355fd9b2013-05-30 13:14:13 +02001144
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001145 class DupFun(vim.Function):
1146 def __call__(self, arg):
1147 return super(DupFun, self).__call__(arg, arg)
Bram Moolenaar355fd9b2013-05-30 13:14:13 +02001148
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001149 df = DupFun('Put')
Bram Moolenaara9922d62013-05-30 13:01:18 +02001150EOF
1151:$put =string(sort(keys(pyeval('dd'))))
Bram Moolenaar78cddbe2013-05-30 13:05:58 +02001152:$put =string(pyeval('dl'))
1153:$put =string(pyeval('dl2'))
Bram Moolenaar355fd9b2013-05-30 13:14:13 +02001154:$put =string(pyeval('df(2)'))
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001155:$put =string(pyeval('dl') is# pyeval('dl'))
1156:$put =string(pyeval('dd') is# pyeval('dd'))
1157:$put =string(pyeval('df'))
1158:delfunction Put
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001159py << trim
1160 del DupDict
1161 del DupList
1162 del DupFun
1163 del dd
1164 del dl
1165 del dl2
1166 del df
Bram Moolenaar91ffc8a2020-03-02 20:54:22 +01001167.
Bram Moolenaar01a7a722013-05-30 12:26:58 +02001168:"
Bram Moolenaarf4258302013-06-02 18:20:17 +02001169:" Test chdir
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001170py << trim EOF
1171 import os
1172 fnamemodify = vim.Function('fnamemodify')
1173 cb.append(fnamemodify('.', ':p:h:t'))
1174 cb.append(vim.eval('@%'))
Bram Moolenaar8e46f722013-07-13 14:08:16 +02001175 os.chdir('..')
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001176 path = fnamemodify('.', ':p:h:t')
1177 if path != 'src':
1178 # Running tests from a shadow directory, so move up another level
1179 # This will result in @% looking like shadow/testdir/test86.in, hence the
1180 # extra fnamemodify
1181 os.chdir('..')
1182 cb.append(fnamemodify('.', ':p:h:t'))
1183 cb.append(fnamemodify(vim.eval('@%'), ':s?^%s.??' % path).replace(os.path.sep, '/'))
1184 os.chdir(path)
1185 del path
1186 else:
1187 cb.append(fnamemodify('.', ':p:h:t'))
1188 cb.append(vim.eval('@%').replace(os.path.sep, '/'))
1189 os.chdir('testdir')
Bram Moolenaar8e46f722013-07-13 14:08:16 +02001190 cb.append(fnamemodify('.', ':p:h:t'))
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001191 cb.append(vim.eval('@%'))
1192 del fnamemodify
Bram Moolenaarf4258302013-06-02 18:20:17 +02001193EOF
1194:"
Bram Moolenaar8600e402013-05-30 13:28:41 +02001195:" Test errors
1196:fun F() dict
1197:endfun
1198:fun D()
Bram Moolenaara7b64ce2013-05-21 20:40:40 +02001199:endfun
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001200py << trim EOF
1201 d = vim.Dictionary()
1202 ned = vim.Dictionary(foo='bar', baz='abcD')
1203 dl = vim.Dictionary(a=1)
1204 dl.locked = True
1205 l = vim.List()
1206 ll = vim.List('abcE')
1207 ll.locked = True
1208 nel = vim.List('abcO')
1209 f = vim.Function('string')
1210 fd = vim.Function('F')
1211 fdel = vim.Function('D')
1212 vim.command('delfunction D')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001213
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001214 def subexpr_test(expr, name, subexprs):
1215 cb.append('>>> Testing %s using %s' % (name, expr))
1216 for subexpr in subexprs:
1217 ee(expr % subexpr)
1218 cb.append('<<< Finished')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001219
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001220 def stringtochars_test(expr):
1221 return subexpr_test(expr, 'StringToChars', (
1222 '1', # Fail type checks
1223 'u"\\0"', # Fail PyString_AsStringAndSize(bytes, , NULL) check
1224 '"\\0"', # Fail PyString_AsStringAndSize(object, , NULL) check
1225 ))
Bram Moolenaar8600e402013-05-30 13:28:41 +02001226
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001227 class Mapping(object):
1228 def __init__(self, d):
1229 self.d = d
Bram Moolenaar8600e402013-05-30 13:28:41 +02001230
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001231 def __getitem__(self, key):
1232 return self.d[key]
Bram Moolenaar8600e402013-05-30 13:28:41 +02001233
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001234 def keys(self):
1235 return self.d.keys()
Bram Moolenaar8600e402013-05-30 13:28:41 +02001236
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001237 def items(self):
1238 return self.d.items()
Bram Moolenaar8600e402013-05-30 13:28:41 +02001239
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001240 def convertfrompyobject_test(expr, recurse=True):
1241 # pydict_to_tv
1242 stringtochars_test(expr % '{%s : 1}')
1243 if recurse:
1244 convertfrompyobject_test(expr % '{"abcF" : %s}', False)
1245 # pymap_to_tv
1246 stringtochars_test(expr % 'Mapping({%s : 1})')
1247 if recurse:
1248 convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False)
1249 # pyseq_to_tv
1250 iter_test(expr)
1251 return subexpr_test(expr, 'ConvertFromPyObject', (
1252 'None', # Not conversible
1253 '{"": 1}', # Empty key not allowed
1254 '{u"": 1}', # Same, but with unicode object
1255 'FailingMapping()', #
1256 'FailingMappingKey()', #
1257 'FailingNumber()', #
1258 ))
Bram Moolenaar8600e402013-05-30 13:28:41 +02001259
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001260 def convertfrompymapping_test(expr):
1261 convertfrompyobject_test(expr)
1262 return subexpr_test(expr, 'ConvertFromPyMapping', (
1263 '[]',
1264 ))
Bram Moolenaar8600e402013-05-30 13:28:41 +02001265
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001266 def iter_test(expr):
1267 return subexpr_test(expr, '*Iter*', (
1268 'FailingIter()',
1269 'FailingIterNext()',
1270 ))
Bram Moolenaar8600e402013-05-30 13:28:41 +02001271
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001272 def number_test(expr, natural=False, unsigned=False):
1273 if natural:
1274 unsigned = True
1275 return subexpr_test(expr, 'NumberToLong', (
1276 '[]',
1277 'None',
1278 ) + (unsigned and ('-1',) or ())
1279 + (natural and ('0',) or ()))
Bram Moolenaardee2e312013-06-23 16:35:47 +02001280
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001281 class FailingTrue(object):
1282 def __nonzero__(self):
1283 raise NotImplementedError('bool')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001284
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001285 class FailingIter(object):
1286 def __iter__(self):
1287 raise NotImplementedError('iter')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001288
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001289 class FailingIterNext(object):
1290 def __iter__(self):
1291 return self
Bram Moolenaar8600e402013-05-30 13:28:41 +02001292
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001293 def next(self):
1294 raise NotImplementedError('next')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001295
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001296 class FailingIterNextN(object):
1297 def __init__(self, n):
1298 self.n = n
Bram Moolenaar063a46b2014-01-14 16:36:51 +01001299
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001300 def __iter__(self):
1301 return self
Bram Moolenaar063a46b2014-01-14 16:36:51 +01001302
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001303 def next(self):
1304 if self.n:
1305 self.n -= 1
1306 return 1
1307 else:
1308 raise NotImplementedError('next N')
Bram Moolenaar063a46b2014-01-14 16:36:51 +01001309
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001310 class FailingMappingKey(object):
1311 def __getitem__(self, item):
1312 raise NotImplementedError('getitem:mappingkey')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001313
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001314 def keys(self):
1315 return list("abcH")
Bram Moolenaar8600e402013-05-30 13:28:41 +02001316
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001317 class FailingMapping(object):
1318 def __getitem__(self):
1319 raise NotImplementedError('getitem:mapping')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001320
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001321 def keys(self):
1322 raise NotImplementedError('keys')
Bram Moolenaar8600e402013-05-30 13:28:41 +02001323
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001324 class FailingList(list):
1325 def __getitem__(self, idx):
1326 if i == 2:
1327 raise NotImplementedError('getitem:list')
1328 else:
1329 return super(FailingList, self).__getitem__(idx)
Bram Moolenaar8600e402013-05-30 13:28:41 +02001330
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001331 class NoArgsCall(object):
1332 def __call__(self):
1333 pass
Bram Moolenaardee2e312013-06-23 16:35:47 +02001334
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001335 class FailingCall(object):
1336 def __call__(self, path):
1337 raise NotImplementedError('call')
Bram Moolenaardee2e312013-06-23 16:35:47 +02001338
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001339 class FailingNumber(object):
1340 def __int__(self):
1341 raise NotImplementedError('int')
Bram Moolenaardee2e312013-06-23 16:35:47 +02001342
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001343 cb.append("> Output")
1344 cb.append(">> OutputSetattr")
1345 ee('del sys.stdout.softspace')
1346 number_test('sys.stdout.softspace = %s', unsigned=True)
1347 number_test('sys.stderr.softspace = %s', unsigned=True)
1348 ee('assert sys.stdout.isatty()==False')
1349 ee('assert sys.stdout.seekable()==False')
1350 ee('sys.stdout.close()')
1351 ee('sys.stdout.flush()')
1352 ee('assert sys.stderr.isatty()==False')
1353 ee('assert sys.stderr.seekable()==False')
1354 ee('sys.stderr.close()')
1355 ee('sys.stderr.flush()')
1356 ee('sys.stdout.attr = None')
1357 cb.append(">> OutputWrite")
1358 ee('assert sys.stdout.writable()==True')
1359 ee('assert sys.stdout.readable()==False')
1360 ee('assert sys.stderr.writable()==True')
1361 ee('assert sys.stderr.readable()==False')
1362 ee('assert sys.stdout.closed()==False')
1363 ee('assert sys.stderr.closed()==False')
1364 ee('assert sys.stdout.errors=="strict"')
1365 ee('assert sys.stderr.errors=="strict"')
1366 ee('assert sys.stdout.encoding==sys.stderr.encoding')
1367 ee('sys.stdout.write(None)')
1368 cb.append(">> OutputWriteLines")
1369 ee('sys.stdout.writelines(None)')
1370 ee('sys.stdout.writelines([1])')
1371 iter_test('sys.stdout.writelines(%s)')
1372 cb.append("> VimCommand")
1373 stringtochars_test('vim.command(%s)')
1374 ee('vim.command("", 2)')
1375 #! Not checked: vim->python exceptions translating: checked later
1376 cb.append("> VimToPython")
1377 #! Not checked: everything: needs errors in internal python functions
1378 cb.append("> VimEval")
1379 stringtochars_test('vim.eval(%s)')
1380 ee('vim.eval("", FailingTrue())')
1381 #! Not checked: everything: needs errors in internal python functions
1382 cb.append("> VimEvalPy")
1383 stringtochars_test('vim.bindeval(%s)')
1384 ee('vim.eval("", 2)')
1385 #! Not checked: vim->python exceptions translating: checked later
1386 cb.append("> VimStrwidth")
1387 stringtochars_test('vim.strwidth(%s)')
1388 cb.append("> VimForeachRTP")
1389 ee('vim.foreach_rtp(None)')
1390 ee('vim.foreach_rtp(NoArgsCall())')
1391 ee('vim.foreach_rtp(FailingCall())')
1392 ee('vim.foreach_rtp(int, 2)')
1393 cb.append('> import')
1394 old_rtp = vim.options['rtp']
1395 vim.options['rtp'] = os.getcwd().replace('\\', '\\\\').replace(',', '\\,')
1396 ee('import xxx_no_such_module_xxx')
1397 ee('import failing_import')
1398 ee('import failing')
1399 vim.options['rtp'] = old_rtp
1400 del old_rtp
1401 cb.append("> Options")
1402 cb.append(">> OptionsItem")
1403 ee('vim.options["abcQ"]')
1404 ee('vim.options[""]')
1405 stringtochars_test('vim.options[%s]')
1406 cb.append(">> OptionsContains")
1407 stringtochars_test('%s in vim.options')
1408 cb.append("> Dictionary")
1409 cb.append(">> DictionaryConstructor")
1410 ee('vim.Dictionary("abcI")')
1411 ##! Not checked: py_dict_alloc failure
1412 cb.append(">> DictionarySetattr")
1413 ee('del d.locked')
1414 ee('d.locked = FailingTrue()')
1415 ee('vim.vvars.locked = False')
1416 ee('d.scope = True')
1417 ee('d.xxx = True')
1418 cb.append(">> _DictionaryItem")
1419 ee('d.get("a", 2, 3)')
1420 stringtochars_test('d.get(%s)')
1421 ee('d.pop("a")')
1422 ee('dl.pop("a")')
1423 cb.append(">> DictionaryContains")
1424 ee('"" in d')
1425 ee('0 in d')
1426 cb.append(">> DictionaryIterNext")
1427 ee('for i in ned: ned["a"] = 1')
1428 del i
1429 cb.append(">> DictionaryAssItem")
1430 ee('dl["b"] = 1')
1431 stringtochars_test('d[%s] = 1')
1432 convertfrompyobject_test('d["a"] = %s')
1433 cb.append(">> DictionaryUpdate")
1434 cb.append(">>> kwargs")
1435 cb.append(">>> iter")
1436 ee('d.update(FailingMapping())')
1437 ee('d.update([FailingIterNext()])')
1438 ee('d.update([FailingIterNextN(1)])')
1439 iter_test('d.update(%s)')
1440 convertfrompyobject_test('d.update(%s)')
1441 stringtochars_test('d.update(((%s, 0),))')
1442 convertfrompyobject_test('d.update((("a", %s),))')
1443 cb.append(">> DictionaryPopItem")
1444 ee('d.popitem(1, 2)')
1445 cb.append(">> DictionaryHasKey")
1446 ee('d.has_key()')
1447 cb.append("> List")
1448 cb.append(">> ListConstructor")
1449 ee('vim.List(1, 2)')
1450 ee('vim.List(a=1)')
1451 iter_test('vim.List(%s)')
1452 convertfrompyobject_test('vim.List([%s])')
1453 cb.append(">> ListItem")
1454 ee('l[1000]')
1455 cb.append(">> ListAssItem")
1456 ee('ll[1] = 2')
1457 ee('l[1000] = 3')
1458 cb.append(">> ListAssSlice")
1459 ee('ll[1:100] = "abcJ"')
1460 iter_test('l[:] = %s')
1461 ee('nel[1:10:2] = "abcK"')
1462 cb.append(repr(tuple(nel)))
1463 ee('nel[1:10:2] = "a"')
1464 cb.append(repr(tuple(nel)))
1465 ee('nel[1:1:-1] = "a"')
1466 cb.append(repr(tuple(nel)))
1467 ee('nel[:] = FailingIterNextN(2)')
1468 cb.append(repr(tuple(nel)))
1469 convertfrompyobject_test('l[:] = [%s]')
1470 cb.append(">> ListConcatInPlace")
1471 iter_test('l.extend(%s)')
1472 convertfrompyobject_test('l.extend([%s])')
1473 cb.append(">> ListSetattr")
1474 ee('del l.locked')
1475 ee('l.locked = FailingTrue()')
1476 ee('l.xxx = True')
1477 cb.append("> Function")
1478 cb.append(">> FunctionConstructor")
1479 cb.append(">>> FunctionConstructor")
1480 ee('vim.Function("123")')
1481 ee('vim.Function("xxx_non_existent_function_xxx")')
1482 ee('vim.Function("xxx#non#existent#function#xxx")')
1483 ee('vim.Function("xxx_non_existent_function_xxx2", args=[])')
1484 ee('vim.Function("xxx_non_existent_function_xxx3", self={})')
1485 ee('vim.Function("xxx_non_existent_function_xxx4", args=[], self={})')
1486 cb.append(">>> FunctionNew")
1487 ee('vim.Function("tr", self="abcFuncSelf")')
1488 ee('vim.Function("tr", args=427423)')
1489 ee('vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2")')
1490 ee('vim.Function(self="abcFuncSelf2", args="abcFuncArgs2")')
1491 ee('vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2")')
1492 ee('vim.Function("tr", "")')
1493 cb.append(">> FunctionCall")
1494 convertfrompyobject_test('f(%s)')
1495 convertfrompymapping_test('fd(self=%s)')
1496 cb.append("> TabPage")
1497 cb.append(">> TabPageAttr")
1498 ee('vim.current.tabpage.xxx')
1499 cb.append("> TabList")
1500 cb.append(">> TabListItem")
1501 ee('vim.tabpages[1000]')
1502 cb.append("> Window")
1503 cb.append(">> WindowAttr")
1504 ee('vim.current.window.xxx')
1505 cb.append(">> WindowSetattr")
1506 ee('vim.current.window.buffer = 0')
1507 ee('vim.current.window.cursor = (100000000, 100000000)')
1508 ee('vim.current.window.cursor = True')
1509 number_test('vim.current.window.height = %s', unsigned=True)
1510 number_test('vim.current.window.width = %s', unsigned=True)
1511 ee('vim.current.window.xxxxxx = True')
1512 cb.append("> WinList")
1513 cb.append(">> WinListItem")
1514 ee('vim.windows[1000]')
1515 cb.append("> Buffer")
1516 cb.append(">> StringToLine (indirect)")
1517 ee('vim.current.buffer[0] = u"\\na"')
1518 ee('vim.current.buffer[0] = "\\na"')
1519 cb.append(">> SetBufferLine (indirect)")
1520 ee('vim.current.buffer[0] = True')
1521 cb.append(">> SetBufferLineList (indirect)")
1522 ee('vim.current.buffer[:] = True')
1523 ee('vim.current.buffer[:] = ["\\na", "bc"]')
1524 cb.append(">> InsertBufferLines (indirect)")
1525 ee('vim.current.buffer.append(None)')
1526 ee('vim.current.buffer.append(["\\na", "bc"])')
1527 ee('vim.current.buffer.append("\\nbc")')
1528 cb.append(">> RBItem")
1529 ee('vim.current.buffer[100000000]')
1530 cb.append(">> RBAsItem")
1531 ee('vim.current.buffer[100000000] = ""')
1532 cb.append(">> BufferAttr")
1533 ee('vim.current.buffer.xxx')
1534 cb.append(">> BufferSetattr")
1535 ee('vim.current.buffer.name = True')
1536 ee('vim.current.buffer.xxx = True')
1537 cb.append(">> BufferMark")
1538 ee('vim.current.buffer.mark(0)')
1539 ee('vim.current.buffer.mark("abcM")')
1540 ee('vim.current.buffer.mark("!")')
1541 cb.append(">> BufferRange")
1542 ee('vim.current.buffer.range(1, 2, 3)')
1543 cb.append("> BufMap")
1544 cb.append(">> BufMapItem")
1545 ee('vim.buffers[100000000]')
1546 number_test('vim.buffers[%s]', natural=True)
1547 cb.append("> Current")
1548 cb.append(">> CurrentGetattr")
1549 ee('vim.current.xxx')
1550 cb.append(">> CurrentSetattr")
1551 ee('vim.current.line = True')
1552 ee('vim.current.buffer = True')
1553 ee('vim.current.window = True')
1554 ee('vim.current.tabpage = True')
1555 ee('vim.current.xxx = True')
1556 del d
1557 del ned
1558 del dl
1559 del l
1560 del ll
1561 del nel
1562 del f
1563 del fd
1564 del fdel
1565 del subexpr_test
1566 del stringtochars_test
1567 del Mapping
1568 del convertfrompyobject_test
1569 del convertfrompymapping_test
1570 del iter_test
1571 del number_test
1572 del FailingTrue
1573 del FailingIter
1574 del FailingIterNext
1575 del FailingIterNextN
1576 del FailingMapping
1577 del FailingMappingKey
1578 del FailingList
1579 del NoArgsCall
1580 del FailingCall
1581 del FailingNumber
Bram Moolenaar8600e402013-05-30 13:28:41 +02001582EOF
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001583:delfunction F
Bram Moolenaar8600e402013-05-30 13:28:41 +02001584:"
Bram Moolenaara9f22202013-06-11 18:48:21 +02001585:" Test import
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001586py << trim EOF
1587 sys.path.insert(0, os.path.join(os.getcwd(), 'python_before'))
1588 sys.path.append(os.path.join(os.getcwd(), 'python_after'))
1589 vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\')
1590 l = []
1591 def callback(path):
1592 l.append(path[-len('/testdir'):].replace(os.path.sep, '/'))
1593 vim.foreach_rtp(callback)
1594 cb.append(repr(l))
1595 del l
1596 def callback(path):
1597 return path[-len('/testdir'):].replace(os.path.sep, '/')
1598 cb.append(repr(vim.foreach_rtp(callback)))
1599 del callback
1600 from module import dir as d
1601 from modulex import ddir
1602 cb.append(d + ',' + ddir)
1603 import before
1604 cb.append(before.dir)
1605 import after
1606 cb.append(after.dir)
1607 import topmodule as tm
1608 import topmodule.submodule as tms
1609 import topmodule.submodule.subsubmodule.subsubsubmodule as tmsss
1610 cb.append(tm.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/__init__.py'):])
1611 cb.append(tms.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/__init__.py'):])
1612 cb.append(tmsss.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/subsubmodule/subsubsubmodule.py'):])
1613 del before
1614 del after
1615 del d
1616 del ddir
1617 del tm
1618 del tms
1619 del tmsss
Bram Moolenaara9f22202013-06-11 18:48:21 +02001620EOF
Bram Moolenaarc09a6d62013-06-10 21:27:29 +02001621:"
Bram Moolenaar8600e402013-05-30 13:28:41 +02001622:" Test exceptions
1623:fun Exe(e)
1624: execute a:e
1625:endfun
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001626py << trim EOF
1627 Exe = vim.bindeval('function("Exe")')
1628 ee('vim.command("throw \'abcN\'")')
1629 ee('Exe("throw \'def\'")')
1630 ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
1631 ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
1632 ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
1633 ee('vim.eval("xxx_unknown_function_xxx()")')
1634 ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
1635 del Exe
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001636EOF
1637:delfunction Exe
1638:"
Bram Moolenaard6b8a522013-11-11 01:05:48 +01001639:" Regression: interrupting vim.command propagates to next vim.command
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001640py << trim EOF
1641 def test_keyboard_interrupt():
1642 try:
1643 vim.command('while 1 | endwhile')
1644 except KeyboardInterrupt:
1645 cb.append('Caught KeyboardInterrupt')
1646 except Exception:
1647 cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
1648 else:
1649 cb.append('!!!!!!!! No exception')
1650 try:
1651 vim.command('$ put =\'Running :put\'')
1652 except KeyboardInterrupt:
1653 cb.append('!!!!!!!! Caught KeyboardInterrupt')
1654 except Exception:
1655 cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
1656 else:
1657 cb.append('No exception')
Bram Moolenaard6b8a522013-11-11 01:05:48 +01001658EOF
1659:debuggreedy
1660:call inputsave()
1661:call feedkeys("s\ns\ns\ns\nq\n")
1662:redir => output
1663:debug silent! py test_keyboard_interrupt()
1664:redir END
1665:0 debuggreedy
Bram Moolenaar56f62272014-09-29 18:08:59 +02001666:call inputrestore()
Bram Moolenaard6b8a522013-11-11 01:05:48 +01001667:silent $put =output
1668:unlet output
1669:py del test_keyboard_interrupt
1670:"
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001671:" Cleanup
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02001672py << trim EOF
1673 del cb
1674 del ee
1675 del emsg
1676 del sys
1677 del os
1678 del vim
Bram Moolenaara7b64ce2013-05-21 20:40:40 +02001679EOF
Bram Moolenaardb913952012-06-29 12:54:53 +02001680:endfun
1681:"
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001682:fun RunTest()
1683:let checkrefs = !empty($PYTHONDUMPREFS)
1684:let start = getline(1, '$')
1685:for i in range(checkrefs ? 10 : 1)
1686: if i != 0
1687: %d _
1688: call setline(1, start)
1689: endif
1690: call Test()
1691: if i == 0
1692: let result = getline(1, '$')
1693: endif
1694:endfor
1695:if checkrefs
1696: %d _
1697: call setline(1, result)
1698:endif
1699:endfun
Bram Moolenaardb913952012-06-29 12:54:53 +02001700:"
Bram Moolenaar841fbd22013-06-23 14:37:07 +02001701:call RunTest()
1702:delfunction RunTest
1703:delfunction Test
Bram Moolenaardb913952012-06-29 12:54:53 +02001704:call garbagecollect(1)
1705:"
1706:/^start:/,$wq! test.out
Bram Moolenaardee2e312013-06-23 16:35:47 +02001707:" vim: et ts=4 isk-=\:
Bram Moolenaar8110a092016-04-14 15:56:09 +02001708:while getchar(0) isnot 0|endwhile
Bram Moolenaardb913952012-06-29 12:54:53 +02001709ENDTEST
1710
1711start: