blob: afefd10fed8206a4f35dc6c5e99d610fa9d62c80 [file] [log] [blame]
Bram Moolenaara58883b2017-01-29 21:31:09 +01001" Test for python 2 commands.
Bram Moolenaara58883b2017-01-29 21:31:09 +01002
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
4CheckFeature python
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02005CheckFeature quickfix
Bram Moolenaarab589462020-07-06 21:03:06 +02006source shared.vim
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02007
8" NOTE: This will cause errors when run under valgrind.
9" This would require recompiling Python with:
10" ./configure --without-pymalloc
11" See http://svn.python.org/view/python/trunk/Misc/README.valgrind?view=markup
12"
13
14" This function should be called first. This sets up python functions used by
15" the other tests.
16func Test_AAA_python_setup()
17 py << trim EOF
18 import vim
19 import sys
20
21 def emsg(ei):
22 return ei[0].__name__ + ':' + repr(ei[1].args)
23
24 def ee(expr, g=globals(), l=locals()):
25 try:
26 exec(expr, g, l)
27 except:
28 ei = sys.exc_info()
29 msg = emsg(ei)
30 msg = msg.replace('TypeError:(\'argument 1 ', 'TypeError:(\'')
31 if expr.find('None') > -1:
32 msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
33 'TypeError:("\'NoneType\' object is not iterable",)')
34 if expr.find('FailingNumber') > -1:
35 msg = msg.replace(', not \'FailingNumber\'', '').replace('"', '\'')
36 msg = msg.replace('TypeError:(\'iteration over non-sequence\',)',
37 'TypeError:("\'FailingNumber\' object is not iterable",)')
38 if msg.find('(\'\'') > -1 or msg.find('(\'can\'t') > -1:
39 msg = msg.replace('(\'', '("').replace('\',)', '",)')
40 # Some Python versions say can't, others cannot.
41 if msg.find('can\'t') > -1:
42 msg = msg.replace('can\'t', 'cannot')
43 # Some Python versions use single quote, some double quote
44 if msg.find('"cannot ') > -1:
45 msg = msg.replace('"cannot ', '\'cannot ')
46 if msg.find(' attributes"') > -1:
47 msg = msg.replace(' attributes"', ' attributes\'')
48 if expr == 'fd(self=[])':
49 # HACK: PyMapping_Check changed meaning
50 msg = msg.replace('AttributeError:(\'keys\',)',
51 'TypeError:(\'unable to convert list to vim dictionary\',)')
52 vim.current.buffer.append(expr + ':' + msg)
53 else:
54 vim.current.buffer.append(expr + ':NOT FAILED')
55 EOF
56endfunc
Bram Moolenaara58883b2017-01-29 21:31:09 +010057
58func Test_pydo()
Bram Moolenaarab589462020-07-06 21:03:06 +020059 " Check deleting lines does not trigger an ml_get error.
Bram Moolenaara58883b2017-01-29 21:31:09 +010060 new
61 call setline(1, ['one', 'two', 'three'])
62 pydo vim.command("%d_")
63 bwipe!
64
Bram Moolenaarab589462020-07-06 21:03:06 +020065 " Check switching to another buffer does not trigger an ml_get error.
Bram Moolenaara58883b2017-01-29 21:31:09 +010066 new
67 let wincount = winnr('$')
68 call setline(1, ['one', 'two', 'three'])
69 pydo vim.command("new")
70 call assert_equal(wincount + 1, winnr('$'))
71 bwipe!
72 bwipe!
Bram Moolenaarab589462020-07-06 21:03:06 +020073
74 " Try modifying a buffer with 'nomodifiable' set
75 set nomodifiable
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020076 call assert_fails('pydo toupper(line)', 'E21:')
Bram Moolenaarab589462020-07-06 21:03:06 +020077 set modifiable
78
79 " Invalid command
80 call AssertException(['pydo non_existing_cmd'],
81 \ "Vim(pydo):NameError: global name 'non_existing_cmd' is not defined")
82 call AssertException(["pydo raise Exception('test')"],
83 \ 'Vim(pydo):Exception: test')
84 call AssertException(["pydo {lambda}"],
85 \ 'Vim(pydo):SyntaxError: invalid syntax')
Bram Moolenaara58883b2017-01-29 21:31:09 +010086endfunc
Bram Moolenaar53901442018-07-25 22:02:36 +020087
88func Test_set_cursor()
89 " Check that setting the cursor position works.
Bram Moolenaar53901442018-07-25 22:02:36 +020090 new
91 call setline(1, ['first line', 'second line'])
92 normal gg
93 pydo vim.current.window.cursor = (1, 5)
94 call assert_equal([1, 6], [line('.'), col('.')])
95
96 " Check that movement after setting cursor position keeps current column.
97 normal j
98 call assert_equal([2, 6], [line('.'), col('.')])
99endfunc
Bram Moolenaar9123c0b2018-12-22 18:59:06 +0100100
101func Test_vim_function()
102 " Check creating vim.Function object
Bram Moolenaar9123c0b2018-12-22 18:59:06 +0100103
104 func s:foo()
105 return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$')
106 endfunc
107 let name = '<SNR>' . s:foo()
108
109 try
110 py f = vim.bindeval('function("s:foo")')
111 call assert_equal(name, pyeval('f.name'))
112 catch
113 call assert_false(v:exception)
114 endtry
115
116 try
117 py f = vim.Function('\x80\xfdR' + vim.eval('s:foo()'))
Bram Moolenaar3f4f3d82019-09-04 20:05:59 +0200118 call assert_equal(name, 'f.name'->pyeval())
Bram Moolenaar9123c0b2018-12-22 18:59:06 +0100119 catch
120 call assert_false(v:exception)
121 endtry
122
Bram Moolenaarab589462020-07-06 21:03:06 +0200123 " Non-existing function attribute
124 call AssertException(["let x = pyeval('f.abc')"],
125 \ 'Vim(let):AttributeError: abc')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200126
Bram Moolenaar9123c0b2018-12-22 18:59:06 +0100127 py del f
128 delfunc s:foo
129endfunc
Bram Moolenaar14816ad2019-02-18 22:04:56 +0100130
131func Test_skipped_python_command_does_not_affect_pyxversion()
132 set pyxversion=0
133 if 0
134 python import vim
135 endif
136 call assert_equal(0, &pyxversion) " This assertion would have failed with Vim 8.0.0251. (pyxversion was introduced in 8.0.0251.)
137endfunc
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100138
139func _SetUpHiddenBuffer()
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100140 new
141 edit hidden
142 setlocal bufhidden=hide
143
144 enew
145 let lnum = 0
146 while lnum < 10
147 call append( 1, string( lnum ) )
148 let lnum = lnum + 1
149 endwhile
150 normal G
151
152 call assert_equal( line( '.' ), 11 )
153endfunc
154
Bram Moolenaarbfd36032019-03-30 12:33:13 +0100155func _CleanUpHiddenBuffer()
156 bwipe! hidden
157 bwipe!
158endfunc
159
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100160func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Clear()
161 call _SetUpHiddenBuffer()
162 py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = None
163 call assert_equal( line( '.' ), 11 )
Bram Moolenaarbfd36032019-03-30 12:33:13 +0100164 call _CleanUpHiddenBuffer()
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100165endfunc
166
167func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_List()
168 call _SetUpHiddenBuffer()
169 py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = [ 'test' ]
170 call assert_equal( line( '.' ), 11 )
Bram Moolenaarbfd36032019-03-30 12:33:13 +0100171 call _CleanUpHiddenBuffer()
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100172endfunc
173
174func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Str()
175 call _SetUpHiddenBuffer()
176 py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = 'test'
177 call assert_equal( line( '.' ), 11 )
Bram Moolenaarbfd36032019-03-30 12:33:13 +0100178 call _CleanUpHiddenBuffer()
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100179endfunc
180
181func Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_ClearLine()
182 call _SetUpHiddenBuffer()
183 py vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = None
184 call assert_equal( line( '.' ), 11 )
Bram Moolenaarbfd36032019-03-30 12:33:13 +0100185 call _CleanUpHiddenBuffer()
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100186endfunc
187
188func _SetUpVisibleBuffer()
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100189 new
190 let lnum = 0
191 while lnum < 10
192 call append( 1, string( lnum ) )
193 let lnum = lnum + 1
194 endwhile
195 normal G
196 call assert_equal( line( '.' ), 11 )
197endfunc
198
199func Test_Write_To_Current_Buffer_Fixes_Cursor_Clear()
200 call _SetUpVisibleBuffer()
201
202 py vim.current.buffer[:] = None
203 call assert_equal( line( '.' ), 1 )
204
205 bwipe!
206endfunc
207
208func Test_Write_To_Current_Buffer_Fixes_Cursor_List()
209 call _SetUpVisibleBuffer()
210
211 py vim.current.buffer[:] = [ 'test' ]
212 call assert_equal( line( '.' ), 1 )
213
214 bwipe!
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200215endfunc
Bram Moolenaar63dbfd32019-03-23 17:41:59 +0100216
217func Test_Write_To_Current_Buffer_Fixes_Cursor_Str()
218 call _SetUpVisibleBuffer()
219
220 py vim.current.buffer[-1] = None
221 call assert_equal( line( '.' ), 10 )
222
223 bwipe!
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200224endfunc
Bram Moolenaar7f3a2842019-05-18 15:02:25 +0200225
226func Test_Catch_Exception_Message()
227 try
228 py raise RuntimeError( 'TEST' )
229 catch /.*/
230 call assert_match( '^Vim(.*):RuntimeError: TEST$', v:exception )
231 endtry
232endfunc
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200233
234" Test for various heredoc syntax
235func Test_python_heredoc()
236 python << END
237s='A'
238END
239 python <<
240s+='B'
241.
242 python << trim END
243 s+='C'
244 END
245 python << trim
246 s+='D'
247 .
Bram Moolenaar6ab09532020-05-01 14:10:13 +0200248 python << trim eof
249 s+='E'
250 eof
251 call assert_equal('ABCDE', pyxeval('s'))
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200252endfunc
253
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200254" Test for the buffer range object
255func Test_python_range()
256 new
257 call setline(1, ['one', 'two', 'three'])
258 py b = vim.current.buffer
259 py r = b.range(1, 3)
260 call assert_equal(0, pyeval('r.start'))
261 call assert_equal(2, pyeval('r.end'))
Bram Moolenaarab589462020-07-06 21:03:06 +0200262 call assert_equal('one', pyeval('r[0]'))
263 call assert_equal('one', pyeval('r[-3]'))
264 call assert_equal('three', pyeval('r[-4]'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200265 call assert_equal(['two', 'three'], pyeval('r[1:]'))
266 py r[0] = 'green'
267 call assert_equal(['green', 'two', 'three'], getline(1, '$'))
268 py r[0:2] = ['red', 'blue']
269 call assert_equal(['red', 'blue', 'three'], getline(1, '$'))
270 call assert_equal(['start', 'end', '__members__'], pyeval('r.__members__'))
271
Bram Moolenaarab589462020-07-06 21:03:06 +0200272 " try different invalid start/end index for the range slice
273 %d
274 call setline(1, ['one', 'two', 'three'])
275 py r[-10:1] = ["a"]
276 py r[10:12] = ["b"]
277 py r[-10:-9] = ["c"]
278 py r[1:0] = ["d"]
279 call assert_equal(['c', 'd', 'a', 'two', 'three', 'b'], getline(1, '$'))
280
Bram Moolenaarbb790dc2020-07-07 20:12:54 +0200281 " The following code used to trigger an ml_get error
282 %d
283 let x = pyeval('r[:]')
Bram Moolenaarab589462020-07-06 21:03:06 +0200284
285 " Non-existing range attribute
286 call AssertException(["let x = pyeval('r.abc')"],
287 \ 'Vim(let):AttributeError: abc')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200288
289 close!
290endfunc
291
292" Test for the python tabpage object
293func Test_python_tabpage()
294 tabnew
295 py t = vim.tabpages[1]
Bram Moolenaarab589462020-07-06 21:03:06 +0200296 py wl = t.windows
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200297 tabclose
Bram Moolenaarab589462020-07-06 21:03:06 +0200298 " Accessing a closed tabpage
299 call AssertException(["let n = pyeval('t.number')"],
300 \ 'Vim(let):vim.error: attempt to refer to deleted tab page')
301 call AssertException(["let n = pyeval('len(wl)')"],
302 \ 'Vim(let):vim.error: attempt to refer to deleted tab page')
303 call AssertException(["py w = wl[0]"],
304 \ 'Vim(python):vim.error: attempt to refer to deleted tab page')
305 call AssertException(["py vim.current.tabpage = t"],
306 \ 'Vim(python):vim.error: attempt to refer to deleted tab page')
307 call assert_match('<tabpage object (deleted)', pyeval('repr(t)'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200308 %bw!
309endfunc
310
311" Test for the python window object
312func Test_python_window()
Bram Moolenaarab589462020-07-06 21:03:06 +0200313 " Test for setting the window height
314 10new
315 py vim.current.window.height = 5
316 call assert_equal(5, winheight(0))
317
318 " Test for setting the window width
319 10vnew
320 py vim.current.window.width = 6
321 call assert_equal(6, winwidth(0))
322
323 " Try accessing a closed window
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200324 py w = vim.current.window
Bram Moolenaarab589462020-07-06 21:03:06 +0200325 py wopts = w.options
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200326 close
Bram Moolenaarab589462020-07-06 21:03:06 +0200327 " Access the attributes of a closed window
328 call AssertException(["let n = pyeval('w.number')"],
329 \ 'Vim(let):vim.error: attempt to refer to deleted window')
330 call AssertException(["py w.height = 5"],
331 \ 'Vim(python):vim.error: attempt to refer to deleted window')
332 call AssertException(["py vim.current.window = w"],
333 \ 'Vim(python):vim.error: attempt to refer to deleted window')
334 " Try to set one of the options of the closed window
Bram Moolenaarbb790dc2020-07-07 20:12:54 +0200335 " The following caused an ASAN failure
336 call AssertException(["py wopts['list'] = False"],
337 \ 'vim.error: attempt to refer to deleted window')
Bram Moolenaarab589462020-07-06 21:03:06 +0200338 call assert_match('<window object (deleted)', pyeval("repr(w)"))
339 %bw!
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200340endfunc
341
342" Test for the python List object
343func Test_python_list()
344 let l = [1, 2]
345 py pl = vim.bindeval('l')
346 call assert_equal(['locked', '__members__'], pyeval('pl.__members__'))
347
Bram Moolenaarab589462020-07-06 21:03:06 +0200348 " Try to convert a null List
349 call AssertException(["py t = vim.eval('test_null_list()')"],
350 \ 'Vim(python):SystemError: error return without exception set')
351
352 " Try to convert a List with a null List item
353 call AssertException(["py t = vim.eval('[test_null_list()]')"],
354 \ 'Vim(python):SystemError: error return without exception set')
355
Bram Moolenaar64ffa9b2020-11-04 12:23:06 +0100356 " Try to bind a null List variable (works because an empty list is used)
Bram Moolenaarab589462020-07-06 21:03:06 +0200357 let cmds =<< trim END
358 let l = test_null_list()
359 py ll = vim.bindeval('l')
360 END
Bram Moolenaar64ffa9b2020-11-04 12:23:06 +0100361 call AssertException(cmds, '')
Bram Moolenaarab589462020-07-06 21:03:06 +0200362
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200363 let l = []
364 py l = vim.bindeval('l')
365 py f = vim.bindeval('function("strlen")')
366 " Extending List directly with different types
367 py l.extend([1, "as'd", [1, 2, f, {'a': 1}]])
368 call assert_equal([1, "as'd", [1, 2, function("strlen"), {'a': 1}]], l)
369 call assert_equal([1, 2, function("strlen"), {'a': 1}], l[-1])
370 call assert_fails('echo l[-4]', 'E684:')
371
372 " List assignment
373 py l[0] = 0
374 call assert_equal([0, "as'd", [1, 2, function("strlen"), {'a': 1}]], l)
375 py l[-2] = f
376 call assert_equal([0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]], l)
Bram Moolenaarab589462020-07-06 21:03:06 +0200377
378 " appending to a list
379 let l = [1, 2]
380 py ll = vim.bindeval('l')
381 py ll[2] = 8
382 call assert_equal([1, 2, 8], l)
383
384 " Using dict as an index
385 call AssertException(['py ll[{}] = 10'],
386 \ 'Vim(python):TypeError: index must be int or slice, not dict')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200387endfunc
388
389" Test for the python Dict object
390func Test_python_dict()
391 let d = {}
392 py pd = vim.bindeval('d')
393 call assert_equal(['locked', 'scope', '__members__'],
394 \ pyeval('pd.__members__'))
Bram Moolenaarab589462020-07-06 21:03:06 +0200395
396 " Try to convert a null Dict
397 call AssertException(["py t = vim.eval('test_null_dict()')"],
398 \ 'Vim(python):SystemError: error return without exception set')
399
400 " Try to convert a Dict with a null List value
401 call AssertException(["py t = vim.eval(\"{'a' : test_null_list()}\")"],
402 \ 'Vim(python):SystemError: error return without exception set')
403
404 " Try to convert a Dict with a null string key
405 py t = vim.eval("{test_null_string() : 10}")
406 call assert_fails("let d = pyeval('t')", 'E859:')
407
408 " Dict length
409 let d = {'a' : 10, 'b' : 20}
410 py d = vim.bindeval('d')
411 call assert_equal(2, pyeval('len(d)'))
412
413 " Deleting an non-existing key
414 call AssertException(["py del d['c']"], "Vim(python):KeyError: 'c'")
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200415endfunc
416
417" Extending Dictionary directly with different types
418func Test_python_dict_extend()
419 let d = {}
420 func d.f()
421 return 1
422 endfunc
423
424 py f = vim.bindeval('function("strlen")')
425 py << trim EOF
426 d = vim.bindeval('d')
427 d['1'] = 'asd'
428 d.update() # Must not do anything, including throwing errors
429 d.update(b = [1, 2, f])
430 d.update((('-1', {'a': 1}),))
431 d.update({'0': -1})
432 dk = d.keys()
433 dv = d.values()
434 di = d.items()
435 cmpfun = lambda a, b: cmp(repr(a), repr(b))
436 dk.sort(cmpfun)
437 dv.sort(cmpfun)
438 di.sort(cmpfun)
439 EOF
440
Bram Moolenaarab589462020-07-06 21:03:06 +0200441 " Try extending a locked dictionary
442 lockvar d
443 call AssertException(["py d.update({'b' : 20})"],
444 \ 'Vim(python):vim.error: dictionary is locked')
445 unlockvar d
446
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200447 call assert_equal(1, pyeval("d['f'](self={})"))
448 call assert_equal("['-1', '0', '1', 'b', 'f']", pyeval('repr(dk)'))
449 call assert_equal("['asd', -1L, <vim.Function '1'>, <vim.dictionary object at >, <vim.list object at >]", substitute(pyeval('repr(dv)'),'0x\x\+','','g'))
450 call assert_equal("[('-1', <vim.dictionary object at >), ('0', -1L), ('1', 'asd'), ('b', <vim.list object at >), ('f', <vim.Function '1'>)]", substitute(pyeval('repr(di)'),'0x\x\+','','g'))
451 call assert_equal(['0', '1', 'b', 'f', '-1'], keys(d))
452 call assert_equal("[-1, 'asd', [1, 2, function('strlen')], function('1'), {'a': 1}]", string(values(d)))
453 py del dk
454 py del di
455 py del dv
456endfunc
457
458func Test_python_list_del_items()
459 " removing items with del
460 let l = [0, function("strlen"), [1, 2, function("strlen"), {'a': 1}]]
461 py l = vim.bindeval('l')
462 py del l[2]
463 call assert_equal("[0, function('strlen')]", string(l))
464
465 let l = range(8)
466 py l = vim.bindeval('l')
467 py del l[:3]
468 py del l[1:]
469 call assert_equal([3], l)
470
471 " removing items out of range: silently skip items that don't exist
472
473 " The following two ranges delete nothing as they match empty list:
474 let l = [0, 1, 2, 3]
475 py l = vim.bindeval('l')
476 py del l[2:1]
477 call assert_equal([0, 1, 2, 3], l)
478 py del l[2:2]
479 call assert_equal([0, 1, 2, 3], l)
480 py del l[2:3]
481 call assert_equal([0, 1, 3], l)
482
483 let l = [0, 1, 2, 3]
484 py l = vim.bindeval('l')
485 py del l[2:4]
486 call assert_equal([0, 1], l)
487
488 let l = [0, 1, 2, 3]
489 py l = vim.bindeval('l')
490 py del l[2:5]
491 call assert_equal([0, 1], l)
492
493 let l = [0, 1, 2, 3]
494 py l = vim.bindeval('l')
495 py del l[2:6]
496 call assert_equal([0, 1], l)
497
498 " The following two ranges delete nothing as they match empty list:
499 let l = [0, 1, 2, 3]
500 py l = vim.bindeval('l')
501 py del l[-1:2]
502 call assert_equal([0, 1, 2, 3], l)
503 py del l[-2:2]
504 call assert_equal([0, 1, 2, 3], l)
505 py del l[-3:2]
506 call assert_equal([0, 2, 3], l)
507
508 let l = [0, 1, 2, 3]
509 py l = vim.bindeval('l')
510 py del l[-4:2]
511 call assert_equal([2, 3], l)
512
513 let l = [0, 1, 2, 3]
514 py l = vim.bindeval('l')
515 py del l[-5:2]
516 call assert_equal([2, 3], l)
517
518 let l = [0, 1, 2, 3]
519 py l = vim.bindeval('l')
520 py del l[-6:2]
521 call assert_equal([2, 3], l)
522
523 let l = [0, 1, 2, 3]
524 py l = vim.bindeval('l')
525 py del l[::2]
526 call assert_equal([1, 3], l)
527
528 let l = [0, 1, 2, 3]
529 py l = vim.bindeval('l')
530 py del l[3:0:-2]
531 call assert_equal([0, 2], l)
532
533 let l = [0, 1, 2, 3]
534 py l = vim.bindeval('l')
535 py del l[2:4:-2]
536 let l = [0, 1, 2, 3]
537endfunc
538
539func Test_python_dict_del_items()
540 let d = eval("{'0' : -1, '1' : 'asd', 'b' : [1, 2, function('strlen')], 'f' : function('min'), '-1' : {'a': 1}}")
541 py d = vim.bindeval('d')
542 py del d['-1']
543 py del d['f']
544 call assert_equal([1, 2, function('strlen')], pyeval('d.get(''b'', 1)'))
545 call assert_equal([1, 2, function('strlen')], pyeval('d.pop(''b'')'))
546 call assert_equal(1, pyeval('d.get(''b'', 1)'))
547 call assert_equal('asd', pyeval('d.pop(''1'', 2)'))
548 call assert_equal(2, pyeval('d.pop(''1'', 2)'))
549 call assert_equal('True', pyeval('repr(d.has_key(''0''))'))
550 call assert_equal('False', pyeval('repr(d.has_key(''1''))'))
551 call assert_equal('True', pyeval('repr(''0'' in d)'))
552 call assert_equal('False', pyeval('repr(''1'' in d)'))
553 call assert_equal("['0']", pyeval('repr(list(iter(d)))'))
554 call assert_equal({'0' : -1}, d)
555 call assert_equal("('0', -1L)", pyeval('repr(d.popitem())'))
556 call assert_equal('None', pyeval('repr(d.get(''0''))'))
557 call assert_equal('[]', pyeval('repr(list(iter(d)))'))
558endfunc
559
560" Slice assignment to a list
561func Test_python_slice_assignment()
562 let l = [0, 1, 2, 3]
563 py l = vim.bindeval('l')
564 py l[0:0] = ['a']
565 call assert_equal(['a', 0, 1, 2, 3], l)
566
567 let l = [0, 1, 2, 3]
568 py l = vim.bindeval('l')
569 py l[1:2] = ['b']
570 call assert_equal([0, 'b', 2, 3], l)
571
572 let l = [0, 1, 2, 3]
573 py l = vim.bindeval('l')
574 py l[2:4] = ['c']
575 call assert_equal([0, 1, 'c'], l)
576
577 let l = [0, 1, 2, 3]
578 py l = vim.bindeval('l')
579 py l[4:4] = ['d']
580 call assert_equal([0, 1, 2, 3, 'd'], l)
581
582 let l = [0, 1, 2, 3]
583 py l = vim.bindeval('l')
584 py l[-1:2] = ['e']
585 call assert_equal([0, 1, 2, 'e', 3], l)
586
587 let l = [0, 1, 2, 3]
588 py l = vim.bindeval('l')
589 py l[-10:2] = ['f']
590 call assert_equal(['f', 2, 3], l)
591
592 let l = [0, 1, 2, 3]
593 py l = vim.bindeval('l')
594 py l[2:-10] = ['g']
595 call assert_equal([0, 1, 'g', 2, 3], l)
596
597 let l = []
598 py l = vim.bindeval('l')
599 py l[0:0] = ['h']
600 call assert_equal(['h'], l)
601
602 let l = range(8)
603 py l = vim.bindeval('l')
604 py l[2:6:2] = [10, 20]
605 call assert_equal([0, 1, 10, 3, 20, 5, 6, 7], l)
606
607 let l = range(8)
608 py l = vim.bindeval('l')
609 py l[6:2:-2] = [10, 20]
610 call assert_equal([0, 1, 2, 3, 20, 5, 10, 7], l)
611
612 let l = range(8)
613 py l = vim.bindeval('l')
614 py l[6:2] = ()
615 call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
616
617 let l = range(8)
618 py l = vim.bindeval('l')
619 py l[6:2:1] = ()
620 call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
621
622 let l = range(8)
623 py l = vim.bindeval('l')
624 py l[2:2:1] = ()
625 call assert_equal([0, 1, 2, 3, 4, 5, 6, 7], l)
Bram Moolenaar0ab55d62020-07-07 20:50:39 +0200626
627 call AssertException(["py x = l[10:11:0]"],
628 \ "Vim(python):ValueError: slice step cannot be zero")
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200629endfunc
630
631" Locked variables
632func Test_python_lockedvar()
633 new
634 py cb = vim.current.buffer
635 let l = [0, 1, 2, 3]
636 py l = vim.bindeval('l')
637 lockvar! l
638 py << trim EOF
639 try:
640 l[2]='i'
641 except vim.error:
642 cb.append('l[2] threw vim.error: ' + emsg(sys.exc_info()))
643 EOF
644 call assert_equal(['', "l[2] threw vim.error: error:('list is locked',)"],
645 \ getline(1, '$'))
Bram Moolenaarab589462020-07-06 21:03:06 +0200646
647 " Try to concatenate a locked list
648 call AssertException(['py l += [4, 5]'],
649 \ 'Vim(python):vim.error: list is locked')
650
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200651 call assert_equal([0, 1, 2, 3], l)
652 unlockvar! l
653 close!
654endfunc
655
656" Test for calling a function
657func Test_python_function_call()
658 func New(...)
Bram Moolenaareffb0cd2020-07-03 21:17:34 +0200659 return ['NewStart'] + a:000 + ['NewEnd']
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200660 endfunc
661
662 func DictNew(...) dict
Bram Moolenaareffb0cd2020-07-03 21:17:34 +0200663 return ['DictNewStart'] + a:000 + ['DictNewEnd', self]
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200664 endfunc
665
666 new
667 let l = [function('New'), function('DictNew')]
668 py l = vim.bindeval('l')
669 py l.extend(list(l[0](1, 2, 3)))
670 call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd'], l)
671 py l.extend(list(l[1](1, 2, 3, self={'a': 'b'})))
672 call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}], l)
673 py l.extend([l[0].name])
674 call assert_equal([function('New'), function('DictNew'), 'NewStart', 1, 2, 3, 'NewEnd', 'DictNewStart', 1, 2, 3, 'DictNewEnd', {'a': 'b'}, 'New'], l)
675 py ee('l[1](1, 2, 3)')
676 call assert_equal("l[1](1, 2, 3):error:('Vim:E725: Calling dict function without Dictionary: DictNew',)", getline(2))
677 %d
678 py f = l[0]
679 delfunction New
680 py ee('f(1, 2, 3)')
681 call assert_equal("f(1, 2, 3):error:('Vim:E117: Unknown function: New',)", getline(2))
682 close!
683 delfunction DictNew
684endfunc
685
686func Test_python_float()
687 CheckFeature float
688 let l = [0.0]
689 py l = vim.bindeval('l')
690 py l.extend([0.0])
691 call assert_equal([0.0, 0.0], l)
692endfunc
693
694" Test for Dict key errors
695func Test_python_dict_key_error()
696 let messages = []
697 py << trim EOF
698 d = vim.bindeval('{}')
699 m = vim.bindeval('messages')
700 def em(expr, g=globals(), l=locals()):
701 try:
702 exec(expr, g, l)
703 except:
704 m.extend([sys.exc_type.__name__])
705
706 em('d["abc1"]')
707 em('d["abc1"]="\\0"')
708 em('d["abc1"]=vim')
709 em('d[""]=1')
710 em('d["a\\0b"]=1')
711 em('d[u"a\\0b"]=1')
712 em('d.pop("abc1")')
713 em('d.popitem()')
714 del em
715 del m
716 EOF
717
718 call assert_equal(['KeyError', 'TypeError', 'TypeError', 'ValueError',
719 \ 'TypeError', 'TypeError', 'KeyError', 'KeyError'], messages)
720 unlet messages
721endfunc
722
723" Test for locked and scope attributes
724func Test_python_lock_scope_attr()
725 let d = {} | let dl = {} | lockvar dl
726 let res = []
727 for s in split("d dl v: g:")
728 let name = tr(s, ':', 's')
729 execute 'py ' .. name .. ' = vim.bindeval("' .. s .. '")'
730 call add(res, s .. ' : ' .. join(map(['locked', 'scope'],
731 \ 'v:val .. ":" .. pyeval(name .. "." .. v:val)'), ';'))
732 endfor
733 call assert_equal(['d : locked:0;scope:0', 'dl : locked:1;scope:0',
734 \ 'v: : locked:2;scope:1', 'g: : locked:0;scope:2'], res)
735
736 silent! let d.abc2 = 1
737 silent! let dl.abc3 = 1
738 py d.locked = True
739 py dl.locked = False
740 silent! let d.def = 1
741 silent! let dl.def = 1
742 call assert_equal({'abc2': 1}, d)
743 call assert_equal({'def': 1}, dl)
744 unlet d dl
745
746 let l = [] | let ll = [] | lockvar ll
747 let res = []
748 for s in split("l ll")
749 let name = tr(s, ':', 's')
750 execute 'py ' .. name .. '=vim.bindeval("' .. s .. '")'
751 call add(res, s .. ' : locked:' .. pyeval(name .. '.locked'))
752 endfor
753 call assert_equal(['l : locked:0', 'll : locked:1'], res)
754
755 silent! call extend(l, [0])
756 silent! call extend(ll, [0])
757 py l.locked = True
758 py ll.locked = False
759 silent! call extend(l, [1])
760 silent! call extend(ll, [1])
761 call assert_equal([0], l)
762 call assert_equal([1], ll)
763 unlet l ll
Bram Moolenaarab589462020-07-06 21:03:06 +0200764
765 " Try changing an attribute of a fixed list
766 py a = vim.bindeval('v:argv')
767 call AssertException(['py a.locked = 0'],
768 \ 'Vim(python):TypeError: cannot modify fixed list')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200769endfunc
770
771" Test for pyeval()
772func Test_python_pyeval()
773 let l = pyeval('range(3)')
774 call assert_equal([0, 1, 2], l)
775
776 let d = pyeval('{"a": "b", "c": 1, "d": ["e"]}')
777 call assert_equal([['a', 'b'], ['c', 1], ['d', ['e']]], sort(items(d)))
778
779 let v:errmsg = ''
780 call assert_equal(v:none, pyeval('None'))
781 call assert_equal('', v:errmsg)
782
Bram Moolenaarab589462020-07-06 21:03:06 +0200783 py v = vim.eval('test_null_function()')
784 call assert_equal(v:none, pyeval('v'))
785
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200786 if has('float')
787 call assert_equal(0.0, pyeval('0.0'))
788 endif
789
Bram Moolenaarab589462020-07-06 21:03:06 +0200790 " Evaluate an invalid values
791 call AssertException(['let v = pyeval(''"\0"'')'], 'E859:')
792 call AssertException(['let v = pyeval(''{"\0" : 1}'')'], 'E859:')
793 call AssertException(['let v = pyeval("undefined_name")'],
794 \ "Vim(let):NameError: name 'undefined_name' is not defined")
795 call AssertException(['let v = pyeval("vim")'], 'E859:')
796endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200797
Bram Moolenaarab589462020-07-06 21:03:06 +0200798" Test for vim.bindeval()
799func Test_python_vim_bindeval()
800 " Float
801 let f = 3.14
802 py f = vim.bindeval('f')
803 call assert_equal(3.14, pyeval('f'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200804
Bram Moolenaarab589462020-07-06 21:03:06 +0200805 " Blob
806 let b = 0z12
807 py b = vim.bindeval('b')
808 call assert_equal("\x12", pyeval('b'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200809
Bram Moolenaarab589462020-07-06 21:03:06 +0200810 " Bool
811 call assert_equal(1, pyeval("vim.bindeval('v:true')"))
812 call assert_equal(0, pyeval("vim.bindeval('v:false')"))
813 call assert_equal(v:none, pyeval("vim.bindeval('v:null')"))
814 call assert_equal(v:none, pyeval("vim.bindeval('v:none')"))
Bram Moolenaar0ab55d62020-07-07 20:50:39 +0200815
816 " channel/job
817 call assert_equal(v:none, pyeval("vim.bindeval('test_null_channel()')"))
818 call assert_equal(v:none, pyeval("vim.bindeval('test_null_job()')"))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200819endfunc
820
821" threading
822" Running pydo command (Test_pydo) before this test, stops the python thread
823" from running. So this test should be run before the pydo test
824func Test_aaa_python_threading()
825 let l = [0]
826 py l = vim.bindeval('l')
827 py << trim EOF
828 import threading
829 import time
830
831 class T(threading.Thread):
832 def __init__(self):
833 threading.Thread.__init__(self)
834 self.t = 0
835 self.running = True
836
837 def run(self):
838 while self.running:
839 self.t += 1
840 time.sleep(0.1)
841
842 t = T()
843 del T
844 t.start()
845 EOF
846
847 sleep 1
848 py t.running = False
849 py t.join()
850
851 " Check if the background thread is working. Count should be 10, but on a
852 " busy system (AppVeyor) it can be much lower.
853 py l[0] = t.t > 4
854 py del time
855 py del threading
856 py del t
857 call assert_equal([1], l)
858endfunc
859
860" settrace
861func Test_python_settrace()
862 let l = []
863 py l = vim.bindeval('l')
864 py << trim EOF
865 import sys
866
867 def traceit(frame, event, arg):
868 global l
869 if event == "line":
870 l.extend([frame.f_lineno])
871 return traceit
872
873 def trace_main():
874 for i in range(5):
875 pass
876 EOF
877 py sys.settrace(traceit)
878 py trace_main()
879 py sys.settrace(None)
880 py del traceit
881 py del trace_main
882 call assert_equal([1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1], l)
883endfunc
884
885" Slice
886func Test_python_list_slice()
887 py ll = vim.bindeval('[0, 1, 2, 3, 4, 5]')
888 py l = ll[:4]
889 call assert_equal([0, 1, 2, 3], pyeval('l'))
890 py l = ll[2:]
891 call assert_equal([2, 3, 4, 5], pyeval('l'))
892 py l = ll[:-4]
893 call assert_equal([0, 1], pyeval('l'))
894 py l = ll[-2:]
895 call assert_equal([4, 5], pyeval('l'))
896 py l = ll[2:4]
897 call assert_equal([2, 3], pyeval('l'))
898 py l = ll[4:2]
899 call assert_equal([], pyeval('l'))
900 py l = ll[-4:-2]
901 call assert_equal([2, 3], pyeval('l'))
902 py l = ll[-2:-4]
903 call assert_equal([], pyeval('l'))
904 py l = ll[:]
905 call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
906 py l = ll[0:6]
907 call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
908 py l = ll[-10:10]
909 call assert_equal([0, 1, 2, 3, 4, 5], pyeval('l'))
910 py l = ll[4:2:-1]
911 call assert_equal([4, 3], pyeval('l'))
912 py l = ll[::2]
913 call assert_equal([0, 2, 4], pyeval('l'))
914 py l = ll[4:2:1]
915 call assert_equal([], pyeval('l'))
Bram Moolenaarab589462020-07-06 21:03:06 +0200916
917 " Error case: Use an invalid index
918 call AssertException(['py ll[-10] = 5'], 'Vim(python):vim.error: internal error:')
919
920 " Use a step value of 0
921 call AssertException(['py ll[0:3:0] = [1, 2, 3]'],
922 \ 'Vim(python):ValueError: slice step cannot be zero')
923
924 " Error case: Invalid slice type
925 call AssertException(["py x = ll['abc']"],
926 \ 'Vim(python):TypeError: index must be int or slice, not str')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200927 py del l
Bram Moolenaarab589462020-07-06 21:03:06 +0200928
929 " Error case: List with a null list item
930 let l = [test_null_list()]
931 py ll = vim.bindeval('l')
932 call AssertException(["py x = ll[:]"],
933 \ 'Vim(python):SystemError: error return without exception set')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +0200934endfunc
935
936" Vars
937func Test_python_vars()
938 let g:foo = 'bac'
939 let w:abc3 = 'def'
940 let b:baz = 'bar'
941 let t:bar = 'jkl'
942 try
943 throw "Abc"
944 catch /Abc/
945 call assert_equal('Abc', pyeval('vim.vvars[''exception'']'))
946 endtry
947 call assert_equal('bac', pyeval('vim.vars[''foo'']'))
948 call assert_equal('def', pyeval('vim.current.window.vars[''abc3'']'))
949 call assert_equal('bar', pyeval('vim.current.buffer.vars[''baz'']'))
950 call assert_equal('jkl', pyeval('vim.current.tabpage.vars[''bar'']'))
951endfunc
952
953" Options
954" paste: boolean, global
955" previewheight number, global
956" operatorfunc: string, global
957" number: boolean, window-local
958" numberwidth: number, window-local
959" colorcolumn: string, window-local
960" statusline: string, window-local/global
961" autoindent: boolean, buffer-local
962" shiftwidth: number, buffer-local
963" omnifunc: string, buffer-local
964" preserveindent: boolean, buffer-local/global
965" path: string, buffer-local/global
966func Test_python_opts()
967 let g:res = []
968 let g:bufs = [bufnr('%')]
969 new
970 let g:bufs += [bufnr('%')]
971 vnew
972 let g:bufs += [bufnr('%')]
973 wincmd j
974 vnew
975 let g:bufs += [bufnr('%')]
976 wincmd l
977
978 func RecVars(opt)
979 let gval = string(eval('&g:' .. a:opt))
980 let wvals = join(map(range(1, 4),
981 \ 'v:val .. ":" .. string(getwinvar(v:val, "&" .. a:opt))'))
982 let bvals = join(map(copy(g:bufs),
983 \ 'v:val .. ":" .. string(getbufvar(v:val, "&" .. a:opt))'))
984 call add(g:res, ' G: ' .. gval)
985 call add(g:res, ' W: ' .. wvals)
986 call add(g:res, ' B: ' .. wvals)
987 endfunc
988
989 py << trim EOF
990 def e(s, g=globals(), l=locals()):
991 try:
992 exec(s, g, l)
993 except:
994 vim.command('return ' + repr(sys.exc_type.__name__))
995
996 def ev(s, g=globals(), l=locals()):
997 try:
998 return eval(s, g, l)
999 except:
1000 vim.command('let exc=' + repr(sys.exc_type.__name__))
1001 return 0
1002 EOF
1003
1004 func E(s)
1005 python e(vim.eval('a:s'))
1006 endfunc
1007
1008 func Ev(s)
1009 let r = pyeval('ev(vim.eval("a:s"))')
1010 if exists('exc')
1011 throw exc
1012 endif
1013 return r
1014 endfunc
1015
1016 py gopts1 = vim.options
1017 py wopts1 = vim.windows[2].options
1018 py wopts2 = vim.windows[0].options
1019 py wopts3 = vim.windows[1].options
1020 py bopts1 = vim.buffers[vim.bindeval("g:bufs")[2]].options
1021 py bopts2 = vim.buffers[vim.bindeval("g:bufs")[1]].options
1022 py bopts3 = vim.buffers[vim.bindeval("g:bufs")[0]].options
1023 call add(g:res, 'wopts iters equal: ' ..
1024 \ pyeval('list(wopts1) == list(wopts2)'))
1025 call add(g:res, 'bopts iters equal: ' ..
1026 \ pyeval('list(bopts1) == list(bopts2)'))
1027 py gset = set(iter(gopts1))
1028 py wset = set(iter(wopts1))
1029 py bset = set(iter(bopts1))
1030
1031 set path=.,..,,
1032 let lst = []
1033 let lst += [['paste', 1, 0, 1, 2, 1, 1, 0]]
1034 let lst += [['previewheight', 5, 1, 6, 'a', 0, 1, 0]]
1035 let lst += [['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0]]
1036 let lst += [['number', 0, 1, 1, 0, 1, 0, 1]]
1037 let lst += [['numberwidth', 2, 3, 5, -100, 0, 0, 1]]
1038 let lst += [['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1]]
1039 let lst += [['statusline', '1', '2', '4', 0, 0, 1, 1]]
1040 let lst += [['autoindent', 0, 1, 1, 2, 1, 0, 2]]
1041 let lst += [['shiftwidth', 0, 2, 1, 3, 0, 0, 2]]
1042 let lst += [['omnifunc', 'A', 'B', 'C', 1, 0, 0, 2]]
1043 let lst += [['preserveindent', 0, 1, 1, 2, 1, 1, 2]]
1044 let lst += [['path', '.,,', ',,', '.', 0, 0, 1, 2]]
1045 for [oname, oval1, oval2, oval3, invval, bool, global, local] in lst
1046 py oname = vim.eval('oname')
1047 py oval1 = vim.bindeval('oval1')
1048 py oval2 = vim.bindeval('oval2')
1049 py oval3 = vim.bindeval('oval3')
1050 if invval is 0 || invval is 1
1051 py invval = bool(vim.bindeval('invval'))
1052 else
1053 py invval = vim.bindeval('invval')
1054 endif
1055 if bool
1056 py oval1 = bool(oval1)
1057 py oval2 = bool(oval2)
1058 py oval3 = bool(oval3)
1059 endif
1060 call add(g:res, '>>> ' .. oname)
1061 call add(g:res, ' g/w/b:' .. pyeval('oname in gset') .. '/' ..
1062 \ pyeval('oname in wset') .. '/' .. pyeval('oname in bset'))
1063 call add(g:res, ' g/w/b (in):' .. pyeval('oname in gopts1') .. '/' ..
1064 \ pyeval('oname in wopts1') .. '/' .. pyeval('oname in bopts1'))
1065 for v in ['gopts1', 'wopts1', 'bopts1']
1066 try
1067 call add(g:res, ' p/' .. v .. ': ' .. Ev('repr(' .. v .. '[''' .. oname .. '''])'))
1068 catch
1069 call add(g:res, ' p/' .. v .. '! ' .. v:exception)
1070 endtry
1071 let r = E(v .. '[''' .. oname .. ''']=invval')
1072 if r isnot 0
1073 call add(g:res, ' inv: ' .. string(invval) .. '! ' .. r)
1074 endif
1075 for vv in (v is# 'gopts1' ? [v] : [v, v[:-2] .. '2', v[:-2] .. '3'])
1076 let val = substitute(vv, '^.opts', 'oval', '')
1077 let r = E(vv .. '[''' .. oname .. ''']=' .. val)
1078 if r isnot 0
1079 call add(g:res, ' ' .. vv .. '! ' .. r)
1080 endif
1081 endfor
1082 endfor
1083 call RecVars(oname)
1084 for v in ['wopts3', 'bopts3']
1085 let r = E('del ' .. v .. '["' .. oname .. '"]')
1086 if r isnot 0
1087 call add(g:res, ' del ' .. v .. '! ' .. r)
1088 endif
1089 endfor
1090 call RecVars(oname)
1091 endfor
1092 delfunction RecVars
1093 delfunction E
1094 delfunction Ev
1095 py del ev
1096 py del e
1097 only
1098 for buf in g:bufs[1:]
1099 execute 'bwipeout!' buf
1100 endfor
1101 py del gopts1
1102 py del wopts1
1103 py del wopts2
1104 py del wopts3
1105 py del bopts1
1106 py del bopts2
1107 py del bopts3
1108 py del oval1
1109 py del oval2
1110 py del oval3
1111 py del oname
1112 py del invval
1113
1114 let expected =<< trim END
1115 wopts iters equal: 1
1116 bopts iters equal: 1
1117 >>> paste
1118 g/w/b:1/0/0
1119 g/w/b (in):1/0/0
1120 p/gopts1: False
1121 p/wopts1! KeyError
1122 inv: 2! KeyError
1123 wopts1! KeyError
1124 wopts2! KeyError
1125 wopts3! KeyError
1126 p/bopts1! KeyError
1127 inv: 2! KeyError
1128 bopts1! KeyError
1129 bopts2! KeyError
1130 bopts3! KeyError
1131 G: 1
1132 W: 1:1 2:1 3:1 4:1
1133 B: 1:1 2:1 3:1 4:1
1134 del wopts3! KeyError
1135 del bopts3! KeyError
1136 G: 1
1137 W: 1:1 2:1 3:1 4:1
1138 B: 1:1 2:1 3:1 4:1
1139 >>> previewheight
1140 g/w/b:1/0/0
1141 g/w/b (in):1/0/0
1142 p/gopts1: 12
1143 inv: 'a'! TypeError
1144 p/wopts1! KeyError
1145 inv: 'a'! KeyError
1146 wopts1! KeyError
1147 wopts2! KeyError
1148 wopts3! KeyError
1149 p/bopts1! KeyError
1150 inv: 'a'! KeyError
1151 bopts1! KeyError
1152 bopts2! KeyError
1153 bopts3! KeyError
1154 G: 5
1155 W: 1:5 2:5 3:5 4:5
1156 B: 1:5 2:5 3:5 4:5
1157 del wopts3! KeyError
1158 del bopts3! KeyError
1159 G: 5
1160 W: 1:5 2:5 3:5 4:5
1161 B: 1:5 2:5 3:5 4:5
1162 >>> operatorfunc
1163 g/w/b:1/0/0
1164 g/w/b (in):1/0/0
1165 p/gopts1: ''
1166 inv: 2! TypeError
1167 p/wopts1! KeyError
1168 inv: 2! KeyError
1169 wopts1! KeyError
1170 wopts2! KeyError
1171 wopts3! KeyError
1172 p/bopts1! KeyError
1173 inv: 2! KeyError
1174 bopts1! KeyError
1175 bopts2! KeyError
1176 bopts3! KeyError
1177 G: 'A'
1178 W: 1:'A' 2:'A' 3:'A' 4:'A'
1179 B: 1:'A' 2:'A' 3:'A' 4:'A'
1180 del wopts3! KeyError
1181 del bopts3! KeyError
1182 G: 'A'
1183 W: 1:'A' 2:'A' 3:'A' 4:'A'
1184 B: 1:'A' 2:'A' 3:'A' 4:'A'
1185 >>> number
1186 g/w/b:0/1/0
1187 g/w/b (in):0/1/0
1188 p/gopts1! KeyError
1189 inv: 0! KeyError
1190 gopts1! KeyError
1191 p/wopts1: False
1192 p/bopts1! KeyError
1193 inv: 0! KeyError
1194 bopts1! KeyError
1195 bopts2! KeyError
1196 bopts3! KeyError
1197 G: 0
1198 W: 1:1 2:1 3:0 4:0
1199 B: 1:1 2:1 3:0 4:0
1200 del wopts3! ValueError
1201 del bopts3! KeyError
1202 G: 0
1203 W: 1:1 2:1 3:0 4:0
1204 B: 1:1 2:1 3:0 4:0
1205 >>> numberwidth
1206 g/w/b:0/1/0
1207 g/w/b (in):0/1/0
1208 p/gopts1! KeyError
1209 inv: -100! KeyError
1210 gopts1! KeyError
1211 p/wopts1: 4
1212 inv: -100! error
1213 p/bopts1! KeyError
1214 inv: -100! KeyError
1215 bopts1! KeyError
1216 bopts2! KeyError
1217 bopts3! KeyError
1218 G: 4
1219 W: 1:3 2:5 3:2 4:4
1220 B: 1:3 2:5 3:2 4:4
1221 del wopts3! ValueError
1222 del bopts3! KeyError
1223 G: 4
1224 W: 1:3 2:5 3:2 4:4
1225 B: 1:3 2:5 3:2 4:4
1226 >>> colorcolumn
1227 g/w/b:0/1/0
1228 g/w/b (in):0/1/0
1229 p/gopts1! KeyError
1230 inv: 'abc4'! KeyError
1231 gopts1! KeyError
1232 p/wopts1: ''
1233 inv: 'abc4'! error
1234 p/bopts1! KeyError
1235 inv: 'abc4'! KeyError
1236 bopts1! KeyError
1237 bopts2! KeyError
1238 bopts3! KeyError
1239 G: ''
1240 W: 1:'+2' 2:'+3' 3:'+1' 4:''
1241 B: 1:'+2' 2:'+3' 3:'+1' 4:''
1242 del wopts3! ValueError
1243 del bopts3! KeyError
1244 G: ''
1245 W: 1:'+2' 2:'+3' 3:'+1' 4:''
1246 B: 1:'+2' 2:'+3' 3:'+1' 4:''
1247 >>> statusline
1248 g/w/b:1/1/0
1249 g/w/b (in):1/1/0
1250 p/gopts1: ''
1251 inv: 0! TypeError
1252 p/wopts1: None
1253 inv: 0! TypeError
1254 p/bopts1! KeyError
1255 inv: 0! KeyError
1256 bopts1! KeyError
1257 bopts2! KeyError
1258 bopts3! KeyError
1259 G: '1'
1260 W: 1:'2' 2:'4' 3:'1' 4:'1'
1261 B: 1:'2' 2:'4' 3:'1' 4:'1'
1262 del bopts3! KeyError
1263 G: '1'
1264 W: 1:'2' 2:'1' 3:'1' 4:'1'
1265 B: 1:'2' 2:'1' 3:'1' 4:'1'
1266 >>> autoindent
1267 g/w/b:0/0/1
1268 g/w/b (in):0/0/1
1269 p/gopts1! KeyError
1270 inv: 2! KeyError
1271 gopts1! KeyError
1272 p/wopts1! KeyError
1273 inv: 2! KeyError
1274 wopts1! KeyError
1275 wopts2! KeyError
1276 wopts3! KeyError
1277 p/bopts1: False
1278 G: 0
1279 W: 1:0 2:1 3:0 4:1
1280 B: 1:0 2:1 3:0 4:1
1281 del wopts3! KeyError
1282 del bopts3! ValueError
1283 G: 0
1284 W: 1:0 2:1 3:0 4:1
1285 B: 1:0 2:1 3:0 4:1
1286 >>> shiftwidth
1287 g/w/b:0/0/1
1288 g/w/b (in):0/0/1
1289 p/gopts1! KeyError
1290 inv: 3! KeyError
1291 gopts1! KeyError
1292 p/wopts1! KeyError
1293 inv: 3! KeyError
1294 wopts1! KeyError
1295 wopts2! KeyError
1296 wopts3! KeyError
1297 p/bopts1: 8
1298 G: 8
1299 W: 1:0 2:2 3:8 4:1
1300 B: 1:0 2:2 3:8 4:1
1301 del wopts3! KeyError
1302 del bopts3! ValueError
1303 G: 8
1304 W: 1:0 2:2 3:8 4:1
1305 B: 1:0 2:2 3:8 4:1
1306 >>> omnifunc
1307 g/w/b:0/0/1
1308 g/w/b (in):0/0/1
1309 p/gopts1! KeyError
1310 inv: 1! KeyError
1311 gopts1! KeyError
1312 p/wopts1! KeyError
1313 inv: 1! KeyError
1314 wopts1! KeyError
1315 wopts2! KeyError
1316 wopts3! KeyError
1317 p/bopts1: ''
1318 inv: 1! TypeError
1319 G: ''
1320 W: 1:'A' 2:'B' 3:'' 4:'C'
1321 B: 1:'A' 2:'B' 3:'' 4:'C'
1322 del wopts3! KeyError
1323 del bopts3! ValueError
1324 G: ''
1325 W: 1:'A' 2:'B' 3:'' 4:'C'
1326 B: 1:'A' 2:'B' 3:'' 4:'C'
1327 >>> preserveindent
1328 g/w/b:0/0/1
1329 g/w/b (in):0/0/1
1330 p/gopts1! KeyError
1331 inv: 2! KeyError
1332 gopts1! KeyError
1333 p/wopts1! KeyError
1334 inv: 2! KeyError
1335 wopts1! KeyError
1336 wopts2! KeyError
1337 wopts3! KeyError
1338 p/bopts1: False
1339 G: 0
1340 W: 1:0 2:1 3:0 4:1
1341 B: 1:0 2:1 3:0 4:1
1342 del wopts3! KeyError
1343 del bopts3! ValueError
1344 G: 0
1345 W: 1:0 2:1 3:0 4:1
1346 B: 1:0 2:1 3:0 4:1
1347 >>> path
1348 g/w/b:1/0/1
1349 g/w/b (in):1/0/1
1350 p/gopts1: '.,..,,'
1351 inv: 0! TypeError
1352 p/wopts1! KeyError
1353 inv: 0! KeyError
1354 wopts1! KeyError
1355 wopts2! KeyError
1356 wopts3! KeyError
1357 p/bopts1: None
1358 inv: 0! TypeError
1359 G: '.,,'
1360 W: 1:'.,,' 2:',,' 3:'.,,' 4:'.'
1361 B: 1:'.,,' 2:',,' 3:'.,,' 4:'.'
1362 del wopts3! KeyError
1363 G: '.,,'
1364 W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,'
1365 B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,'
1366 END
1367
1368 call assert_equal(expected, g:res)
1369 unlet g:res
Bram Moolenaarab589462020-07-06 21:03:06 +02001370
1371 call assert_equal(0, pyeval("'' in vim.options"))
1372
1373 " use an empty key to index vim.options
1374 call AssertException(["let v = pyeval(\"vim.options['']\")"],
1375 \ 'Vim(let):ValueError: empty keys are not allowed')
1376 call AssertException(["py vim.current.window.options[''] = 0"],
1377 \ 'Vim(python):ValueError: empty keys are not allowed')
1378 call AssertException(["py vim.current.window.options[{}] = 0"],
1379 \ 'Vim(python):TypeError: expected str() or unicode() instance, but got dict')
1380
1381 " set one of the number options to a very large number
1382 let cmd = ["py vim.options['previewheight'] = 9999999999999999"]
1383 call AssertException(cmd, 'OverflowError:')
1384
1385 " unset a global-local string option
1386 call AssertException(["py del vim.options['errorformat']"],
1387 \ 'Vim(python):ValueError: unable to unset global option errorformat')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001388endfunc
1389
1390" Test for vim.buffer object
1391func Test_python_buffer()
1392 new
1393 call setline(1, "Hello\nWorld")
1394 call assert_fails("let x = pyeval('vim.current.buffer[0]')", 'E859:')
1395 %bw!
1396
1397 edit Xfile1
1398 let bnr1 = bufnr()
1399 py cb = vim.current.buffer
1400 vnew Xfile2
1401 let bnr2 = bufnr()
1402 call setline(1, ['First line', 'Second line', 'Third line'])
1403 py b = vim.current.buffer
1404 wincmd w
1405
Bram Moolenaarab589462020-07-06 21:03:06 +02001406 " Test for getting lines from the buffer using a slice
1407 call assert_equal(['First line'], pyeval('b[-10:1]'))
1408 call assert_equal(['Third line'], pyeval('b[2:10]'))
1409 call assert_equal([], pyeval('b[2:0]'))
1410 call assert_equal([], pyeval('b[10:12]'))
1411 call assert_equal([], pyeval('b[-10:-8]'))
Bram Moolenaar0ab55d62020-07-07 20:50:39 +02001412 call AssertException(["py x = b[0:3:0]"],
1413 \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1414 call AssertException(["py b[0:3:0] = 'abc'"],
1415 \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1416 call AssertException(["py x = b[{}]"],
1417 \ "Vim(python):TypeError: sequence index must be integer, not 'dict'")
1418 call AssertException(["py b[{}] = 'abc'"],
1419 \ "Vim(python):TypeError: sequence index must be integer, not 'dict'")
1420
1421 " Test for getting lines using a range
1422 call AssertException(["py x = b.range(0,3)[0:2:0]"],
1423 \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
1424 call AssertException(["py b.range(0,3)[0:2:0] = 'abc'"],
1425 \ "Vim(python):TypeError: sequence index must be integer, not 'slice'")
Bram Moolenaarab589462020-07-06 21:03:06 +02001426
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001427 " Tests BufferAppend and BufferItem
1428 py cb.append(b[0])
1429 call assert_equal(['First line'], getbufline(bnr1, 2))
1430 %d
1431
Bram Moolenaarab589462020-07-06 21:03:06 +02001432 " Try to append using out-of-range line number
1433 call AssertException(["py b.append('abc', 10)"],
1434 \ 'Vim(python):IndexError: line number out of range')
1435
1436 " Append a non-string item
1437 call AssertException(["py b.append([22])"],
1438 \ 'Vim(python):TypeError: expected str() or unicode() instance, but got int')
1439
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001440 " Tests BufferSlice and BufferAssSlice
1441 py cb.append('abc5') # Will be overwritten
1442 py cb[-1:] = b[:-2]
1443 call assert_equal(['First line'], getbufline(bnr1, 2))
1444 %d
1445
1446 " Test BufferLength and BufferAssSlice
1447 py cb.append('def') # Will not be overwritten
1448 py cb[len(cb):] = b[:]
1449 call assert_equal(['def', 'First line', 'Second line', 'Third line'],
1450 \ getbufline(bnr1, 2, '$'))
1451 %d
1452
1453 " Test BufferAssItem and BufferMark
1454 call setbufline(bnr1, 1, ['one', 'two', 'three'])
1455 call cursor(1, 3)
1456 normal ma
1457 py cb.append('ghi') # Will be overwritten
1458 py cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
1459 call assert_equal(['(3, 2)'], getbufline(bnr1, 4))
1460 %d
1461
1462 " Test BufferRepr
1463 py cb.append(repr(cb) + repr(b))
1464 call assert_equal(['<buffer Xfile1><buffer Xfile2>'], getbufline(bnr1, 2))
1465 %d
1466
1467 " Modify foreign buffer
1468 py << trim EOF
1469 b.append('foo')
1470 b[0]='bar'
1471 b[0:0]=['baz']
1472 vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
1473 EOF
1474 call assert_equal(['baz', 'bar', 'Second line', 'Third line', 'foo'],
1475 \ getbufline(bnr2, 1, '$'))
1476 %d
1477
1478 " Test assigning to name property
1479 augroup BUFS
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02001480 autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
1481 autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001482 augroup END
1483 py << trim EOF
1484 import os
1485 old_name = cb.name
1486 cb.name = 'foo'
1487 cb.append(cb.name[-11:].replace(os.path.sep, '/'))
1488 b.name = 'bar'
1489 cb.append(b.name[-11:].replace(os.path.sep, '/'))
1490 cb.name = old_name
1491 cb.append(cb.name[-14:].replace(os.path.sep, '/'))
1492 del old_name
1493 EOF
1494 call assert_equal([bnr1 .. ':BufFilePre:' .. bnr1,
1495 \ bnr1 .. ':BufFilePost:' .. bnr1,
1496 \ 'testdir/foo',
1497 \ bnr2 .. ':BufFilePre:' .. bnr2,
1498 \ bnr2 .. ':BufFilePost:' .. bnr2,
1499 \ 'testdir/bar',
1500 \ bnr1 .. ':BufFilePre:' .. bnr1,
1501 \ bnr1 .. ':BufFilePost:' .. bnr1,
1502 \ 'testdir/Xfile1'], getbufline(bnr1, 2, '$'))
1503 %d
1504
1505 " Test CheckBuffer
1506 py << trim EOF
1507 for _b in vim.buffers:
1508 if _b is not cb:
1509 vim.command('bwipeout! ' + str(_b.number))
1510 del _b
1511 cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
1512 EOF
1513 call assert_equal('valid: b:False, cb:True', getline(2))
1514 %d
1515
1516 py << trim EOF
1517 for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")', 'b.name = "!"'):
1518 try:
1519 exec(expr)
1520 except vim.error:
1521 pass
1522 else:
1523 # Usually a SEGV here
1524 # Should not happen in any case
1525 cb.append('No exception for ' + expr)
1526 vim.command('cd .')
1527 del b
1528 EOF
1529 call assert_equal([''], getline(1, '$'))
1530
Bram Moolenaarab589462020-07-06 21:03:06 +02001531 " Delete all the lines in a buffer
1532 call setline(1, ['a', 'b', 'c'])
1533 py vim.current.buffer[:] = []
1534 call assert_equal([''], getline(1, '$'))
1535
Bram Moolenaar0ab55d62020-07-07 20:50:39 +02001536 " Test for buffer marks
1537 call assert_equal(v:none, pyeval("vim.current.buffer.mark('r')"))
1538
Bram Moolenaarab589462020-07-06 21:03:06 +02001539 " Test for modifying a 'nomodifiable' buffer
1540 setlocal nomodifiable
1541 call AssertException(["py vim.current.buffer[0] = 'abc'"],
1542 \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1543 call AssertException(["py vim.current.buffer[0] = None"],
1544 \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1545 call AssertException(["py vim.current.buffer[:] = None"],
1546 \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1547 call AssertException(["py vim.current.buffer[:] = []"],
1548 \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1549 call AssertException(["py vim.current.buffer.append('abc')"],
1550 \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1551 call AssertException(["py vim.current.buffer.append([])"],
1552 \ "Vim(python):vim.error: Vim:E21: Cannot make changes, 'modifiable' is off")
1553 setlocal modifiable
1554
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001555 augroup BUFS
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02001556 autocmd!
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001557 augroup END
1558 augroup! BUFS
1559 %bw!
Bram Moolenaarab589462020-07-06 21:03:06 +02001560
1561 " Range object for a deleted buffer
1562 new Xfile
1563 call setline(1, ['one', 'two', 'three'])
1564 py b = vim.current.buffer
1565 py r = vim.current.buffer.range(0, 2)
1566 call assert_equal('<range Xfile (0:2)>', pyeval('repr(r)'))
1567 %bw!
1568 call AssertException(['py r[:] = []'],
1569 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1570 call assert_match('<buffer object (deleted)', pyeval('repr(b)'))
1571 call assert_match('<range object (for deleted buffer)', pyeval('repr(r)'))
1572 call AssertException(["let n = pyeval('len(r)')"],
1573 \ 'Vim(let):vim.error: attempt to refer to deleted buffer')
1574 call AssertException(["py r.append('abc')"],
1575 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1576
1577 " object for a deleted buffer
1578 call AssertException(["py b[0] = 'one'"],
1579 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1580 call AssertException(["py b.append('one')"],
1581 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1582 call AssertException(["let n = pyeval('len(b)')"],
1583 \ 'Vim(let):vim.error: attempt to refer to deleted buffer')
1584 call AssertException(["py pos = b.mark('a')"],
1585 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1586 call AssertException(["py vim.current.buffer = b"],
1587 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
1588 call AssertException(["py rn = b.range(0, 2)"],
1589 \ 'Vim(python):vim.error: attempt to refer to deleted buffer')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001590endfunc
1591
1592" Test vim.buffers object
1593func Test_python_buffers()
1594 %bw!
1595 edit Xfile
1596 py cb = vim.current.buffer
1597 set hidden
1598 edit a
1599 buffer #
1600 edit b
1601 buffer #
1602 edit c
1603 buffer #
1604 py << trim EOF
1605 try:
1606 from __builtin__ import next
1607 except ImportError:
1608 next = lambda o: o.next()
1609 # Check GCing iterator that was not fully exhausted
1610 i = iter(vim.buffers)
1611 cb.append('i:' + str(next(i)))
1612 # and also check creating more than one iterator at a time
1613 i2 = iter(vim.buffers)
1614 cb.append('i2:' + str(next(i2)))
1615 cb.append('i:' + str(next(i)))
1616 # The following should trigger GC and not cause any problems
1617 del i
1618 del i2
1619 i3 = iter(vim.buffers)
1620 cb.append('i3:' + str(next(i3)))
1621 del i3
1622 EOF
1623 call assert_equal(['i:<buffer Xfile>',
1624 \ 'i2:<buffer Xfile>', 'i:<buffer a>', 'i3:<buffer Xfile>'],
1625 \ getline(2, '$'))
1626 %d
1627
1628 py << trim EOF
1629 prevnum = 0
1630 for b in vim.buffers:
1631 # Check buffer order
1632 if prevnum >= b.number:
1633 cb.append('!!! Buffer numbers not in strictly ascending order')
1634 # Check indexing: vim.buffers[number].number == number
1635 cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + \
1636 '=' + repr(b))
1637 prevnum = b.number
1638 del prevnum
1639
1640 cb.append(str(len(vim.buffers)))
1641 EOF
1642 call assert_equal([bufnr('Xfile') .. ':<buffer Xfile>=<buffer Xfile>',
1643 \ bufnr('a') .. ':<buffer a>=<buffer a>',
1644 \ bufnr('b') .. ':<buffer b>=<buffer b>',
1645 \ bufnr('c') .. ':<buffer c>=<buffer c>', '4'], getline(2, '$'))
1646 %d
1647
1648 py << trim EOF
1649 bnums = list(map(lambda b: b.number, vim.buffers))[1:]
1650
1651 # Test wiping out buffer with existing iterator
1652 i4 = iter(vim.buffers)
1653 cb.append('i4:' + str(next(i4)))
1654 vim.command('bwipeout! ' + str(bnums.pop(0)))
1655 try:
1656 next(i4)
1657 except vim.error:
1658 pass
1659 else:
1660 cb.append('!!!! No vim.error')
1661 i4 = iter(vim.buffers)
1662 vim.command('bwipeout! ' + str(bnums.pop(-1)))
1663 vim.command('bwipeout! ' + str(bnums.pop(-1)))
1664 cb.append('i4:' + str(next(i4)))
1665 try:
1666 next(i4)
1667 except StopIteration:
1668 cb.append('StopIteration')
1669 del i4
1670 del bnums
1671 EOF
1672 call assert_equal(['i4:<buffer Xfile>',
1673 \ 'i4:<buffer Xfile>', 'StopIteration'], getline(2, '$'))
1674 %bw!
1675endfunc
1676
1677" Test vim.{tabpage,window}list and vim.{tabpage,window} objects
1678func Test_python_tabpage_window()
1679 %bw
1680 edit Xfile
1681 py cb = vim.current.buffer
1682 tabnew 0
1683 tabnew 1
1684 vnew a.1
1685 tabnew 2
1686 vnew a.2
1687 vnew b.2
1688 vnew c.2
1689
Bram Moolenaarab589462020-07-06 21:03:06 +02001690 call assert_equal(4, pyeval('vim.current.window.tabpage.number'))
1691
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001692 py << trim EOF
1693 cb.append('Number of tabs: ' + str(len(vim.tabpages)))
1694 cb.append('Current tab pages:')
1695 def W(w):
1696 if repr(w).find('(unknown)') != -1:
1697 return '<window object (unknown)>'
1698 else:
1699 return repr(w)
1700
1701 start = len(cb)
1702
1703 def Cursor(w):
1704 if w.buffer is cb:
1705 return repr((start - w.cursor[0], w.cursor[1]))
1706 else:
1707 return repr(w.cursor)
1708
1709 for t in vim.tabpages:
1710 cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + \
1711 str(len(t.windows)) + ' windows, current is ' + W(t.window))
1712 cb.append(' Windows:')
1713 for w in t.windows:
1714 cb.append(' ' + W(w) + '(' + str(w.number) + ')' + \
1715 ': displays buffer ' + repr(w.buffer) + \
1716 '; cursor is at ' + Cursor(w))
1717 # Other values depend on the size of the terminal, so they are checked
1718 # partly:
1719 for attr in ('height', 'row', 'width', 'col'):
1720 try:
1721 aval = getattr(w, attr)
1722 if type(aval) is not long:
1723 raise TypeError
1724 if aval < 0:
1725 raise ValueError
1726 except Exception:
1727 cb.append('!!!!!! Error while getting attribute ' + attr + \
1728 ': ' + sys.exc_type.__name__)
1729 del aval
1730 del attr
1731 w.cursor = (len(w.buffer), 0)
1732 del W
1733 del Cursor
1734 cb.append('Number of windows in current tab page: ' + \
1735 str(len(vim.windows)))
1736 if list(vim.windows) != list(vim.current.tabpage.windows):
1737 cb.append('!!!!!! Windows differ')
1738 EOF
1739
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02001740 let expected =<< trim END
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001741 Number of tabs: 4
1742 Current tab pages:
1743 <tabpage 0>(1): 1 windows, current is <window object (unknown)>
1744 Windows:
1745 <window object (unknown)>(1): displays buffer <buffer Xfile>; cursor is at (2, 0)
1746 <tabpage 1>(2): 1 windows, current is <window object (unknown)>
1747 Windows:
1748 <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
1749 <tabpage 2>(3): 2 windows, current is <window object (unknown)>
1750 Windows:
1751 <window object (unknown)>(1): displays buffer <buffer a.1>; cursor is at (1, 0)
1752 <window object (unknown)>(2): displays buffer <buffer 1>; cursor is at (1, 0)
1753 <tabpage 3>(4): 4 windows, current is <window 0>
1754 Windows:
1755 <window 0>(1): displays buffer <buffer c.2>; cursor is at (1, 0)
1756 <window 1>(2): displays buffer <buffer b.2>; cursor is at (1, 0)
1757 <window 2>(3): displays buffer <buffer a.2>; cursor is at (1, 0)
1758 <window 3>(4): displays buffer <buffer 2>; cursor is at (1, 0)
1759 Number of windows in current tab page: 4
1760 END
1761 call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1762 %bw!
1763endfunc
1764
1765" Test vim.current
1766func Test_python_vim_current()
1767 %bw
1768 edit Xfile
1769 py cb = vim.current.buffer
1770 tabnew 0
1771 tabnew 1
1772 vnew a.1
1773 tabnew 2
1774 vnew a.2
1775 vnew b.2
1776 vnew c.2
1777
1778 py << trim EOF
1779 def H(o):
1780 return repr(o)
1781 cb.append('Current tab page: ' + repr(vim.current.tabpage))
1782 cb.append('Current window: ' + repr(vim.current.window) + ': ' + \
1783 H(vim.current.window) + ' is ' + H(vim.current.tabpage.window))
1784 cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + \
1785 H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ \
1786 ' is ' + H(vim.current.tabpage.window.buffer))
1787 del H
1788 EOF
1789 let expected =<< trim END
1790 Current tab page: <tabpage 3>
1791 Current window: <window 0>: <window 0> is <window 0>
1792 Current buffer: <buffer c.2>: <buffer c.2> is <buffer c.2> is <buffer c.2>
1793 END
1794 call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1795 call deletebufline(bufnr('Xfile'), 1, '$')
1796
1797 " Assigning: fails
1798 py << trim EOF
1799 try:
1800 vim.current.window = vim.tabpages[0].window
1801 except ValueError:
1802 cb.append('ValueError at assigning foreign tab window')
1803
1804 for attr in ('window', 'tabpage', 'buffer'):
1805 try:
1806 setattr(vim.current, attr, None)
1807 except TypeError:
1808 cb.append('Type error at assigning None to vim.current.' + attr)
1809 del attr
1810 EOF
1811
1812 let expected =<< trim END
1813 ValueError at assigning foreign tab window
1814 Type error at assigning None to vim.current.window
1815 Type error at assigning None to vim.current.tabpage
1816 Type error at assigning None to vim.current.buffer
1817 END
1818 call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1819 call deletebufline(bufnr('Xfile'), 1, '$')
1820
1821 call setbufline(bufnr('Xfile'), 1, 'python interface')
1822 py << trim EOF
1823 # Assigning: success
1824 vim.current.tabpage = vim.tabpages[-2]
1825 vim.current.buffer = cb
1826 vim.current.window = vim.windows[0]
1827 vim.current.window.cursor = (len(vim.current.buffer), 0)
1828 cb.append('Current tab page: ' + repr(vim.current.tabpage))
1829 cb.append('Current window: ' + repr(vim.current.window))
1830 cb.append('Current buffer: ' + repr(vim.current.buffer))
1831 cb.append('Current line: ' + repr(vim.current.line))
1832 EOF
1833
1834 let expected =<< trim END
1835 Current tab page: <tabpage 2>
1836 Current window: <window 0>
1837 Current buffer: <buffer Xfile>
1838 Current line: 'python interface'
1839 END
1840 call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
Bram Moolenaarab589462020-07-06 21:03:06 +02001841 py vim.current.line = 'one line'
1842 call assert_equal('one line', getline('.'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001843 call deletebufline(bufnr('Xfile'), 1, '$')
1844
1845 py << trim EOF
1846 ws = list(vim.windows)
1847 ts = list(vim.tabpages)
1848 for b in vim.buffers:
1849 if b is not cb:
1850 vim.command('bwipeout! ' + str(b.number))
1851 del b
1852 cb.append('w.valid: ' + repr([w.valid for w in ws]))
1853 cb.append('t.valid: ' + repr([t.valid for t in ts]))
1854 del w
1855 del t
1856 del ts
1857 del ws
1858 EOF
1859 let expected =<< trim END
1860 w.valid: [True, False]
1861 t.valid: [True, False, True, False]
1862 END
1863 call assert_equal(expected, getbufline(bufnr('Xfile'), 2, '$'))
1864 %bw!
1865endfunc
1866
1867" Test types
1868func Test_python_types()
1869 %d
1870 py cb = vim.current.buffer
1871 py << trim EOF
1872 for expr, attr in (
1873 ('vim.vars', 'Dictionary'),
1874 ('vim.options', 'Options'),
1875 ('vim.bindeval("{}")', 'Dictionary'),
1876 ('vim.bindeval("[]")', 'List'),
1877 ('vim.bindeval("function(\'tr\')")', 'Function'),
1878 ('vim.current.buffer', 'Buffer'),
1879 ('vim.current.range', 'Range'),
1880 ('vim.current.window', 'Window'),
1881 ('vim.current.tabpage', 'TabPage'),
1882 ):
1883 cb.append(expr + ':' + attr + ':' + \
1884 repr(type(eval(expr)) is getattr(vim, attr)))
1885 del expr
1886 del attr
1887 EOF
1888 let expected =<< trim END
1889 vim.vars:Dictionary:True
1890 vim.options:Options:True
1891 vim.bindeval("{}"):Dictionary:True
1892 vim.bindeval("[]"):List:True
1893 vim.bindeval("function('tr')"):Function:True
1894 vim.current.buffer:Buffer:True
1895 vim.current.range:Range:True
1896 vim.current.window:Window:True
1897 vim.current.tabpage:TabPage:True
1898 END
1899 call assert_equal(expected, getline(2, '$'))
1900endfunc
1901
1902" Test __dir__() method
1903func Test_python_dir_method()
1904 %d
1905 py cb = vim.current.buffer
1906 py << trim EOF
1907 for name, o in (
1908 ('current', vim.current),
1909 ('buffer', vim.current.buffer),
1910 ('window', vim.current.window),
1911 ('tabpage', vim.current.tabpage),
1912 ('range', vim.current.range),
1913 ('dictionary', vim.bindeval('{}')),
1914 ('list', vim.bindeval('[]')),
1915 ('function', vim.bindeval('function("tr")')),
1916 ('output', sys.stdout),
1917 ):
1918 cb.append(name + ':' + ','.join(dir(o)))
1919 del name
1920 del o
1921 EOF
1922 let expected =<< trim END
1923 current:__dir__,__members__,buffer,line,range,tabpage,window
1924 buffer:__dir__,__members__,append,mark,name,number,options,range,valid,vars
1925 window:__dir__,__members__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width
1926 tabpage:__dir__,__members__,number,valid,vars,window,windows
1927 range:__dir__,__members__,append,end,start
1928 dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
1929 list:__dir__,__members__,extend,locked
1930 function:__dir__,__members__,args,auto_rebind,self,softspace
1931 output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
1932 END
1933 call assert_equal(expected, getline(2, '$'))
1934endfunc
1935
1936" Test vim.*.__new__
1937func Test_python_new()
1938 call assert_equal({}, pyeval('vim.Dictionary({})'))
1939 call assert_equal({'a': 1}, pyeval('vim.Dictionary(a=1)'))
1940 call assert_equal({'a': 1}, pyeval('vim.Dictionary(((''a'', 1),))'))
1941 call assert_equal([], pyeval('vim.List()'))
1942 call assert_equal(['a', 'b', 'c', '7'], pyeval('vim.List(iter(''abc7''))'))
1943 call assert_equal(function('tr'), pyeval('vim.Function(''tr'')'))
1944 call assert_equal(function('tr', [123, 3, 4]),
1945 \ pyeval('vim.Function(''tr'', args=[123, 3, 4])'))
1946 call assert_equal(function('tr'), pyeval('vim.Function(''tr'', args=[])'))
1947 call assert_equal(function('tr', {}),
1948 \ pyeval('vim.Function(''tr'', self={})'))
1949 call assert_equal(function('tr', [123, 3, 4], {}),
1950 \ pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})'))
1951 call assert_equal(function('tr'),
1952 \ pyeval('vim.Function(''tr'', auto_rebind=False)'))
1953 call assert_equal(function('tr', [123, 3, 4]),
1954 \ pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)'))
1955 call assert_equal(function('tr'),
1956 \ pyeval('vim.Function(''tr'', args=[], auto_rebind=False)'))
1957 call assert_equal(function('tr', {}),
1958 \ pyeval('vim.Function(''tr'', self={}, auto_rebind=False)'))
1959 call assert_equal(function('tr', [123, 3, 4], {}),
1960 \ pyeval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)'))
1961endfunc
1962
1963" Test vim.Function
1964func Test_python_vim_func()
Bram Moolenaarab589462020-07-06 21:03:06 +02001965 func Args(...)
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001966 return a:000
Bram Moolenaarab589462020-07-06 21:03:06 +02001967 endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001968
Bram Moolenaarab589462020-07-06 21:03:06 +02001969 func SelfArgs(...) dict
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001970 return [a:000, self]
Bram Moolenaarab589462020-07-06 21:03:06 +02001971 endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001972
1973 " The following four lines should not crash
1974 let Pt = function('tr', [[]], {'l': []})
1975 py Pt = vim.bindeval('Pt')
1976 unlet Pt
1977 py del Pt
1978
Bram Moolenaarab589462020-07-06 21:03:06 +02001979 call assert_equal(3, pyeval('vim.strwidth("a\tb")'))
1980
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02001981 %bw!
1982 py cb = vim.current.buffer
1983 py << trim EOF
1984 def ecall(out_prefix, func, *args, **kwargs):
1985 line = out_prefix + ': '
1986 try:
1987 ret = func(*args, **kwargs)
1988 except Exception:
1989 line += '!exception: ' + emsg(sys.exc_info())
1990 else:
1991 line += '!result: ' + vim.Function('string')(ret)
1992 cb.append(line)
1993 a = vim.Function('Args')
1994 pa1 = vim.Function('Args', args=['abcArgsPA1'])
1995 pa2 = vim.Function('Args', args=[])
1996 pa3 = vim.Function('Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'})
1997 pa4 = vim.Function('Args', self={'abcSelfPA4': 'abcSelfPA4Val'})
1998 cb.append('a: ' + repr(a))
1999 cb.append('pa1: ' + repr(pa1))
2000 cb.append('pa2: ' + repr(pa2))
2001 cb.append('pa3: ' + repr(pa3))
2002 cb.append('pa4: ' + repr(pa4))
2003 sa = vim.Function('SelfArgs')
2004 psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1'])
2005 psa2 = vim.Function('SelfArgs', args=[])
2006 psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'})
2007 psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'})
2008 psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0)
2009 psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=())
2010 psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[])
2011 psa8 = vim.Function('SelfArgs', auto_rebind=False)
2012 psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True)
2013 psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1)
2014 psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'})
2015 psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC'])
2016 cb.append('sa: ' + repr(sa))
2017 cb.append('psa1: ' + repr(psa1))
2018 cb.append('psa2: ' + repr(psa2))
2019 cb.append('psa3: ' + repr(psa3))
2020 cb.append('psa4: ' + repr(psa4))
2021 cb.append('psa5: ' + repr(psa5))
2022 cb.append('psa6: ' + repr(psa6))
2023 cb.append('psa7: ' + repr(psa7))
2024 cb.append('psa8: ' + repr(psa8))
2025 cb.append('psa9: ' + repr(psa9))
2026 cb.append('psaA: ' + repr(psaA))
2027 cb.append('psaB: ' + repr(psaB))
2028 cb.append('psaC: ' + repr(psaC))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002029
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002030 psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'})
2031 psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]]
2032 psar.self['rec'] = psar
2033 psar.self['self'] = psar.self
2034 psar.self['args'] = psar.args
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002035
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002036 try:
2037 cb.append('psar: ' + repr(psar))
2038 except Exception:
2039 cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
2040 EOF
2041
2042 let expected =<< trim END
2043 a: <vim.Function 'Args'>
2044 pa1: <vim.Function 'Args', args=['abcArgsPA1']>
2045 pa2: <vim.Function 'Args'>
2046 pa3: <vim.Function 'Args', args=['abcArgsPA3'], self={'abcSelfPA3': 'abcSelfPA3Val'}>
2047 pa4: <vim.Function 'Args', self={'abcSelfPA4': 'abcSelfPA4Val'}>
2048 sa: <vim.Function 'SelfArgs'>
2049 psa1: <vim.Function 'SelfArgs', args=['abcArgsPSA1']>
2050 psa2: <vim.Function 'SelfArgs'>
2051 psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}>
2052 psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}>
2053 psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}>
2054 psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}>
2055 psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']>
2056 psa8: <vim.Function 'SelfArgs'>
2057 psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True>
2058 psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True>
2059 psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']>
2060 psaC: <vim.Function 'SelfArgs'>
2061 psar: <vim.Function 'SelfArgs', args=[{'abcArgsPSAr2': [{'rec': function('SelfArgs', [{...}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], self={'rec': function('SelfArgs', [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}]}>
2062 END
2063 call assert_equal(expected, getline(2, '$'))
2064 %d
2065
2066 call assert_equal(function('Args'), pyeval('a'))
2067 call assert_equal(function('Args', ['abcArgsPA1']), pyeval('pa1'))
2068 call assert_equal(function('Args'), pyeval('pa2'))
2069 call assert_equal(function('Args', ['abcArgsPA3'], {'abcSelfPA3': 'abcSelfPA3Val'}), pyeval('pa3'))
2070 call assert_equal(function('Args', {'abcSelfPA4': 'abcSelfPA4Val'}), pyeval('pa4'))
2071 call assert_equal(function('SelfArgs'), pyeval('sa'))
2072 call assert_equal(function('SelfArgs', ['abcArgsPSA1']), pyeval('psa1'))
2073 call assert_equal(function('SelfArgs'), pyeval('psa2'))
2074 call assert_equal(function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}), pyeval('psa3'))
2075 call assert_equal(function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}), pyeval('psa4'))
2076 call assert_equal(function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}), pyeval('psa5'))
2077 call assert_equal(function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}), pyeval('psa6'))
2078 call assert_equal(function('SelfArgs', ['abcArgsPSA7']), pyeval('psa7'))
2079 call assert_equal(function('SelfArgs'), pyeval('psa8'))
2080 call assert_equal(function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}), pyeval('psa9'))
2081 call assert_equal(function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}), pyeval('psaA'))
2082 call assert_equal(function('SelfArgs', ['abcArgsPSAB']), pyeval('psaB'))
2083 call assert_equal(function('SelfArgs'), pyeval('psaC'))
2084
2085 let res = []
2086 for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7',
2087 \ 'psa8', 'psa9', 'psaA', 'psaB', 'psaC']
2088 let d = {'f': pyeval(v)}
2089 call add(res, 'd.' .. v .. '(): ' .. string(d.f()))
2090 endfor
2091
2092 let expected =<< trim END
2093 d.sa(): [[], {'f': function('SelfArgs')}]
2094 d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}]
2095 d.psa2(): [[], {'f': function('SelfArgs')}]
2096 d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
2097 d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
2098 d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}]
2099 d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}]
2100 d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}]
2101 d.psa8(): [[], {'f': function('SelfArgs')}]
2102 d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}]
2103 d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}]
2104 d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}]
2105 d.psaC(): [[], {'f': function('SelfArgs')}]
2106 END
2107 call assert_equal(expected, res)
2108
2109 py ecall('a()', a, )
2110 py ecall('pa1()', pa1, )
2111 py ecall('pa2()', pa2, )
2112 py ecall('pa3()', pa3, )
2113 py ecall('pa4()', pa4, )
2114 py ecall('sa()', sa, )
2115 py ecall('psa1()', psa1, )
2116 py ecall('psa2()', psa2, )
2117 py ecall('psa3()', psa3, )
2118 py ecall('psa4()', psa4, )
2119
2120 py ecall('a(42, 43)', a, 42, 43)
2121 py ecall('pa1(42, 43)', pa1, 42, 43)
2122 py ecall('pa2(42, 43)', pa2, 42, 43)
2123 py ecall('pa3(42, 43)', pa3, 42, 43)
2124 py ecall('pa4(42, 43)', pa4, 42, 43)
2125 py ecall('sa(42, 43)', sa, 42, 43)
2126 py ecall('psa1(42, 43)', psa1, 42, 43)
2127 py ecall('psa2(42, 43)', psa2, 42, 43)
2128 py ecall('psa3(42, 43)', psa3, 42, 43)
2129 py ecall('psa4(42, 43)', psa4, 42, 43)
2130
2131 py ecall('a(42, self={"20": 1})', a, 42, self={'20': 1})
2132 py ecall('pa1(42, self={"20": 1})', pa1, 42, self={'20': 1})
2133 py ecall('pa2(42, self={"20": 1})', pa2, 42, self={'20': 1})
2134 py ecall('pa3(42, self={"20": 1})', pa3, 42, self={'20': 1})
2135 py ecall('pa4(42, self={"20": 1})', pa4, 42, self={'20': 1})
2136 py ecall('sa(42, self={"20": 1})', sa, 42, self={'20': 1})
2137 py ecall('psa1(42, self={"20": 1})', psa1, 42, self={'20': 1})
2138 py ecall('psa2(42, self={"20": 1})', psa2, 42, self={'20': 1})
2139 py ecall('psa3(42, self={"20": 1})', psa3, 42, self={'20': 1})
2140 py ecall('psa4(42, self={"20": 1})', psa4, 42, self={'20': 1})
2141
2142 py ecall('a(self={"20": 1})', a, self={'20': 1})
2143 py ecall('pa1(self={"20": 1})', pa1, self={'20': 1})
2144 py ecall('pa2(self={"20": 1})', pa2, self={'20': 1})
2145 py ecall('pa3(self={"20": 1})', pa3, self={'20': 1})
2146 py ecall('pa4(self={"20": 1})', pa4, self={'20': 1})
2147 py ecall('sa(self={"20": 1})', sa, self={'20': 1})
2148 py ecall('psa1(self={"20": 1})', psa1, self={'20': 1})
2149 py ecall('psa2(self={"20": 1})', psa2, self={'20': 1})
2150 py ecall('psa3(self={"20": 1})', psa3, self={'20': 1})
2151 py ecall('psa4(self={"20": 1})', psa4, self={'20': 1})
2152
2153 py << trim EOF
2154 def s(v):
2155 if v is None:
2156 return repr(v)
2157 else:
2158 return vim.Function('string')(v)
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002159
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002160 cb.append('a.args: ' + s(a.args))
2161 cb.append('pa1.args: ' + s(pa1.args))
2162 cb.append('pa2.args: ' + s(pa2.args))
2163 cb.append('pa3.args: ' + s(pa3.args))
2164 cb.append('pa4.args: ' + s(pa4.args))
2165 cb.append('sa.args: ' + s(sa.args))
2166 cb.append('psa1.args: ' + s(psa1.args))
2167 cb.append('psa2.args: ' + s(psa2.args))
2168 cb.append('psa3.args: ' + s(psa3.args))
2169 cb.append('psa4.args: ' + s(psa4.args))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002170
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002171 cb.append('a.self: ' + s(a.self))
2172 cb.append('pa1.self: ' + s(pa1.self))
2173 cb.append('pa2.self: ' + s(pa2.self))
2174 cb.append('pa3.self: ' + s(pa3.self))
2175 cb.append('pa4.self: ' + s(pa4.self))
2176 cb.append('sa.self: ' + s(sa.self))
2177 cb.append('psa1.self: ' + s(psa1.self))
2178 cb.append('psa2.self: ' + s(psa2.self))
2179 cb.append('psa3.self: ' + s(psa3.self))
2180 cb.append('psa4.self: ' + s(psa4.self))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002181
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002182 cb.append('a.name: ' + s(a.name))
2183 cb.append('pa1.name: ' + s(pa1.name))
2184 cb.append('pa2.name: ' + s(pa2.name))
2185 cb.append('pa3.name: ' + s(pa3.name))
2186 cb.append('pa4.name: ' + s(pa4.name))
2187 cb.append('sa.name: ' + s(sa.name))
2188 cb.append('psa1.name: ' + s(psa1.name))
2189 cb.append('psa2.name: ' + s(psa2.name))
2190 cb.append('psa3.name: ' + s(psa3.name))
2191 cb.append('psa4.name: ' + s(psa4.name))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002192
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002193 cb.append('a.auto_rebind: ' + s(a.auto_rebind))
2194 cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind))
2195 cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind))
2196 cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind))
2197 cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind))
2198 cb.append('sa.auto_rebind: ' + s(sa.auto_rebind))
2199 cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind))
2200 cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind))
2201 cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind))
2202 cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind))
2203 cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind))
2204 cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind))
2205 cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind))
2206 cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind))
2207 cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind))
2208 cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind))
2209 cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind))
2210 cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002211
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002212 del s
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002213
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002214 del a
2215 del pa1
2216 del pa2
2217 del pa3
2218 del pa4
2219 del sa
2220 del psa1
2221 del psa2
2222 del psa3
2223 del psa4
2224 del psa5
2225 del psa6
2226 del psa7
2227 del psa8
2228 del psa9
2229 del psaA
2230 del psaB
2231 del psaC
2232 del psar
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002233
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002234 del ecall
2235 EOF
2236
2237 let expected =<< trim END
2238 a(): !result: []
2239 pa1(): !result: ['abcArgsPA1']
2240 pa2(): !result: []
2241 pa3(): !result: ['abcArgsPA3']
2242 pa4(): !result: []
2243 sa(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2244 psa1(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2245 psa2(): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2246 psa3(): !result: [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
2247 psa4(): !result: [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
2248 a(42, 43): !result: [42, 43]
2249 pa1(42, 43): !result: ['abcArgsPA1', 42, 43]
2250 pa2(42, 43): !result: [42, 43]
2251 pa3(42, 43): !result: ['abcArgsPA3', 42, 43]
2252 pa4(42, 43): !result: [42, 43]
2253 sa(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2254 psa1(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2255 psa2(42, 43): !exception: error:('Vim:E725: Calling dict function without Dictionary: SelfArgs',)
2256 psa3(42, 43): !result: [['abcArgsPSA3', 42, 43], {'abcSelfPSA3': 'abcSelfPSA3Val'}]
2257 psa4(42, 43): !result: [[42, 43], {'abcSelfPSA4': 'abcSelfPSA4Val'}]
2258 a(42, self={"20": 1}): !result: [42]
2259 pa1(42, self={"20": 1}): !result: ['abcArgsPA1', 42]
2260 pa2(42, self={"20": 1}): !result: [42]
2261 pa3(42, self={"20": 1}): !result: ['abcArgsPA3', 42]
2262 pa4(42, self={"20": 1}): !result: [42]
2263 sa(42, self={"20": 1}): !result: [[42], {'20': 1}]
2264 psa1(42, self={"20": 1}): !result: [['abcArgsPSA1', 42], {'20': 1}]
2265 psa2(42, self={"20": 1}): !result: [[42], {'20': 1}]
2266 psa3(42, self={"20": 1}): !result: [['abcArgsPSA3', 42], {'20': 1}]
2267 psa4(42, self={"20": 1}): !result: [[42], {'20': 1}]
2268 a(self={"20": 1}): !result: []
2269 pa1(self={"20": 1}): !result: ['abcArgsPA1']
2270 pa2(self={"20": 1}): !result: []
2271 pa3(self={"20": 1}): !result: ['abcArgsPA3']
2272 pa4(self={"20": 1}): !result: []
2273 sa(self={"20": 1}): !result: [[], {'20': 1}]
2274 psa1(self={"20": 1}): !result: [['abcArgsPSA1'], {'20': 1}]
2275 psa2(self={"20": 1}): !result: [[], {'20': 1}]
2276 psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'20': 1}]
2277 psa4(self={"20": 1}): !result: [[], {'20': 1}]
2278 a.args: None
2279 pa1.args: ['abcArgsPA1']
2280 pa2.args: None
2281 pa3.args: ['abcArgsPA3']
2282 pa4.args: None
2283 sa.args: None
2284 psa1.args: ['abcArgsPSA1']
2285 psa2.args: None
2286 psa3.args: ['abcArgsPSA3']
2287 psa4.args: None
2288 a.self: None
2289 pa1.self: None
2290 pa2.self: None
2291 pa3.self: {'abcSelfPA3': 'abcSelfPA3Val'}
2292 pa4.self: {'abcSelfPA4': 'abcSelfPA4Val'}
2293 sa.self: None
2294 psa1.self: None
2295 psa2.self: None
2296 psa3.self: {'abcSelfPSA3': 'abcSelfPSA3Val'}
2297 psa4.self: {'abcSelfPSA4': 'abcSelfPSA4Val'}
2298 a.name: 'Args'
2299 pa1.name: 'Args'
2300 pa2.name: 'Args'
2301 pa3.name: 'Args'
2302 pa4.name: 'Args'
2303 sa.name: 'SelfArgs'
2304 psa1.name: 'SelfArgs'
2305 psa2.name: 'SelfArgs'
2306 psa3.name: 'SelfArgs'
2307 psa4.name: 'SelfArgs'
2308 a.auto_rebind: 1
2309 pa1.auto_rebind: 1
2310 pa2.auto_rebind: 1
2311 pa3.auto_rebind: 0
2312 pa4.auto_rebind: 0
2313 sa.auto_rebind: 1
2314 psa1.auto_rebind: 1
2315 psa2.auto_rebind: 1
2316 psa3.auto_rebind: 0
2317 psa4.auto_rebind: 0
2318 psa5.auto_rebind: 0
2319 psa6.auto_rebind: 0
2320 psa7.auto_rebind: 1
2321 psa8.auto_rebind: 1
2322 psa9.auto_rebind: 1
2323 psaA.auto_rebind: 1
2324 psaB.auto_rebind: 1
2325 psaC.auto_rebind: 1
2326 END
2327 call assert_equal(expected, getline(2, '$'))
2328 %bw!
2329endfunc
2330
2331" Test stdout/stderr
2332func Test_python_stdin_stderr()
2333 let caught_writeerr = 0
2334 let caught_writelineerr = 0
2335 redir => messages
2336 py sys.stdout.write('abc8') ; sys.stdout.write('def')
2337 try
2338 py sys.stderr.write('abc9') ; sys.stderr.write('def')
2339 catch /abc9def/
2340 let caught_writeerr = 1
2341 endtry
2342 py sys.stdout.writelines(iter('abcA'))
2343 try
2344 py sys.stderr.writelines(iter('abcB'))
2345 catch /abcB/
2346 let caught_writelineerr = 1
2347 endtry
2348 redir END
2349 call assert_equal("\nabc8def\nabcA", messages)
2350 call assert_equal(1, caught_writeerr)
2351 call assert_equal(1, caught_writelineerr)
2352endfunc
2353
2354" Test subclassing
2355func Test_python_subclass()
2356 new
Bram Moolenaarab589462020-07-06 21:03:06 +02002357 func Put(...)
2358 return a:000
2359 endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002360
2361 py << trim EOF
2362 class DupDict(vim.Dictionary):
2363 def __setitem__(self, key, value):
2364 super(DupDict, self).__setitem__(key, value)
2365 super(DupDict, self).__setitem__('dup_' + key, value)
2366 dd = DupDict()
2367 dd['a'] = 'b'
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002368
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002369 class DupList(vim.List):
2370 def __getitem__(self, idx):
2371 return [super(DupList, self).__getitem__(idx)] * 2
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002372
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002373 dl = DupList()
2374 dl2 = DupList(iter('abcC'))
2375 dl.extend(dl2[0])
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002376
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002377 class DupFun(vim.Function):
2378 def __call__(self, arg):
2379 return super(DupFun, self).__call__(arg, arg)
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002380
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002381 df = DupFun('Put')
2382 EOF
2383
2384 call assert_equal(['a', 'dup_a'], sort(keys(pyeval('dd'))))
2385 call assert_equal(['a', 'a'], pyeval('dl'))
2386 call assert_equal(['a', 'b', 'c', 'C'], pyeval('dl2'))
2387 call assert_equal([2, 2], pyeval('df(2)'))
2388 call assert_equal(1, pyeval('dl') is# pyeval('dl'))
2389 call assert_equal(1, pyeval('dd') is# pyeval('dd'))
2390 call assert_equal(function('Put'), pyeval('df'))
2391 delfunction Put
2392 py << trim EOF
2393 del DupDict
2394 del DupList
2395 del DupFun
2396 del dd
2397 del dl
2398 del dl2
2399 del df
2400 EOF
2401 close!
2402endfunc
2403
2404" Test chdir
2405func Test_python_chdir()
2406 new Xfile
2407 py cb = vim.current.buffer
2408 py << trim EOF
2409 import os
2410 fnamemodify = vim.Function('fnamemodify')
2411 cb.append(fnamemodify('.', ':p:h:t'))
2412 cb.append(vim.eval('@%'))
2413 os.chdir('..')
2414 path = fnamemodify('.', ':p:h:t')
Bram Moolenaar7d697962020-08-31 21:30:32 +02002415 if path != 'src' and path != 'src2':
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002416 # Running tests from a shadow directory, so move up another level
2417 # This will result in @% looking like shadow/testdir/Xfile, hence the
2418 # extra fnamemodify
2419 os.chdir('..')
2420 cb.append(fnamemodify('.', ':p:h:t'))
2421 cb.append(fnamemodify(vim.eval('@%'), ':s?^%s.??' % path).replace(os.path.sep, '/'))
2422 os.chdir(path)
2423 del path
2424 else:
Bram Moolenaar7d697962020-08-31 21:30:32 +02002425 # Also accept running from src2/testdir/ for MS-Windows CI.
2426 cb.append(fnamemodify('.', ':p:h:t').replace('src2', 'src'))
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002427 cb.append(vim.eval('@%').replace(os.path.sep, '/'))
2428 os.chdir('testdir')
2429 cb.append(fnamemodify('.', ':p:h:t'))
2430 cb.append(vim.eval('@%'))
2431 del fnamemodify
2432 EOF
2433 call assert_equal(['testdir', 'Xfile', 'src', 'testdir/Xfile', 'testdir',
2434 \ 'Xfile'], getline(2, '$'))
2435 close!
Bram Moolenaar0ab55d62020-07-07 20:50:39 +02002436 call AssertException(["py vim.chdir(None)"], "Vim(python):TypeError:")
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002437endfunc
2438
2439" Test errors
2440func Test_python_errors()
Bram Moolenaarab589462020-07-06 21:03:06 +02002441 func F() dict
2442 endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002443
Bram Moolenaarab589462020-07-06 21:03:06 +02002444 func D()
2445 endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002446
2447 new
2448 py cb = vim.current.buffer
2449
2450 py << trim EOF
2451 d = vim.Dictionary()
2452 ned = vim.Dictionary(foo='bar', baz='abcD')
2453 dl = vim.Dictionary(a=1)
2454 dl.locked = True
2455 l = vim.List()
2456 ll = vim.List('abcE')
2457 ll.locked = True
2458 nel = vim.List('abcO')
2459 f = vim.Function('string')
2460 fd = vim.Function('F')
2461 fdel = vim.Function('D')
2462 vim.command('delfunction D')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002463
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002464 def subexpr_test(expr, name, subexprs):
2465 cb.append('>>> Testing %s using %s' % (name, expr))
2466 for subexpr in subexprs:
2467 ee(expr % subexpr)
2468 cb.append('<<< Finished')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002469
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002470 def stringtochars_test(expr):
2471 return subexpr_test(expr, 'StringToChars', (
2472 '1', # Fail type checks
2473 'u"\\0"', # Fail PyString_AsStringAndSize(bytes, , NULL) check
2474 '"\\0"', # Fail PyString_AsStringAndSize(object, , NULL) check
2475 ))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002476
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002477 class Mapping(object):
2478 def __init__(self, d):
2479 self.d = d
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002480
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002481 def __getitem__(self, key):
2482 return self.d[key]
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002483
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002484 def keys(self):
2485 return self.d.keys()
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002486
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002487 def items(self):
2488 return self.d.items()
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002489
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002490 def convertfrompyobject_test(expr, recurse=True):
2491 # pydict_to_tv
2492 stringtochars_test(expr % '{%s : 1}')
2493 if recurse:
2494 convertfrompyobject_test(expr % '{"abcF" : %s}', False)
2495 # pymap_to_tv
2496 stringtochars_test(expr % 'Mapping({%s : 1})')
2497 if recurse:
2498 convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False)
2499 # pyseq_to_tv
2500 iter_test(expr)
2501 return subexpr_test(expr, 'ConvertFromPyObject', (
2502 'None', # Not conversible
2503 '{"": 1}', # Empty key not allowed
2504 '{u"": 1}', # Same, but with unicode object
2505 'FailingMapping()', #
2506 'FailingMappingKey()', #
2507 'FailingNumber()', #
2508 ))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002509
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002510 def convertfrompymapping_test(expr):
2511 convertfrompyobject_test(expr)
2512 return subexpr_test(expr, 'ConvertFromPyMapping', (
2513 '[]',
2514 ))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002515
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002516 def iter_test(expr):
2517 return subexpr_test(expr, '*Iter*', (
2518 'FailingIter()',
2519 'FailingIterNext()',
2520 ))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002521
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002522 def number_test(expr, natural=False, unsigned=False):
2523 if natural:
2524 unsigned = True
2525 return subexpr_test(expr, 'NumberToLong', (
2526 '[]',
2527 'None',
2528 ) + (unsigned and ('-1',) or ())
2529 + (natural and ('0',) or ()))
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002530
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002531 class FailingTrue(object):
2532 def __nonzero__(self):
2533 raise NotImplementedError('bool')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002534
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002535 class FailingIter(object):
2536 def __iter__(self):
2537 raise NotImplementedError('iter')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002538
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002539 class FailingIterNext(object):
2540 def __iter__(self):
2541 return self
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002542
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002543 def next(self):
2544 raise NotImplementedError('next')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002545
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002546 class FailingIterNextN(object):
2547 def __init__(self, n):
2548 self.n = n
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002549
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002550 def __iter__(self):
2551 return self
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002552
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002553 def next(self):
2554 if self.n:
2555 self.n -= 1
2556 return 1
2557 else:
2558 raise NotImplementedError('next N')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002559
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002560 class FailingMappingKey(object):
2561 def __getitem__(self, item):
2562 raise NotImplementedError('getitem:mappingkey')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002563
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002564 def keys(self):
2565 return list("abcH")
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002566
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002567 class FailingMapping(object):
2568 def __getitem__(self):
2569 raise NotImplementedError('getitem:mapping')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002570
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002571 def keys(self):
2572 raise NotImplementedError('keys')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002573
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002574 class FailingList(list):
2575 def __getitem__(self, idx):
2576 if i == 2:
2577 raise NotImplementedError('getitem:list')
2578 else:
2579 return super(FailingList, self).__getitem__(idx)
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002580
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002581 class NoArgsCall(object):
2582 def __call__(self):
2583 pass
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002584
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002585 class FailingCall(object):
2586 def __call__(self, path):
2587 raise NotImplementedError('call')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002588
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002589 class FailingNumber(object):
2590 def __int__(self):
2591 raise NotImplementedError('int')
Bram Moolenaareffb0cd2020-07-03 21:17:34 +02002592
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002593 cb.append("> Output")
2594 cb.append(">> OutputSetattr")
2595 ee('del sys.stdout.softspace')
2596 number_test('sys.stdout.softspace = %s', unsigned=True)
2597 number_test('sys.stderr.softspace = %s', unsigned=True)
2598 ee('assert sys.stdout.isatty()==False')
2599 ee('assert sys.stdout.seekable()==False')
2600 ee('sys.stdout.close()')
2601 ee('sys.stdout.flush()')
2602 ee('assert sys.stderr.isatty()==False')
2603 ee('assert sys.stderr.seekable()==False')
2604 ee('sys.stderr.close()')
2605 ee('sys.stderr.flush()')
2606 ee('sys.stdout.attr = None')
2607 cb.append(">> OutputWrite")
2608 ee('assert sys.stdout.writable()==True')
2609 ee('assert sys.stdout.readable()==False')
2610 ee('assert sys.stderr.writable()==True')
2611 ee('assert sys.stderr.readable()==False')
2612 ee('assert sys.stdout.closed()==False')
2613 ee('assert sys.stderr.closed()==False')
2614 ee('assert sys.stdout.errors=="strict"')
2615 ee('assert sys.stderr.errors=="strict"')
2616 ee('assert sys.stdout.encoding==sys.stderr.encoding')
2617 ee('sys.stdout.write(None)')
2618 cb.append(">> OutputWriteLines")
2619 ee('sys.stdout.writelines(None)')
2620 ee('sys.stdout.writelines([1])')
2621 iter_test('sys.stdout.writelines(%s)')
2622 cb.append("> VimCommand")
2623 stringtochars_test('vim.command(%s)')
2624 ee('vim.command("", 2)')
2625 #! Not checked: vim->python exceptions translating: checked later
2626 cb.append("> VimToPython")
2627 #! Not checked: everything: needs errors in internal python functions
2628 cb.append("> VimEval")
2629 stringtochars_test('vim.eval(%s)')
2630 ee('vim.eval("", FailingTrue())')
2631 #! Not checked: everything: needs errors in internal python functions
2632 cb.append("> VimEvalPy")
2633 stringtochars_test('vim.bindeval(%s)')
2634 ee('vim.eval("", 2)')
2635 #! Not checked: vim->python exceptions translating: checked later
2636 cb.append("> VimStrwidth")
2637 stringtochars_test('vim.strwidth(%s)')
2638 cb.append("> VimForeachRTP")
2639 ee('vim.foreach_rtp(None)')
2640 ee('vim.foreach_rtp(NoArgsCall())')
2641 ee('vim.foreach_rtp(FailingCall())')
2642 ee('vim.foreach_rtp(int, 2)')
2643 cb.append('> import')
2644 old_rtp = vim.options['rtp']
2645 vim.options['rtp'] = os.getcwd().replace('\\', '\\\\').replace(',', '\\,')
2646 ee('import xxx_no_such_module_xxx')
2647 ee('import failing_import')
2648 ee('import failing')
2649 vim.options['rtp'] = old_rtp
2650 del old_rtp
2651 cb.append("> Options")
2652 cb.append(">> OptionsItem")
2653 ee('vim.options["abcQ"]')
2654 ee('vim.options[""]')
2655 stringtochars_test('vim.options[%s]')
2656 cb.append(">> OptionsContains")
2657 stringtochars_test('%s in vim.options')
2658 cb.append("> Dictionary")
2659 cb.append(">> DictionaryConstructor")
2660 ee('vim.Dictionary("abcI")')
2661 ##! Not checked: py_dict_alloc failure
2662 cb.append(">> DictionarySetattr")
2663 ee('del d.locked')
2664 ee('d.locked = FailingTrue()')
2665 ee('vim.vvars.locked = False')
2666 ee('d.scope = True')
2667 ee('d.xxx = True')
2668 cb.append(">> _DictionaryItem")
2669 ee('d.get("a", 2, 3)')
2670 stringtochars_test('d.get(%s)')
2671 ee('d.pop("a")')
2672 ee('dl.pop("a")')
2673 cb.append(">> DictionaryContains")
2674 ee('"" in d')
2675 ee('0 in d')
2676 cb.append(">> DictionaryIterNext")
2677 ee('for i in ned: ned["a"] = 1')
2678 del i
2679 cb.append(">> DictionaryAssItem")
2680 ee('dl["b"] = 1')
2681 stringtochars_test('d[%s] = 1')
2682 convertfrompyobject_test('d["a"] = %s')
2683 cb.append(">> DictionaryUpdate")
2684 cb.append(">>> kwargs")
2685 cb.append(">>> iter")
2686 ee('d.update(FailingMapping())')
2687 ee('d.update([FailingIterNext()])')
2688 ee('d.update([FailingIterNextN(1)])')
2689 iter_test('d.update(%s)')
2690 convertfrompyobject_test('d.update(%s)')
2691 stringtochars_test('d.update(((%s, 0),))')
2692 convertfrompyobject_test('d.update((("a", %s),))')
2693 cb.append(">> DictionaryPopItem")
2694 ee('d.popitem(1, 2)')
2695 cb.append(">> DictionaryHasKey")
2696 ee('d.has_key()')
2697 cb.append("> List")
2698 cb.append(">> ListConstructor")
2699 ee('vim.List(1, 2)')
2700 ee('vim.List(a=1)')
2701 iter_test('vim.List(%s)')
2702 convertfrompyobject_test('vim.List([%s])')
2703 cb.append(">> ListItem")
2704 ee('l[1000]')
2705 cb.append(">> ListAssItem")
2706 ee('ll[1] = 2')
2707 ee('l[1000] = 3')
2708 cb.append(">> ListAssSlice")
2709 ee('ll[1:100] = "abcJ"')
2710 iter_test('l[:] = %s')
2711 ee('nel[1:10:2] = "abcK"')
2712 cb.append(repr(tuple(nel)))
2713 ee('nel[1:10:2] = "a"')
2714 cb.append(repr(tuple(nel)))
2715 ee('nel[1:1:-1] = "a"')
2716 cb.append(repr(tuple(nel)))
2717 ee('nel[:] = FailingIterNextN(2)')
2718 cb.append(repr(tuple(nel)))
2719 convertfrompyobject_test('l[:] = [%s]')
2720 cb.append(">> ListConcatInPlace")
2721 iter_test('l.extend(%s)')
2722 convertfrompyobject_test('l.extend([%s])')
2723 cb.append(">> ListSetattr")
2724 ee('del l.locked')
2725 ee('l.locked = FailingTrue()')
2726 ee('l.xxx = True')
2727 cb.append("> Function")
2728 cb.append(">> FunctionConstructor")
2729 cb.append(">>> FunctionConstructor")
2730 ee('vim.Function("123")')
2731 ee('vim.Function("xxx_non_existent_function_xxx")')
2732 ee('vim.Function("xxx#non#existent#function#xxx")')
2733 ee('vim.Function("xxx_non_existent_function_xxx2", args=[])')
2734 ee('vim.Function("xxx_non_existent_function_xxx3", self={})')
2735 ee('vim.Function("xxx_non_existent_function_xxx4", args=[], self={})')
2736 cb.append(">>> FunctionNew")
2737 ee('vim.Function("tr", self="abcFuncSelf")')
2738 ee('vim.Function("tr", args=427423)')
2739 ee('vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2")')
2740 ee('vim.Function(self="abcFuncSelf2", args="abcFuncArgs2")')
2741 ee('vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2")')
2742 ee('vim.Function("tr", "")')
2743 cb.append(">> FunctionCall")
2744 convertfrompyobject_test('f(%s)')
2745 convertfrompymapping_test('fd(self=%s)')
2746 cb.append("> TabPage")
2747 cb.append(">> TabPageAttr")
2748 ee('vim.current.tabpage.xxx')
2749 cb.append("> TabList")
2750 cb.append(">> TabListItem")
2751 ee('vim.tabpages[1000]')
2752 cb.append("> Window")
2753 cb.append(">> WindowAttr")
2754 ee('vim.current.window.xxx')
2755 cb.append(">> WindowSetattr")
2756 ee('vim.current.window.buffer = 0')
2757 ee('vim.current.window.cursor = (100000000, 100000000)')
2758 ee('vim.current.window.cursor = True')
2759 number_test('vim.current.window.height = %s', unsigned=True)
2760 number_test('vim.current.window.width = %s', unsigned=True)
2761 ee('vim.current.window.xxxxxx = True')
2762 cb.append("> WinList")
2763 cb.append(">> WinListItem")
2764 ee('vim.windows[1000]')
2765 cb.append("> Buffer")
2766 cb.append(">> StringToLine (indirect)")
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002767 ee('vim.current.buffer[0] = "\\na"')
Bram Moolenaarab589462020-07-06 21:03:06 +02002768 ee('vim.current.buffer[0] = u"\\na"')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02002769 cb.append(">> SetBufferLine (indirect)")
2770 ee('vim.current.buffer[0] = True')
2771 cb.append(">> SetBufferLineList (indirect)")
2772 ee('vim.current.buffer[:] = True')
2773 ee('vim.current.buffer[:] = ["\\na", "bc"]')
2774 cb.append(">> InsertBufferLines (indirect)")
2775 ee('vim.current.buffer.append(None)')
2776 ee('vim.current.buffer.append(["\\na", "bc"])')
2777 ee('vim.current.buffer.append("\\nbc")')
2778 cb.append(">> RBItem")
2779 ee('vim.current.buffer[100000000]')
2780 cb.append(">> RBAsItem")
2781 ee('vim.current.buffer[100000000] = ""')
2782 cb.append(">> BufferAttr")
2783 ee('vim.current.buffer.xxx')
2784 cb.append(">> BufferSetattr")
2785 ee('vim.current.buffer.name = True')
2786 ee('vim.current.buffer.xxx = True')
2787 cb.append(">> BufferMark")
2788 ee('vim.current.buffer.mark(0)')
2789 ee('vim.current.buffer.mark("abcM")')
2790 ee('vim.current.buffer.mark("!")')
2791 cb.append(">> BufferRange")
2792 ee('vim.current.buffer.range(1, 2, 3)')
2793 cb.append("> BufMap")
2794 cb.append(">> BufMapItem")
2795 ee('vim.buffers[100000000]')
2796 number_test('vim.buffers[%s]', natural=True)
2797 cb.append("> Current")
2798 cb.append(">> CurrentGetattr")
2799 ee('vim.current.xxx')
2800 cb.append(">> CurrentSetattr")
2801 ee('vim.current.line = True')
2802 ee('vim.current.buffer = True')
2803 ee('vim.current.window = True')
2804 ee('vim.current.tabpage = True')
2805 ee('vim.current.xxx = True')
2806 del d
2807 del ned
2808 del dl
2809 del l
2810 del ll
2811 del nel
2812 del f
2813 del fd
2814 del fdel
2815 del subexpr_test
2816 del stringtochars_test
2817 del Mapping
2818 del convertfrompyobject_test
2819 del convertfrompymapping_test
2820 del iter_test
2821 del number_test
2822 del FailingTrue
2823 del FailingIter
2824 del FailingIterNext
2825 del FailingIterNextN
2826 del FailingMapping
2827 del FailingMappingKey
2828 del FailingList
2829 del NoArgsCall
2830 del FailingCall
2831 del FailingNumber
2832 EOF
2833 delfunction F
2834
2835 let expected =<< trim END
2836 > Output
2837 >> OutputSetattr
2838 del sys.stdout.softspace:AttributeError:('cannot delete OutputObject attributes',)
2839 >>> Testing NumberToLong using sys.stdout.softspace = %s
2840 sys.stdout.softspace = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
2841 sys.stdout.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
2842 sys.stdout.softspace = -1:ValueError:('number must be greater or equal to zero',)
2843 <<< Finished
2844 >>> Testing NumberToLong using sys.stderr.softspace = %s
2845 sys.stderr.softspace = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
2846 sys.stderr.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
2847 sys.stderr.softspace = -1:ValueError:('number must be greater or equal to zero',)
2848 <<< Finished
2849 assert sys.stdout.isatty()==False:NOT FAILED
2850 assert sys.stdout.seekable()==False:NOT FAILED
2851 sys.stdout.close():NOT FAILED
2852 sys.stdout.flush():NOT FAILED
2853 assert sys.stderr.isatty()==False:NOT FAILED
2854 assert sys.stderr.seekable()==False:NOT FAILED
2855 sys.stderr.close():NOT FAILED
2856 sys.stderr.flush():NOT FAILED
2857 sys.stdout.attr = None:AttributeError:('invalid attribute: attr',)
2858 >> OutputWrite
2859 assert sys.stdout.writable()==True:NOT FAILED
2860 assert sys.stdout.readable()==False:NOT FAILED
2861 assert sys.stderr.writable()==True:NOT FAILED
2862 assert sys.stderr.readable()==False:NOT FAILED
2863 assert sys.stdout.closed()==False:NOT FAILED
2864 assert sys.stderr.closed()==False:NOT FAILED
2865 assert sys.stdout.errors=="strict":NOT FAILED
2866 assert sys.stderr.errors=="strict":NOT FAILED
2867 assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED
2868 sys.stdout.write(None):TypeError:('coercing to Unicode: need string or buffer, NoneType found',)
2869 >> OutputWriteLines
2870 sys.stdout.writelines(None):TypeError:("'NoneType' object is not iterable",)
2871 sys.stdout.writelines([1]):TypeError:('coercing to Unicode: need string or buffer, int found',)
2872 >>> Testing *Iter* using sys.stdout.writelines(%s)
2873 sys.stdout.writelines(FailingIter()):NotImplementedError:('iter',)
2874 sys.stdout.writelines(FailingIterNext()):NotImplementedError:('next',)
2875 <<< Finished
2876 > VimCommand
2877 >>> Testing StringToChars using vim.command(%s)
2878 vim.command(1):TypeError:('expected str() or unicode() instance, but got int',)
2879 vim.command(u"\0"):TypeError:('expected string without null bytes',)
2880 vim.command("\0"):TypeError:('expected string without null bytes',)
2881 <<< Finished
2882 vim.command("", 2):TypeError:('command() takes exactly one argument (2 given)',)
2883 > VimToPython
2884 > VimEval
2885 >>> Testing StringToChars using vim.eval(%s)
2886 vim.eval(1):TypeError:('expected str() or unicode() instance, but got int',)
2887 vim.eval(u"\0"):TypeError:('expected string without null bytes',)
2888 vim.eval("\0"):TypeError:('expected string without null bytes',)
2889 <<< Finished
2890 vim.eval("", FailingTrue()):TypeError:('function takes exactly 1 argument (2 given)',)
2891 > VimEvalPy
2892 >>> Testing StringToChars using vim.bindeval(%s)
2893 vim.bindeval(1):TypeError:('expected str() or unicode() instance, but got int',)
2894 vim.bindeval(u"\0"):TypeError:('expected string without null bytes',)
2895 vim.bindeval("\0"):TypeError:('expected string without null bytes',)
2896 <<< Finished
2897 vim.eval("", 2):TypeError:('function takes exactly 1 argument (2 given)',)
2898 > VimStrwidth
2899 >>> Testing StringToChars using vim.strwidth(%s)
2900 vim.strwidth(1):TypeError:('expected str() or unicode() instance, but got int',)
2901 vim.strwidth(u"\0"):TypeError:('expected string without null bytes',)
2902 vim.strwidth("\0"):TypeError:('expected string without null bytes',)
2903 <<< Finished
2904 > VimForeachRTP
2905 vim.foreach_rtp(None):TypeError:("'NoneType' object is not callable",)
2906 vim.foreach_rtp(NoArgsCall()):TypeError:('__call__() takes exactly 1 argument (2 given)',)
2907 vim.foreach_rtp(FailingCall()):NotImplementedError:('call',)
2908 vim.foreach_rtp(int, 2):TypeError:('foreach_rtp() takes exactly one argument (2 given)',)
2909 > import
2910 import xxx_no_such_module_xxx:ImportError:('No module named xxx_no_such_module_xxx',)
2911 import failing_import:ImportError:()
2912 import failing:NotImplementedError:()
2913 > Options
2914 >> OptionsItem
2915 vim.options["abcQ"]:KeyError:('abcQ',)
2916 vim.options[""]:ValueError:('empty keys are not allowed',)
2917 >>> Testing StringToChars using vim.options[%s]
2918 vim.options[1]:TypeError:('expected str() or unicode() instance, but got int',)
2919 vim.options[u"\0"]:TypeError:('expected string without null bytes',)
2920 vim.options["\0"]:TypeError:('expected string without null bytes',)
2921 <<< Finished
2922 >> OptionsContains
2923 >>> Testing StringToChars using %s in vim.options
2924 1 in vim.options:TypeError:('expected str() or unicode() instance, but got int',)
2925 u"\0" in vim.options:TypeError:('expected string without null bytes',)
2926 "\0" in vim.options:TypeError:('expected string without null bytes',)
2927 <<< Finished
2928 > Dictionary
2929 >> DictionaryConstructor
2930 vim.Dictionary("abcI"):ValueError:('expected sequence element of size 2, but got sequence of size 1',)
2931 >> DictionarySetattr
2932 del d.locked:AttributeError:('cannot delete vim.Dictionary attributes',)
2933 d.locked = FailingTrue():NotImplementedError:('bool',)
2934 vim.vvars.locked = False:TypeError:('cannot modify fixed dictionary',)
2935 d.scope = True:AttributeError:('cannot set attribute scope',)
2936 d.xxx = True:AttributeError:('cannot set attribute xxx',)
2937 >> _DictionaryItem
2938 d.get("a", 2, 3):TypeError:('function takes at most 2 arguments (3 given)',)
2939 >>> Testing StringToChars using d.get(%s)
2940 d.get(1):TypeError:('expected str() or unicode() instance, but got int',)
2941 d.get(u"\0"):TypeError:('expected string without null bytes',)
2942 d.get("\0"):TypeError:('expected string without null bytes',)
2943 <<< Finished
2944 d.pop("a"):KeyError:('a',)
2945 dl.pop("a"):error:('dictionary is locked',)
2946 >> DictionaryContains
2947 "" in d:ValueError:('empty keys are not allowed',)
2948 0 in d:TypeError:('expected str() or unicode() instance, but got int',)
2949 >> DictionaryIterNext
2950 for i in ned: ned["a"] = 1:RuntimeError:('hashtab changed during iteration',)
2951 >> DictionaryAssItem
2952 dl["b"] = 1:error:('dictionary is locked',)
2953 >>> Testing StringToChars using d[%s] = 1
2954 d[1] = 1:TypeError:('expected str() or unicode() instance, but got int',)
2955 d[u"\0"] = 1:TypeError:('expected string without null bytes',)
2956 d["\0"] = 1:TypeError:('expected string without null bytes',)
2957 <<< Finished
2958 >>> Testing StringToChars using d["a"] = {%s : 1}
2959 d["a"] = {1 : 1}:TypeError:('expected str() or unicode() instance, but got int',)
2960 d["a"] = {u"\0" : 1}:TypeError:('expected string without null bytes',)
2961 d["a"] = {"\0" : 1}:TypeError:('expected string without null bytes',)
2962 <<< Finished
2963 >>> Testing StringToChars using d["a"] = {"abcF" : {%s : 1}}
2964 d["a"] = {"abcF" : {1 : 1}}:TypeError:('expected str() or unicode() instance, but got int',)
2965 d["a"] = {"abcF" : {u"\0" : 1}}:TypeError:('expected string without null bytes',)
2966 d["a"] = {"abcF" : {"\0" : 1}}:TypeError:('expected string without null bytes',)
2967 <<< Finished
2968 >>> Testing StringToChars using d["a"] = {"abcF" : Mapping({%s : 1})}
2969 d["a"] = {"abcF" : Mapping({1 : 1})}:TypeError:('expected str() or unicode() instance, but got int',)
2970 d["a"] = {"abcF" : Mapping({u"\0" : 1})}:TypeError:('expected string without null bytes',)
2971 d["a"] = {"abcF" : Mapping({"\0" : 1})}:TypeError:('expected string without null bytes',)
2972 <<< Finished
2973 >>> Testing *Iter* using d["a"] = {"abcF" : %s}
2974 d["a"] = {"abcF" : FailingIter()}:TypeError:('unable to convert FailingIter to a Vim structure',)
2975 d["a"] = {"abcF" : FailingIterNext()}:NotImplementedError:('next',)
2976 <<< Finished
2977 >>> Testing ConvertFromPyObject using d["a"] = {"abcF" : %s}
2978 d["a"] = {"abcF" : None}:NOT FAILED
2979 d["a"] = {"abcF" : {"": 1}}:ValueError:('empty keys are not allowed',)
2980 d["a"] = {"abcF" : {u"": 1}}:ValueError:('empty keys are not allowed',)
2981 d["a"] = {"abcF" : FailingMapping()}:NotImplementedError:('keys',)
2982 d["a"] = {"abcF" : FailingMappingKey()}:NotImplementedError:('getitem:mappingkey',)
2983 d["a"] = {"abcF" : FailingNumber()}:TypeError:('long() argument must be a string or a number',)
2984 <<< Finished
2985 >>> Testing StringToChars using d["a"] = Mapping({%s : 1})
2986 d["a"] = Mapping({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
2987 d["a"] = Mapping({u"\0" : 1}):TypeError:('expected string without null bytes',)
2988 d["a"] = Mapping({"\0" : 1}):TypeError:('expected string without null bytes',)
2989 <<< Finished
2990 >>> Testing StringToChars using d["a"] = Mapping({"abcG" : {%s : 1}})
2991 d["a"] = Mapping({"abcG" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
2992 d["a"] = Mapping({"abcG" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
2993 d["a"] = Mapping({"abcG" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
2994 <<< Finished
2995 >>> Testing StringToChars using d["a"] = Mapping({"abcG" : Mapping({%s : 1})})
2996 d["a"] = Mapping({"abcG" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
2997 d["a"] = Mapping({"abcG" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
2998 d["a"] = Mapping({"abcG" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
2999 <<< Finished
3000 >>> Testing *Iter* using d["a"] = Mapping({"abcG" : %s})
3001 d["a"] = Mapping({"abcG" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3002 d["a"] = Mapping({"abcG" : FailingIterNext()}):NotImplementedError:('next',)
3003 <<< Finished
3004 >>> Testing ConvertFromPyObject using d["a"] = Mapping({"abcG" : %s})
3005 d["a"] = Mapping({"abcG" : None}):NOT FAILED
3006 d["a"] = Mapping({"abcG" : {"": 1}}):ValueError:('empty keys are not allowed',)
3007 d["a"] = Mapping({"abcG" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3008 d["a"] = Mapping({"abcG" : FailingMapping()}):NotImplementedError:('keys',)
3009 d["a"] = Mapping({"abcG" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3010 d["a"] = Mapping({"abcG" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3011 <<< Finished
3012 >>> Testing *Iter* using d["a"] = %s
3013 d["a"] = FailingIter():TypeError:('unable to convert FailingIter to a Vim structure',)
3014 d["a"] = FailingIterNext():NotImplementedError:('next',)
3015 <<< Finished
3016 >>> Testing ConvertFromPyObject using d["a"] = %s
3017 d["a"] = None:NOT FAILED
3018 d["a"] = {"": 1}:ValueError:('empty keys are not allowed',)
3019 d["a"] = {u"": 1}:ValueError:('empty keys are not allowed',)
3020 d["a"] = FailingMapping():NotImplementedError:('keys',)
3021 d["a"] = FailingMappingKey():NotImplementedError:('getitem:mappingkey',)
3022 d["a"] = FailingNumber():TypeError:('long() argument must be a string or a number',)
3023 <<< Finished
3024 >> DictionaryUpdate
3025 >>> kwargs
3026 >>> iter
3027 d.update(FailingMapping()):NotImplementedError:('keys',)
3028 d.update([FailingIterNext()]):NotImplementedError:('next',)
3029 d.update([FailingIterNextN(1)]):NotImplementedError:('next N',)
3030 >>> Testing *Iter* using d.update(%s)
3031 d.update(FailingIter()):NotImplementedError:('iter',)
3032 d.update(FailingIterNext()):NotImplementedError:('next',)
3033 <<< Finished
3034 >>> Testing StringToChars using d.update({%s : 1})
3035 d.update({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
3036 d.update({u"\0" : 1}):TypeError:('expected string without null bytes',)
3037 d.update({"\0" : 1}):TypeError:('expected string without null bytes',)
3038 <<< Finished
3039 >>> Testing StringToChars using d.update({"abcF" : {%s : 1}})
3040 d.update({"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
3041 d.update({"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
3042 d.update({"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3043 <<< Finished
3044 >>> Testing StringToChars using d.update({"abcF" : Mapping({%s : 1})})
3045 d.update({"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3046 d.update({"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3047 d.update({"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3048 <<< Finished
3049 >>> Testing *Iter* using d.update({"abcF" : %s})
3050 d.update({"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3051 d.update({"abcF" : FailingIterNext()}):NotImplementedError:('next',)
3052 <<< Finished
3053 >>> Testing ConvertFromPyObject using d.update({"abcF" : %s})
3054 d.update({"abcF" : None}):NOT FAILED
3055 d.update({"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
3056 d.update({"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3057 d.update({"abcF" : FailingMapping()}):NotImplementedError:('keys',)
3058 d.update({"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3059 d.update({"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3060 <<< Finished
3061 >>> Testing StringToChars using d.update(Mapping({%s : 1}))
3062 d.update(Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
3063 d.update(Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
3064 d.update(Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
3065 <<< Finished
3066 >>> Testing StringToChars using d.update(Mapping({"abcG" : {%s : 1}}))
3067 d.update(Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
3068 d.update(Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
3069 d.update(Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
3070 <<< Finished
3071 >>> Testing StringToChars using d.update(Mapping({"abcG" : Mapping({%s : 1})}))
3072 d.update(Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
3073 d.update(Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
3074 d.update(Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
3075 <<< Finished
3076 >>> Testing *Iter* using d.update(Mapping({"abcG" : %s}))
3077 d.update(Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
3078 d.update(Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
3079 <<< Finished
3080 >>> Testing ConvertFromPyObject using d.update(Mapping({"abcG" : %s}))
3081 d.update(Mapping({"abcG" : None})):NOT FAILED
3082 d.update(Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
3083 d.update(Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
3084 d.update(Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
3085 d.update(Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
3086 d.update(Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
3087 <<< Finished
3088 >>> Testing *Iter* using d.update(%s)
3089 d.update(FailingIter()):NotImplementedError:('iter',)
3090 d.update(FailingIterNext()):NotImplementedError:('next',)
3091 <<< Finished
3092 >>> Testing ConvertFromPyObject using d.update(%s)
3093 d.update(None):TypeError:("'NoneType' object is not iterable",)
3094 d.update({"": 1}):ValueError:('empty keys are not allowed',)
3095 d.update({u"": 1}):ValueError:('empty keys are not allowed',)
3096 d.update(FailingMapping()):NotImplementedError:('keys',)
3097 d.update(FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
3098 d.update(FailingNumber()):TypeError:("'FailingNumber' object is not iterable",)
3099 <<< Finished
3100 >>> Testing StringToChars using d.update(((%s, 0),))
3101 d.update(((1, 0),)):TypeError:('expected str() or unicode() instance, but got int',)
3102 d.update(((u"\0", 0),)):TypeError:('expected string without null bytes',)
3103 d.update((("\0", 0),)):TypeError:('expected string without null bytes',)
3104 <<< Finished
3105 >>> Testing StringToChars using d.update((("a", {%s : 1}),))
3106 d.update((("a", {1 : 1}),)):TypeError:('expected str() or unicode() instance, but got int',)
3107 d.update((("a", {u"\0" : 1}),)):TypeError:('expected string without null bytes',)
3108 d.update((("a", {"\0" : 1}),)):TypeError:('expected string without null bytes',)
3109 <<< Finished
3110 >>> Testing StringToChars using d.update((("a", {"abcF" : {%s : 1}}),))
3111 d.update((("a", {"abcF" : {1 : 1}}),)):TypeError:('expected str() or unicode() instance, but got int',)
3112 d.update((("a", {"abcF" : {u"\0" : 1}}),)):TypeError:('expected string without null bytes',)
3113 d.update((("a", {"abcF" : {"\0" : 1}}),)):TypeError:('expected string without null bytes',)
3114 <<< Finished
3115 >>> Testing StringToChars using d.update((("a", {"abcF" : Mapping({%s : 1})}),))
3116 d.update((("a", {"abcF" : Mapping({1 : 1})}),)):TypeError:('expected str() or unicode() instance, but got int',)
3117 d.update((("a", {"abcF" : Mapping({u"\0" : 1})}),)):TypeError:('expected string without null bytes',)
3118 d.update((("a", {"abcF" : Mapping({"\0" : 1})}),)):TypeError:('expected string without null bytes',)
3119 <<< Finished
3120 >>> Testing *Iter* using d.update((("a", {"abcF" : %s}),))
3121 d.update((("a", {"abcF" : FailingIter()}),)):TypeError:('unable to convert FailingIter to a Vim structure',)
3122 d.update((("a", {"abcF" : FailingIterNext()}),)):NotImplementedError:('next',)
3123 <<< Finished
3124 >>> Testing ConvertFromPyObject using d.update((("a", {"abcF" : %s}),))
3125 d.update((("a", {"abcF" : None}),)):error:("failed to add key 'a' to dictionary",)
3126 d.update((("a", {"abcF" : {"": 1}}),)):ValueError:('empty keys are not allowed',)
3127 d.update((("a", {"abcF" : {u"": 1}}),)):ValueError:('empty keys are not allowed',)
3128 d.update((("a", {"abcF" : FailingMapping()}),)):NotImplementedError:('keys',)
3129 d.update((("a", {"abcF" : FailingMappingKey()}),)):NotImplementedError:('getitem:mappingkey',)
3130 d.update((("a", {"abcF" : FailingNumber()}),)):TypeError:('long() argument must be a string or a number',)
3131 <<< Finished
3132 >>> Testing StringToChars using d.update((("a", Mapping({%s : 1})),))
3133 d.update((("a", Mapping({1 : 1})),)):TypeError:('expected str() or unicode() instance, but got int',)
3134 d.update((("a", Mapping({u"\0" : 1})),)):TypeError:('expected string without null bytes',)
3135 d.update((("a", Mapping({"\0" : 1})),)):TypeError:('expected string without null bytes',)
3136 <<< Finished
3137 >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : {%s : 1}})),))
3138 d.update((("a", Mapping({"abcG" : {1 : 1}})),)):TypeError:('expected str() or unicode() instance, but got int',)
3139 d.update((("a", Mapping({"abcG" : {u"\0" : 1}})),)):TypeError:('expected string without null bytes',)
3140 d.update((("a", Mapping({"abcG" : {"\0" : 1}})),)):TypeError:('expected string without null bytes',)
3141 <<< Finished
3142 >>> Testing StringToChars using d.update((("a", Mapping({"abcG" : Mapping({%s : 1})})),))
3143 d.update((("a", Mapping({"abcG" : Mapping({1 : 1})})),)):TypeError:('expected str() or unicode() instance, but got int',)
3144 d.update((("a", Mapping({"abcG" : Mapping({u"\0" : 1})})),)):TypeError:('expected string without null bytes',)
3145 d.update((("a", Mapping({"abcG" : Mapping({"\0" : 1})})),)):TypeError:('expected string without null bytes',)
3146 <<< Finished
3147 >>> Testing *Iter* using d.update((("a", Mapping({"abcG" : %s})),))
3148 d.update((("a", Mapping({"abcG" : FailingIter()})),)):TypeError:('unable to convert FailingIter to a Vim structure',)
3149 d.update((("a", Mapping({"abcG" : FailingIterNext()})),)):NotImplementedError:('next',)
3150 <<< Finished
3151 >>> Testing ConvertFromPyObject using d.update((("a", Mapping({"abcG" : %s})),))
3152 d.update((("a", Mapping({"abcG" : None})),)):error:("failed to add key 'a' to dictionary",)
3153 d.update((("a", Mapping({"abcG" : {"": 1}})),)):ValueError:('empty keys are not allowed',)
3154 d.update((("a", Mapping({"abcG" : {u"": 1}})),)):ValueError:('empty keys are not allowed',)
3155 d.update((("a", Mapping({"abcG" : FailingMapping()})),)):NotImplementedError:('keys',)
3156 d.update((("a", Mapping({"abcG" : FailingMappingKey()})),)):NotImplementedError:('getitem:mappingkey',)
3157 d.update((("a", Mapping({"abcG" : FailingNumber()})),)):TypeError:('long() argument must be a string or a number',)
3158 <<< Finished
3159 >>> Testing *Iter* using d.update((("a", %s),))
3160 d.update((("a", FailingIter()),)):TypeError:('unable to convert FailingIter to a Vim structure',)
3161 d.update((("a", FailingIterNext()),)):NotImplementedError:('next',)
3162 <<< Finished
3163 >>> Testing ConvertFromPyObject using d.update((("a", %s),))
3164 d.update((("a", None),)):error:("failed to add key 'a' to dictionary",)
3165 d.update((("a", {"": 1}),)):ValueError:('empty keys are not allowed',)
3166 d.update((("a", {u"": 1}),)):ValueError:('empty keys are not allowed',)
3167 d.update((("a", FailingMapping()),)):NotImplementedError:('keys',)
3168 d.update((("a", FailingMappingKey()),)):NotImplementedError:('getitem:mappingkey',)
3169 d.update((("a", FailingNumber()),)):TypeError:('long() argument must be a string or a number',)
3170 <<< Finished
3171 >> DictionaryPopItem
3172 d.popitem(1, 2):TypeError:('popitem() takes no arguments (2 given)',)
3173 >> DictionaryHasKey
3174 d.has_key():TypeError:('has_key() takes exactly one argument (0 given)',)
3175 > List
3176 >> ListConstructor
3177 vim.List(1, 2):TypeError:('function takes at most 1 argument (2 given)',)
3178 vim.List(a=1):TypeError:('list constructor does not accept keyword arguments',)
3179 >>> Testing *Iter* using vim.List(%s)
3180 vim.List(FailingIter()):NotImplementedError:('iter',)
3181 vim.List(FailingIterNext()):NotImplementedError:('next',)
3182 <<< Finished
3183 >>> Testing StringToChars using vim.List([{%s : 1}])
3184 vim.List([{1 : 1}]):TypeError:('expected str() or unicode() instance, but got int',)
3185 vim.List([{u"\0" : 1}]):TypeError:('expected string without null bytes',)
3186 vim.List([{"\0" : 1}]):TypeError:('expected string without null bytes',)
3187 <<< Finished
3188 >>> Testing StringToChars using vim.List([{"abcF" : {%s : 1}}])
3189 vim.List([{"abcF" : {1 : 1}}]):TypeError:('expected str() or unicode() instance, but got int',)
3190 vim.List([{"abcF" : {u"\0" : 1}}]):TypeError:('expected string without null bytes',)
3191 vim.List([{"abcF" : {"\0" : 1}}]):TypeError:('expected string without null bytes',)
3192 <<< Finished
3193 >>> Testing StringToChars using vim.List([{"abcF" : Mapping({%s : 1})}])
3194 vim.List([{"abcF" : Mapping({1 : 1})}]):TypeError:('expected str() or unicode() instance, but got int',)
3195 vim.List([{"abcF" : Mapping({u"\0" : 1})}]):TypeError:('expected string without null bytes',)
3196 vim.List([{"abcF" : Mapping({"\0" : 1})}]):TypeError:('expected string without null bytes',)
3197 <<< Finished
3198 >>> Testing *Iter* using vim.List([{"abcF" : %s}])
3199 vim.List([{"abcF" : FailingIter()}]):TypeError:('unable to convert FailingIter to a Vim structure',)
3200 vim.List([{"abcF" : FailingIterNext()}]):NotImplementedError:('next',)
3201 <<< Finished
3202 >>> Testing ConvertFromPyObject using vim.List([{"abcF" : %s}])
3203 vim.List([{"abcF" : None}]):NOT FAILED
3204 vim.List([{"abcF" : {"": 1}}]):ValueError:('empty keys are not allowed',)
3205 vim.List([{"abcF" : {u"": 1}}]):ValueError:('empty keys are not allowed',)
3206 vim.List([{"abcF" : FailingMapping()}]):NotImplementedError:('keys',)
3207 vim.List([{"abcF" : FailingMappingKey()}]):NotImplementedError:('getitem:mappingkey',)
3208 vim.List([{"abcF" : FailingNumber()}]):TypeError:('long() argument must be a string or a number',)
3209 <<< Finished
3210 >>> Testing StringToChars using vim.List([Mapping({%s : 1})])
3211 vim.List([Mapping({1 : 1})]):TypeError:('expected str() or unicode() instance, but got int',)
3212 vim.List([Mapping({u"\0" : 1})]):TypeError:('expected string without null bytes',)
3213 vim.List([Mapping({"\0" : 1})]):TypeError:('expected string without null bytes',)
3214 <<< Finished
3215 >>> Testing StringToChars using vim.List([Mapping({"abcG" : {%s : 1}})])
3216 vim.List([Mapping({"abcG" : {1 : 1}})]):TypeError:('expected str() or unicode() instance, but got int',)
3217 vim.List([Mapping({"abcG" : {u"\0" : 1}})]):TypeError:('expected string without null bytes',)
3218 vim.List([Mapping({"abcG" : {"\0" : 1}})]):TypeError:('expected string without null bytes',)
3219 <<< Finished
3220 >>> Testing StringToChars using vim.List([Mapping({"abcG" : Mapping({%s : 1})})])
3221 vim.List([Mapping({"abcG" : Mapping({1 : 1})})]):TypeError:('expected str() or unicode() instance, but got int',)
3222 vim.List([Mapping({"abcG" : Mapping({u"\0" : 1})})]):TypeError:('expected string without null bytes',)
3223 vim.List([Mapping({"abcG" : Mapping({"\0" : 1})})]):TypeError:('expected string without null bytes',)
3224 <<< Finished
3225 >>> Testing *Iter* using vim.List([Mapping({"abcG" : %s})])
3226 vim.List([Mapping({"abcG" : FailingIter()})]):TypeError:('unable to convert FailingIter to a Vim structure',)
3227 vim.List([Mapping({"abcG" : FailingIterNext()})]):NotImplementedError:('next',)
3228 <<< Finished
3229 >>> Testing ConvertFromPyObject using vim.List([Mapping({"abcG" : %s})])
3230 vim.List([Mapping({"abcG" : None})]):NOT FAILED
3231 vim.List([Mapping({"abcG" : {"": 1}})]):ValueError:('empty keys are not allowed',)
3232 vim.List([Mapping({"abcG" : {u"": 1}})]):ValueError:('empty keys are not allowed',)
3233 vim.List([Mapping({"abcG" : FailingMapping()})]):NotImplementedError:('keys',)
3234 vim.List([Mapping({"abcG" : FailingMappingKey()})]):NotImplementedError:('getitem:mappingkey',)
3235 vim.List([Mapping({"abcG" : FailingNumber()})]):TypeError:('long() argument must be a string or a number',)
3236 <<< Finished
3237 >>> Testing *Iter* using vim.List([%s])
3238 vim.List([FailingIter()]):TypeError:('unable to convert FailingIter to a Vim structure',)
3239 vim.List([FailingIterNext()]):NotImplementedError:('next',)
3240 <<< Finished
3241 >>> Testing ConvertFromPyObject using vim.List([%s])
3242 vim.List([None]):NOT FAILED
3243 vim.List([{"": 1}]):ValueError:('empty keys are not allowed',)
3244 vim.List([{u"": 1}]):ValueError:('empty keys are not allowed',)
3245 vim.List([FailingMapping()]):NotImplementedError:('keys',)
3246 vim.List([FailingMappingKey()]):NotImplementedError:('getitem:mappingkey',)
3247 vim.List([FailingNumber()]):TypeError:('long() argument must be a string or a number',)
3248 <<< Finished
3249 >> ListItem
3250 l[1000]:IndexError:('list index out of range',)
3251 >> ListAssItem
3252 ll[1] = 2:error:('list is locked',)
3253 l[1000] = 3:IndexError:('list index out of range',)
3254 >> ListAssSlice
3255 ll[1:100] = "abcJ":error:('list is locked',)
3256 >>> Testing *Iter* using l[:] = %s
3257 l[:] = FailingIter():NotImplementedError:('iter',)
3258 l[:] = FailingIterNext():NotImplementedError:('next',)
3259 <<< Finished
3260 nel[1:10:2] = "abcK":ValueError:('attempt to assign sequence of size greater than 2 to extended slice',)
3261 ('a', 'b', 'c', 'O')
3262 nel[1:10:2] = "a":ValueError:('attempt to assign sequence of size 1 to extended slice of size 2',)
3263 ('a', 'b', 'c', 'O')
3264 nel[1:1:-1] = "a":ValueError:('attempt to assign sequence of size greater than 0 to extended slice',)
3265 ('a', 'b', 'c', 'O')
3266 nel[:] = FailingIterNextN(2):NotImplementedError:('next N',)
3267 ('a', 'b', 'c', 'O')
3268 >>> Testing StringToChars using l[:] = [{%s : 1}]
3269 l[:] = [{1 : 1}]:TypeError:('expected str() or unicode() instance, but got int',)
3270 l[:] = [{u"\0" : 1}]:TypeError:('expected string without null bytes',)
3271 l[:] = [{"\0" : 1}]:TypeError:('expected string without null bytes',)
3272 <<< Finished
3273 >>> Testing StringToChars using l[:] = [{"abcF" : {%s : 1}}]
3274 l[:] = [{"abcF" : {1 : 1}}]:TypeError:('expected str() or unicode() instance, but got int',)
3275 l[:] = [{"abcF" : {u"\0" : 1}}]:TypeError:('expected string without null bytes',)
3276 l[:] = [{"abcF" : {"\0" : 1}}]:TypeError:('expected string without null bytes',)
3277 <<< Finished
3278 >>> Testing StringToChars using l[:] = [{"abcF" : Mapping({%s : 1})}]
3279 l[:] = [{"abcF" : Mapping({1 : 1})}]:TypeError:('expected str() or unicode() instance, but got int',)
3280 l[:] = [{"abcF" : Mapping({u"\0" : 1})}]:TypeError:('expected string without null bytes',)
3281 l[:] = [{"abcF" : Mapping({"\0" : 1})}]:TypeError:('expected string without null bytes',)
3282 <<< Finished
3283 >>> Testing *Iter* using l[:] = [{"abcF" : %s}]
3284 l[:] = [{"abcF" : FailingIter()}]:TypeError:('unable to convert FailingIter to a Vim structure',)
3285 l[:] = [{"abcF" : FailingIterNext()}]:NotImplementedError:('next',)
3286 <<< Finished
3287 >>> Testing ConvertFromPyObject using l[:] = [{"abcF" : %s}]
3288 l[:] = [{"abcF" : None}]:NOT FAILED
3289 l[:] = [{"abcF" : {"": 1}}]:ValueError:('empty keys are not allowed',)
3290 l[:] = [{"abcF" : {u"": 1}}]:ValueError:('empty keys are not allowed',)
3291 l[:] = [{"abcF" : FailingMapping()}]:NotImplementedError:('keys',)
3292 l[:] = [{"abcF" : FailingMappingKey()}]:NotImplementedError:('getitem:mappingkey',)
3293 l[:] = [{"abcF" : FailingNumber()}]:TypeError:('long() argument must be a string or a number',)
3294 <<< Finished
3295 >>> Testing StringToChars using l[:] = [Mapping({%s : 1})]
3296 l[:] = [Mapping({1 : 1})]:TypeError:('expected str() or unicode() instance, but got int',)
3297 l[:] = [Mapping({u"\0" : 1})]:TypeError:('expected string without null bytes',)
3298 l[:] = [Mapping({"\0" : 1})]:TypeError:('expected string without null bytes',)
3299 <<< Finished
3300 >>> Testing StringToChars using l[:] = [Mapping({"abcG" : {%s : 1}})]
3301 l[:] = [Mapping({"abcG" : {1 : 1}})]:TypeError:('expected str() or unicode() instance, but got int',)
3302 l[:] = [Mapping({"abcG" : {u"\0" : 1}})]:TypeError:('expected string without null bytes',)
3303 l[:] = [Mapping({"abcG" : {"\0" : 1}})]:TypeError:('expected string without null bytes',)
3304 <<< Finished
3305 >>> Testing StringToChars using l[:] = [Mapping({"abcG" : Mapping({%s : 1})})]
3306 l[:] = [Mapping({"abcG" : Mapping({1 : 1})})]:TypeError:('expected str() or unicode() instance, but got int',)
3307 l[:] = [Mapping({"abcG" : Mapping({u"\0" : 1})})]:TypeError:('expected string without null bytes',)
3308 l[:] = [Mapping({"abcG" : Mapping({"\0" : 1})})]:TypeError:('expected string without null bytes',)
3309 <<< Finished
3310 >>> Testing *Iter* using l[:] = [Mapping({"abcG" : %s})]
3311 l[:] = [Mapping({"abcG" : FailingIter()})]:TypeError:('unable to convert FailingIter to a Vim structure',)
3312 l[:] = [Mapping({"abcG" : FailingIterNext()})]:NotImplementedError:('next',)
3313 <<< Finished
3314 >>> Testing ConvertFromPyObject using l[:] = [Mapping({"abcG" : %s})]
3315 l[:] = [Mapping({"abcG" : None})]:NOT FAILED
3316 l[:] = [Mapping({"abcG" : {"": 1}})]:ValueError:('empty keys are not allowed',)
3317 l[:] = [Mapping({"abcG" : {u"": 1}})]:ValueError:('empty keys are not allowed',)
3318 l[:] = [Mapping({"abcG" : FailingMapping()})]:NotImplementedError:('keys',)
3319 l[:] = [Mapping({"abcG" : FailingMappingKey()})]:NotImplementedError:('getitem:mappingkey',)
3320 l[:] = [Mapping({"abcG" : FailingNumber()})]:TypeError:('long() argument must be a string or a number',)
3321 <<< Finished
3322 >>> Testing *Iter* using l[:] = [%s]
3323 l[:] = [FailingIter()]:TypeError:('unable to convert FailingIter to a Vim structure',)
3324 l[:] = [FailingIterNext()]:NotImplementedError:('next',)
3325 <<< Finished
3326 >>> Testing ConvertFromPyObject using l[:] = [%s]
3327 l[:] = [None]:NOT FAILED
3328 l[:] = [{"": 1}]:ValueError:('empty keys are not allowed',)
3329 l[:] = [{u"": 1}]:ValueError:('empty keys are not allowed',)
3330 l[:] = [FailingMapping()]:NotImplementedError:('keys',)
3331 l[:] = [FailingMappingKey()]:NotImplementedError:('getitem:mappingkey',)
3332 l[:] = [FailingNumber()]:TypeError:('long() argument must be a string or a number',)
3333 <<< Finished
3334 >> ListConcatInPlace
3335 >>> Testing *Iter* using l.extend(%s)
3336 l.extend(FailingIter()):NotImplementedError:('iter',)
3337 l.extend(FailingIterNext()):NotImplementedError:('next',)
3338 <<< Finished
3339 >>> Testing StringToChars using l.extend([{%s : 1}])
3340 l.extend([{1 : 1}]):TypeError:('expected str() or unicode() instance, but got int',)
3341 l.extend([{u"\0" : 1}]):TypeError:('expected string without null bytes',)
3342 l.extend([{"\0" : 1}]):TypeError:('expected string without null bytes',)
3343 <<< Finished
3344 >>> Testing StringToChars using l.extend([{"abcF" : {%s : 1}}])
3345 l.extend([{"abcF" : {1 : 1}}]):TypeError:('expected str() or unicode() instance, but got int',)
3346 l.extend([{"abcF" : {u"\0" : 1}}]):TypeError:('expected string without null bytes',)
3347 l.extend([{"abcF" : {"\0" : 1}}]):TypeError:('expected string without null bytes',)
3348 <<< Finished
3349 >>> Testing StringToChars using l.extend([{"abcF" : Mapping({%s : 1})}])
3350 l.extend([{"abcF" : Mapping({1 : 1})}]):TypeError:('expected str() or unicode() instance, but got int',)
3351 l.extend([{"abcF" : Mapping({u"\0" : 1})}]):TypeError:('expected string without null bytes',)
3352 l.extend([{"abcF" : Mapping({"\0" : 1})}]):TypeError:('expected string without null bytes',)
3353 <<< Finished
3354 >>> Testing *Iter* using l.extend([{"abcF" : %s}])
3355 l.extend([{"abcF" : FailingIter()}]):TypeError:('unable to convert FailingIter to a Vim structure',)
3356 l.extend([{"abcF" : FailingIterNext()}]):NotImplementedError:('next',)
3357 <<< Finished
3358 >>> Testing ConvertFromPyObject using l.extend([{"abcF" : %s}])
3359 l.extend([{"abcF" : None}]):NOT FAILED
3360 l.extend([{"abcF" : {"": 1}}]):ValueError:('empty keys are not allowed',)
3361 l.extend([{"abcF" : {u"": 1}}]):ValueError:('empty keys are not allowed',)
3362 l.extend([{"abcF" : FailingMapping()}]):NotImplementedError:('keys',)
3363 l.extend([{"abcF" : FailingMappingKey()}]):NotImplementedError:('getitem:mappingkey',)
3364 l.extend([{"abcF" : FailingNumber()}]):TypeError:('long() argument must be a string or a number',)
3365 <<< Finished
3366 >>> Testing StringToChars using l.extend([Mapping({%s : 1})])
3367 l.extend([Mapping({1 : 1})]):TypeError:('expected str() or unicode() instance, but got int',)
3368 l.extend([Mapping({u"\0" : 1})]):TypeError:('expected string without null bytes',)
3369 l.extend([Mapping({"\0" : 1})]):TypeError:('expected string without null bytes',)
3370 <<< Finished
3371 >>> Testing StringToChars using l.extend([Mapping({"abcG" : {%s : 1}})])
3372 l.extend([Mapping({"abcG" : {1 : 1}})]):TypeError:('expected str() or unicode() instance, but got int',)
3373 l.extend([Mapping({"abcG" : {u"\0" : 1}})]):TypeError:('expected string without null bytes',)
3374 l.extend([Mapping({"abcG" : {"\0" : 1}})]):TypeError:('expected string without null bytes',)
3375 <<< Finished
3376 >>> Testing StringToChars using l.extend([Mapping({"abcG" : Mapping({%s : 1})})])
3377 l.extend([Mapping({"abcG" : Mapping({1 : 1})})]):TypeError:('expected str() or unicode() instance, but got int',)
3378 l.extend([Mapping({"abcG" : Mapping({u"\0" : 1})})]):TypeError:('expected string without null bytes',)
3379 l.extend([Mapping({"abcG" : Mapping({"\0" : 1})})]):TypeError:('expected string without null bytes',)
3380 <<< Finished
3381 >>> Testing *Iter* using l.extend([Mapping({"abcG" : %s})])
3382 l.extend([Mapping({"abcG" : FailingIter()})]):TypeError:('unable to convert FailingIter to a Vim structure',)
3383 l.extend([Mapping({"abcG" : FailingIterNext()})]):NotImplementedError:('next',)
3384 <<< Finished
3385 >>> Testing ConvertFromPyObject using l.extend([Mapping({"abcG" : %s})])
3386 l.extend([Mapping({"abcG" : None})]):NOT FAILED
3387 l.extend([Mapping({"abcG" : {"": 1}})]):ValueError:('empty keys are not allowed',)
3388 l.extend([Mapping({"abcG" : {u"": 1}})]):ValueError:('empty keys are not allowed',)
3389 l.extend([Mapping({"abcG" : FailingMapping()})]):NotImplementedError:('keys',)
3390 l.extend([Mapping({"abcG" : FailingMappingKey()})]):NotImplementedError:('getitem:mappingkey',)
3391 l.extend([Mapping({"abcG" : FailingNumber()})]):TypeError:('long() argument must be a string or a number',)
3392 <<< Finished
3393 >>> Testing *Iter* using l.extend([%s])
3394 l.extend([FailingIter()]):TypeError:('unable to convert FailingIter to a Vim structure',)
3395 l.extend([FailingIterNext()]):NotImplementedError:('next',)
3396 <<< Finished
3397 >>> Testing ConvertFromPyObject using l.extend([%s])
3398 l.extend([None]):NOT FAILED
3399 l.extend([{"": 1}]):ValueError:('empty keys are not allowed',)
3400 l.extend([{u"": 1}]):ValueError:('empty keys are not allowed',)
3401 l.extend([FailingMapping()]):NotImplementedError:('keys',)
3402 l.extend([FailingMappingKey()]):NotImplementedError:('getitem:mappingkey',)
3403 l.extend([FailingNumber()]):TypeError:('long() argument must be a string or a number',)
3404 <<< Finished
3405 >> ListSetattr
3406 del l.locked:AttributeError:('cannot delete vim.List attributes',)
3407 l.locked = FailingTrue():NotImplementedError:('bool',)
3408 l.xxx = True:AttributeError:('cannot set attribute xxx',)
3409 > Function
3410 >> FunctionConstructor
3411 >>> FunctionConstructor
3412 vim.Function("123"):ValueError:('unnamed function 123 does not exist',)
3413 vim.Function("xxx_non_existent_function_xxx"):ValueError:('function xxx_non_existent_function_xxx does not exist',)
3414 vim.Function("xxx#non#existent#function#xxx"):NOT FAILED
3415 vim.Function("xxx_non_existent_function_xxx2", args=[]):ValueError:('function xxx_non_existent_function_xxx2 does not exist',)
3416 vim.Function("xxx_non_existent_function_xxx3", self={}):ValueError:('function xxx_non_existent_function_xxx3 does not exist',)
3417 vim.Function("xxx_non_existent_function_xxx4", args=[], self={}):ValueError:('function xxx_non_existent_function_xxx4 does not exist',)
3418 >>> FunctionNew
3419 vim.Function("tr", self="abcFuncSelf"):TypeError:('unable to convert str to a Vim dictionary',)
3420 vim.Function("tr", args=427423):TypeError:('unable to convert int to a Vim list',)
3421 vim.Function("tr", self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
3422 vim.Function(self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
3423 vim.Function("tr", "", self="abcFuncSelf2", args="abcFuncArgs2"):TypeError:('unable to convert str to a Vim dictionary',)
3424 vim.Function("tr", ""):TypeError:('function takes exactly 1 argument (2 given)',)
3425 >> FunctionCall
3426 >>> Testing StringToChars using f({%s : 1})
3427 f({1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
3428 f({u"\0" : 1}):TypeError:('expected string without null bytes',)
3429 f({"\0" : 1}):TypeError:('expected string without null bytes',)
3430 <<< Finished
3431 >>> Testing StringToChars using f({"abcF" : {%s : 1}})
3432 f({"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
3433 f({"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
3434 f({"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3435 <<< Finished
3436 >>> Testing StringToChars using f({"abcF" : Mapping({%s : 1})})
3437 f({"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3438 f({"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3439 f({"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3440 <<< Finished
3441 >>> Testing *Iter* using f({"abcF" : %s})
3442 f({"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3443 f({"abcF" : FailingIterNext()}):NotImplementedError:('next',)
3444 <<< Finished
3445 >>> Testing ConvertFromPyObject using f({"abcF" : %s})
3446 f({"abcF" : None}):NOT FAILED
3447 f({"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
3448 f({"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3449 f({"abcF" : FailingMapping()}):NotImplementedError:('keys',)
3450 f({"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3451 f({"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3452 <<< Finished
3453 >>> Testing StringToChars using f(Mapping({%s : 1}))
3454 f(Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
3455 f(Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
3456 f(Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
3457 <<< Finished
3458 >>> Testing StringToChars using f(Mapping({"abcG" : {%s : 1}}))
3459 f(Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
3460 f(Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
3461 f(Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
3462 <<< Finished
3463 >>> Testing StringToChars using f(Mapping({"abcG" : Mapping({%s : 1})}))
3464 f(Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
3465 f(Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
3466 f(Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
3467 <<< Finished
3468 >>> Testing *Iter* using f(Mapping({"abcG" : %s}))
3469 f(Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
3470 f(Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
3471 <<< Finished
3472 >>> Testing ConvertFromPyObject using f(Mapping({"abcG" : %s}))
3473 f(Mapping({"abcG" : None})):NOT FAILED
3474 f(Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
3475 f(Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
3476 f(Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
3477 f(Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
3478 f(Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
3479 <<< Finished
3480 >>> Testing *Iter* using f(%s)
3481 f(FailingIter()):TypeError:('unable to convert FailingIter to a Vim structure',)
3482 f(FailingIterNext()):NotImplementedError:('next',)
3483 <<< Finished
3484 >>> Testing ConvertFromPyObject using f(%s)
3485 f(None):NOT FAILED
3486 f({"": 1}):ValueError:('empty keys are not allowed',)
3487 f({u"": 1}):ValueError:('empty keys are not allowed',)
3488 f(FailingMapping()):NotImplementedError:('keys',)
3489 f(FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
3490 f(FailingNumber()):TypeError:('long() argument must be a string or a number',)
3491 <<< Finished
3492 >>> Testing StringToChars using fd(self={%s : 1})
3493 fd(self={1 : 1}):TypeError:('expected str() or unicode() instance, but got int',)
3494 fd(self={u"\0" : 1}):TypeError:('expected string without null bytes',)
3495 fd(self={"\0" : 1}):TypeError:('expected string without null bytes',)
3496 <<< Finished
3497 >>> Testing StringToChars using fd(self={"abcF" : {%s : 1}})
3498 fd(self={"abcF" : {1 : 1}}):TypeError:('expected str() or unicode() instance, but got int',)
3499 fd(self={"abcF" : {u"\0" : 1}}):TypeError:('expected string without null bytes',)
3500 fd(self={"abcF" : {"\0" : 1}}):TypeError:('expected string without null bytes',)
3501 <<< Finished
3502 >>> Testing StringToChars using fd(self={"abcF" : Mapping({%s : 1})})
3503 fd(self={"abcF" : Mapping({1 : 1})}):TypeError:('expected str() or unicode() instance, but got int',)
3504 fd(self={"abcF" : Mapping({u"\0" : 1})}):TypeError:('expected string without null bytes',)
3505 fd(self={"abcF" : Mapping({"\0" : 1})}):TypeError:('expected string without null bytes',)
3506 <<< Finished
3507 >>> Testing *Iter* using fd(self={"abcF" : %s})
3508 fd(self={"abcF" : FailingIter()}):TypeError:('unable to convert FailingIter to a Vim structure',)
3509 fd(self={"abcF" : FailingIterNext()}):NotImplementedError:('next',)
3510 <<< Finished
3511 >>> Testing ConvertFromPyObject using fd(self={"abcF" : %s})
3512 fd(self={"abcF" : None}):NOT FAILED
3513 fd(self={"abcF" : {"": 1}}):ValueError:('empty keys are not allowed',)
3514 fd(self={"abcF" : {u"": 1}}):ValueError:('empty keys are not allowed',)
3515 fd(self={"abcF" : FailingMapping()}):NotImplementedError:('keys',)
3516 fd(self={"abcF" : FailingMappingKey()}):NotImplementedError:('getitem:mappingkey',)
3517 fd(self={"abcF" : FailingNumber()}):TypeError:('long() argument must be a string or a number',)
3518 <<< Finished
3519 >>> Testing StringToChars using fd(self=Mapping({%s : 1}))
3520 fd(self=Mapping({1 : 1})):TypeError:('expected str() or unicode() instance, but got int',)
3521 fd(self=Mapping({u"\0" : 1})):TypeError:('expected string without null bytes',)
3522 fd(self=Mapping({"\0" : 1})):TypeError:('expected string without null bytes',)
3523 <<< Finished
3524 >>> Testing StringToChars using fd(self=Mapping({"abcG" : {%s : 1}}))
3525 fd(self=Mapping({"abcG" : {1 : 1}})):TypeError:('expected str() or unicode() instance, but got int',)
3526 fd(self=Mapping({"abcG" : {u"\0" : 1}})):TypeError:('expected string without null bytes',)
3527 fd(self=Mapping({"abcG" : {"\0" : 1}})):TypeError:('expected string without null bytes',)
3528 <<< Finished
3529 >>> Testing StringToChars using fd(self=Mapping({"abcG" : Mapping({%s : 1})}))
3530 fd(self=Mapping({"abcG" : Mapping({1 : 1})})):TypeError:('expected str() or unicode() instance, but got int',)
3531 fd(self=Mapping({"abcG" : Mapping({u"\0" : 1})})):TypeError:('expected string without null bytes',)
3532 fd(self=Mapping({"abcG" : Mapping({"\0" : 1})})):TypeError:('expected string without null bytes',)
3533 <<< Finished
3534 >>> Testing *Iter* using fd(self=Mapping({"abcG" : %s}))
3535 fd(self=Mapping({"abcG" : FailingIter()})):TypeError:('unable to convert FailingIter to a Vim structure',)
3536 fd(self=Mapping({"abcG" : FailingIterNext()})):NotImplementedError:('next',)
3537 <<< Finished
3538 >>> Testing ConvertFromPyObject using fd(self=Mapping({"abcG" : %s}))
3539 fd(self=Mapping({"abcG" : None})):NOT FAILED
3540 fd(self=Mapping({"abcG" : {"": 1}})):ValueError:('empty keys are not allowed',)
3541 fd(self=Mapping({"abcG" : {u"": 1}})):ValueError:('empty keys are not allowed',)
3542 fd(self=Mapping({"abcG" : FailingMapping()})):NotImplementedError:('keys',)
3543 fd(self=Mapping({"abcG" : FailingMappingKey()})):NotImplementedError:('getitem:mappingkey',)
3544 fd(self=Mapping({"abcG" : FailingNumber()})):TypeError:('long() argument must be a string or a number',)
3545 <<< Finished
3546 >>> Testing *Iter* using fd(self=%s)
3547 fd(self=FailingIter()):TypeError:('unable to convert FailingIter to a Vim dictionary',)
3548 fd(self=FailingIterNext()):TypeError:('unable to convert FailingIterNext to a Vim dictionary',)
3549 <<< Finished
3550 >>> Testing ConvertFromPyObject using fd(self=%s)
3551 fd(self=None):TypeError:('unable to convert NoneType to a Vim dictionary',)
3552 fd(self={"": 1}):ValueError:('empty keys are not allowed',)
3553 fd(self={u"": 1}):ValueError:('empty keys are not allowed',)
3554 fd(self=FailingMapping()):NotImplementedError:('keys',)
3555 fd(self=FailingMappingKey()):NotImplementedError:('getitem:mappingkey',)
3556 fd(self=FailingNumber()):TypeError:('unable to convert FailingNumber to a Vim dictionary',)
3557 <<< Finished
3558 >>> Testing ConvertFromPyMapping using fd(self=%s)
3559 fd(self=[]):TypeError:('unable to convert list to a Vim dictionary',)
3560 <<< Finished
3561 > TabPage
3562 >> TabPageAttr
3563 vim.current.tabpage.xxx:AttributeError:('xxx',)
3564 > TabList
3565 >> TabListItem
3566 vim.tabpages[1000]:IndexError:('no such tab page',)
3567 > Window
3568 >> WindowAttr
3569 vim.current.window.xxx:AttributeError:('xxx',)
3570 >> WindowSetattr
3571 vim.current.window.buffer = 0:TypeError:('readonly attribute: buffer',)
3572 vim.current.window.cursor = (100000000, 100000000):error:('cursor position outside buffer',)
3573 vim.current.window.cursor = True:TypeError:('argument must be 2-item sequence, not bool',)
3574 >>> Testing NumberToLong using vim.current.window.height = %s
3575 vim.current.window.height = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
3576 vim.current.window.height = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
3577 vim.current.window.height = -1:ValueError:('number must be greater or equal to zero',)
3578 <<< Finished
3579 >>> Testing NumberToLong using vim.current.window.width = %s
3580 vim.current.window.width = []:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
3581 vim.current.window.width = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
3582 vim.current.window.width = -1:ValueError:('number must be greater or equal to zero',)
3583 <<< Finished
3584 vim.current.window.xxxxxx = True:AttributeError:('xxxxxx',)
3585 > WinList
3586 >> WinListItem
3587 vim.windows[1000]:IndexError:('no such window',)
3588 > Buffer
3589 >> StringToLine (indirect)
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02003590 vim.current.buffer[0] = "\na":error:('string cannot contain newlines',)
Bram Moolenaarab589462020-07-06 21:03:06 +02003591 vim.current.buffer[0] = u"\na":error:('string cannot contain newlines',)
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02003592 >> SetBufferLine (indirect)
3593 vim.current.buffer[0] = True:TypeError:('bad argument type for built-in operation',)
3594 >> SetBufferLineList (indirect)
3595 vim.current.buffer[:] = True:TypeError:('bad argument type for built-in operation',)
3596 vim.current.buffer[:] = ["\na", "bc"]:error:('string cannot contain newlines',)
3597 >> InsertBufferLines (indirect)
3598 vim.current.buffer.append(None):TypeError:('bad argument type for built-in operation',)
3599 vim.current.buffer.append(["\na", "bc"]):error:('string cannot contain newlines',)
3600 vim.current.buffer.append("\nbc"):error:('string cannot contain newlines',)
3601 >> RBItem
3602 vim.current.buffer[100000000]:IndexError:('line number out of range',)
3603 >> RBAsItem
3604 vim.current.buffer[100000000] = "":IndexError:('line number out of range',)
3605 >> BufferAttr
3606 vim.current.buffer.xxx:AttributeError:('xxx',)
3607 >> BufferSetattr
3608 vim.current.buffer.name = True:TypeError:('expected str() or unicode() instance, but got bool',)
3609 vim.current.buffer.xxx = True:AttributeError:('xxx',)
3610 >> BufferMark
3611 vim.current.buffer.mark(0):TypeError:('expected str() or unicode() instance, but got int',)
3612 vim.current.buffer.mark("abcM"):ValueError:('mark name must be a single character',)
3613 vim.current.buffer.mark("!"):error:('invalid mark name',)
3614 >> BufferRange
3615 vim.current.buffer.range(1, 2, 3):TypeError:('function takes exactly 2 arguments (3 given)',)
3616 > BufMap
3617 >> BufMapItem
3618 vim.buffers[100000000]:KeyError:(100000000,)
3619 >>> Testing NumberToLong using vim.buffers[%s]
3620 vim.buffers[[]]:TypeError:('expected int(), long() or something supporting coercing to long(), but got list',)
3621 vim.buffers[None]:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
3622 vim.buffers[-1]:ValueError:('number must be greater than zero',)
3623 vim.buffers[0]:ValueError:('number must be greater than zero',)
3624 <<< Finished
3625 > Current
3626 >> CurrentGetattr
3627 vim.current.xxx:AttributeError:('xxx',)
3628 >> CurrentSetattr
3629 vim.current.line = True:TypeError:('bad argument type for built-in operation',)
3630 vim.current.buffer = True:TypeError:('expected vim.Buffer object, but got bool',)
3631 vim.current.window = True:TypeError:('expected vim.Window object, but got bool',)
3632 vim.current.tabpage = True:TypeError:('expected vim.TabPage object, but got bool',)
3633 vim.current.xxx = True:AttributeError:('xxx',)
3634 END
3635
3636 call assert_equal(expected, getline(2, '$'))
3637 close!
3638endfunc
3639
3640" Test import
3641func Test_python_import()
3642 new
3643 py cb = vim.current.buffer
3644
3645 py << trim EOF
3646 sys.path.insert(0, os.path.join(os.getcwd(), 'python_before'))
3647 sys.path.append(os.path.join(os.getcwd(), 'python_after'))
3648 vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\')
3649 l = []
3650 def callback(path):
3651 l.append(path[-len('/testdir'):].replace(os.path.sep, '/'))
3652 vim.foreach_rtp(callback)
3653 cb.append(repr(l))
3654 del l
3655 def callback(path):
3656 return path[-len('/testdir'):].replace(os.path.sep, '/')
3657 cb.append(repr(vim.foreach_rtp(callback)))
3658 del callback
3659 from module import dir as d
3660 from modulex import ddir
3661 cb.append(d + ',' + ddir)
3662 import before
3663 cb.append(before.dir)
3664 import after
3665 cb.append(after.dir)
3666 import topmodule as tm
3667 import topmodule.submodule as tms
3668 import topmodule.submodule.subsubmodule.subsubsubmodule as tmsss
3669 cb.append(tm.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/__init__.py'):])
3670 cb.append(tms.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/__init__.py'):])
3671 cb.append(tmsss.__file__.replace('.pyc', '.py').replace(os.path.sep, '/')[-len('modulex/topmodule/submodule/subsubmodule/subsubsubmodule.py'):])
Bram Moolenaarab589462020-07-06 21:03:06 +02003672
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02003673 del before
3674 del after
3675 del d
3676 del ddir
3677 del tm
3678 del tms
3679 del tmsss
3680 EOF
3681
3682 let expected =<< trim END
3683 ['/testdir']
3684 '/testdir'
3685 2,xx
3686 before
3687 after
3688 pythonx/topmodule/__init__.py
3689 pythonx/topmodule/submodule/__init__.py
3690 pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py
3691 END
3692 call assert_equal(expected, getline(2, '$'))
3693 close!
Bram Moolenaarab589462020-07-06 21:03:06 +02003694
Bram Moolenaar8e7d6222020-12-18 19:49:56 +01003695 " Try to import a non-existing module with a dot (.)
Bram Moolenaarab589462020-07-06 21:03:06 +02003696 call AssertException(['py import a.b.c'], 'ImportError:')
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02003697endfunc
3698
3699" Test exceptions
3700func Test_python_exception()
Bram Moolenaarab589462020-07-06 21:03:06 +02003701 func Exe(e)
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02003702 execute a:e
Bram Moolenaarab589462020-07-06 21:03:06 +02003703 endfunc
Bram Moolenaar92fdd1e2020-07-03 18:00:05 +02003704
3705 new
3706 py cb = vim.current.buffer
3707
3708 py << trim EOF
3709 Exe = vim.bindeval('function("Exe")')
3710 ee('vim.command("throw \'abcN\'")')
3711 ee('Exe("throw \'def\'")')
3712 ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
3713 ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
3714 ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
3715 ee('vim.eval("xxx_unknown_function_xxx()")')
3716 ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
3717 del Exe
3718 EOF
3719 delfunction Exe
3720
3721 let expected =<< trim END
3722 vim.command("throw 'abcN'"):error:('abcN',)
3723 Exe("throw 'def'"):error:('def',)
3724 vim.eval("Exe('throw ''ghi''')"):error:('ghi',)
3725 vim.eval("Exe('echoerr ''jkl''')"):error:('Vim(echoerr):jkl',)
3726 vim.eval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)
3727 vim.eval("xxx_unknown_function_xxx()"):error:('Vim:E117: Unknown function: xxx_unknown_function_xxx',)
3728 vim.bindeval("Exe('xxx_non_existent_command_xxx')"):error:('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',)
3729 END
3730 call assert_equal(expected, getline(2, '$'))
3731 close!
3732endfunc
3733
3734" Regression: interrupting vim.command propagates to next vim.command
3735func Test_python_keyboard_interrupt()
3736 new
3737 py cb = vim.current.buffer
3738 py << trim EOF
3739 def test_keyboard_interrupt():
3740 try:
3741 vim.command('while 1 | endwhile')
3742 except KeyboardInterrupt:
3743 cb.append('Caught KeyboardInterrupt')
3744 except Exception:
3745 cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
3746 else:
3747 cb.append('!!!!!!!! No exception')
3748 try:
3749 vim.command('$ put =\'Running :put\'')
3750 except KeyboardInterrupt:
3751 cb.append('!!!!!!!! Caught KeyboardInterrupt')
3752 except Exception:
3753 cb.append('!!!!!!!! Caught exception: ' + emsg(sys.exc_info()))
3754 else:
3755 cb.append('No exception')
3756 EOF
3757
3758 debuggreedy
3759 call inputsave()
3760 call feedkeys("s\ns\ns\ns\nq\n")
3761 redir => output
3762 debug silent! py test_keyboard_interrupt()
3763 redir END
3764 0 debuggreedy
3765 call inputrestore()
3766 py del test_keyboard_interrupt
3767
3768 let expected =<< trim END
3769 Caught KeyboardInterrupt
3770 Running :put
3771 No exception
3772 END
3773 call assert_equal(expected, getline(2, '$'))
3774 call assert_equal('', output)
3775 close!
3776endfunc
3777
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +02003778" vim: shiftwidth=2 sts=2 expandtab