153901442SBram Moolenaar" Test for python 3 commands. 2213ed008SBram Moolenaar" TODO: move tests from test87.in here. 3a58883b4SBram Moolenaar 4b46fecd3SBram Moolenaarsource check.vim 5b46fecd3SBram MoolenaarCheckFeature python3 6a58883b4SBram Moolenaar 7a58883b4SBram Moolenaarfunc Test_py3do() 8a58883b4SBram Moolenaar " Check deleting lines does not trigger an ml_get error. 9a58883b4SBram Moolenaar py3 import vim 10a58883b4SBram Moolenaar new 11a58883b4SBram Moolenaar call setline(1, ['one', 'two', 'three']) 12a58883b4SBram Moolenaar py3do vim.command("%d_") 13a58883b4SBram Moolenaar bwipe! 14a58883b4SBram Moolenaar 15a58883b4SBram Moolenaar " Check switching to another buffer does not trigger an ml_get error. 16a58883b4SBram Moolenaar new 17a58883b4SBram Moolenaar let wincount = winnr('$') 18a58883b4SBram Moolenaar call setline(1, ['one', 'two', 'three']) 19a58883b4SBram Moolenaar py3do vim.command("new") 20a58883b4SBram Moolenaar call assert_equal(wincount + 1, winnr('$')) 21a58883b4SBram Moolenaar bwipe! 22a58883b4SBram Moolenaar bwipe! 23a58883b4SBram Moolenaarendfunc 2453901442SBram Moolenaar 2553901442SBram Moolenaarfunc Test_set_cursor() 2653901442SBram Moolenaar " Check that setting the cursor position works. 2753901442SBram Moolenaar py3 import vim 2853901442SBram Moolenaar new 2953901442SBram Moolenaar call setline(1, ['first line', 'second line']) 3053901442SBram Moolenaar normal gg 3153901442SBram Moolenaar py3do vim.current.window.cursor = (1, 5) 3253901442SBram Moolenaar call assert_equal([1, 6], [line('.'), col('.')]) 3353901442SBram Moolenaar 3453901442SBram Moolenaar " Check that movement after setting cursor position keeps current column. 3553901442SBram Moolenaar normal j 3653901442SBram Moolenaar call assert_equal([2, 6], [line('.'), col('.')]) 3753901442SBram Moolenaarendfunc 389123c0b3SBram Moolenaar 399123c0b3SBram Moolenaarfunc Test_vim_function() 409123c0b3SBram Moolenaar " Check creating vim.Function object 419123c0b3SBram Moolenaar py3 import vim 429123c0b3SBram Moolenaar 439123c0b3SBram Moolenaar func s:foo() 449123c0b3SBram Moolenaar return matchstr(expand('<sfile>'), '<SNR>\zs\d\+_foo$') 459123c0b3SBram Moolenaar endfunc 469123c0b3SBram Moolenaar let name = '<SNR>' . s:foo() 479123c0b3SBram Moolenaar 489123c0b3SBram Moolenaar try 499123c0b3SBram Moolenaar py3 f = vim.bindeval('function("s:foo")') 509123c0b3SBram Moolenaar call assert_equal(name, py3eval('f.name')) 519123c0b3SBram Moolenaar catch 529123c0b3SBram Moolenaar call assert_false(v:exception) 539123c0b3SBram Moolenaar endtry 549123c0b3SBram Moolenaar 559123c0b3SBram Moolenaar try 569123c0b3SBram Moolenaar py3 f = vim.Function(b'\x80\xfdR' + vim.eval('s:foo()').encode()) 573f4f3d8eSBram Moolenaar call assert_equal(name, 'f.name'->py3eval()) 589123c0b3SBram Moolenaar catch 599123c0b3SBram Moolenaar call assert_false(v:exception) 609123c0b3SBram Moolenaar endtry 619123c0b3SBram Moolenaar 629123c0b3SBram Moolenaar py3 del f 639123c0b3SBram Moolenaar delfunc s:foo 649123c0b3SBram Moolenaarendfunc 6514816ad6SBram Moolenaar 6614816ad6SBram Moolenaarfunc Test_skipped_python3_command_does_not_affect_pyxversion() 6714816ad6SBram Moolenaar set pyxversion=0 6814816ad6SBram Moolenaar if 0 6914816ad6SBram Moolenaar python3 import vim 7014816ad6SBram Moolenaar endif 7114816ad6SBram Moolenaar call assert_equal(0, &pyxversion) " This assertion would have failed with Vim 8.0.0251. (pyxversion was introduced in 8.0.0251.) 7214816ad6SBram Moolenaarendfunc 7363dbfd33SBram Moolenaar 7463dbfd33SBram Moolenaarfunc _SetUpHiddenBuffer() 7563dbfd33SBram Moolenaar py3 import vim 7663dbfd33SBram Moolenaar new 7763dbfd33SBram Moolenaar edit hidden 7863dbfd33SBram Moolenaar setlocal bufhidden=hide 7963dbfd33SBram Moolenaar 8063dbfd33SBram Moolenaar enew 8163dbfd33SBram Moolenaar let lnum = 0 8263dbfd33SBram Moolenaar while lnum < 10 8363dbfd33SBram Moolenaar call append( 1, string( lnum ) ) 8463dbfd33SBram Moolenaar let lnum = lnum + 1 8563dbfd33SBram Moolenaar endwhile 8663dbfd33SBram Moolenaar normal G 8763dbfd33SBram Moolenaar 8863dbfd33SBram Moolenaar call assert_equal( line( '.' ), 11 ) 8963dbfd33SBram Moolenaarendfunc 9063dbfd33SBram Moolenaar 91bfd36036SBram Moolenaarfunc _CleanUpHiddenBuffer() 92bfd36036SBram Moolenaar bwipe! hidden 93bfd36036SBram Moolenaar bwipe! 94bfd36036SBram Moolenaarendfunc 95bfd36036SBram Moolenaar 9663dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Clear() 9763dbfd33SBram Moolenaar call _SetUpHiddenBuffer() 9863dbfd33SBram Moolenaar py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = None 9963dbfd33SBram Moolenaar call assert_equal( line( '.' ), 11 ) 100bfd36036SBram Moolenaar call _CleanUpHiddenBuffer() 10163dbfd33SBram Moolenaarendfunc 10263dbfd33SBram Moolenaar 10363dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_List() 10463dbfd33SBram Moolenaar call _SetUpHiddenBuffer() 10563dbfd33SBram Moolenaar py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][:] = [ 'test' ] 10663dbfd33SBram Moolenaar call assert_equal( line( '.' ), 11 ) 107bfd36036SBram Moolenaar call _CleanUpHiddenBuffer() 10863dbfd33SBram Moolenaarendfunc 10963dbfd33SBram Moolenaar 11063dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_Str() 11163dbfd33SBram Moolenaar call _SetUpHiddenBuffer() 11263dbfd33SBram Moolenaar py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = 'test' 11363dbfd33SBram Moolenaar call assert_equal( line( '.' ), 11 ) 114bfd36036SBram Moolenaar call _CleanUpHiddenBuffer() 11563dbfd33SBram Moolenaarendfunc 11663dbfd33SBram Moolenaar 11763dbfd33SBram Moolenaarfunc Test_Write_To_HiddenBuffer_Does_Not_Fix_Cursor_ClearLine() 11863dbfd33SBram Moolenaar call _SetUpHiddenBuffer() 11963dbfd33SBram Moolenaar py3 vim.buffers[ int( vim.eval( 'bufnr("hidden")' ) ) ][0] = None 12063dbfd33SBram Moolenaar call assert_equal( line( '.' ), 11 ) 121bfd36036SBram Moolenaar call _CleanUpHiddenBuffer() 12263dbfd33SBram Moolenaarendfunc 12363dbfd33SBram Moolenaar 12463dbfd33SBram Moolenaarfunc _SetUpVisibleBuffer() 12563dbfd33SBram Moolenaar py3 import vim 12663dbfd33SBram Moolenaar new 12763dbfd33SBram Moolenaar let lnum = 0 12863dbfd33SBram Moolenaar while lnum < 10 12963dbfd33SBram Moolenaar call append( 1, string( lnum ) ) 13063dbfd33SBram Moolenaar let lnum = lnum + 1 13163dbfd33SBram Moolenaar endwhile 13263dbfd33SBram Moolenaar normal G 13363dbfd33SBram Moolenaar call assert_equal( line( '.' ), 11 ) 13463dbfd33SBram Moolenaarendfunc 13563dbfd33SBram Moolenaar 13663dbfd33SBram Moolenaarfunc Test_Write_To_Current_Buffer_Fixes_Cursor_Clear() 13763dbfd33SBram Moolenaar call _SetUpVisibleBuffer() 13863dbfd33SBram Moolenaar 13963dbfd33SBram Moolenaar py3 vim.current.buffer[:] = None 14063dbfd33SBram Moolenaar call assert_equal( line( '.' ), 1 ) 14163dbfd33SBram Moolenaar 14263dbfd33SBram Moolenaar bwipe! 14363dbfd33SBram Moolenaarendfunc 14463dbfd33SBram Moolenaar 14563dbfd33SBram Moolenaarfunc Test_Write_To_Current_Buffer_Fixes_Cursor_List() 14663dbfd33SBram Moolenaar call _SetUpVisibleBuffer() 14763dbfd33SBram Moolenaar 14863dbfd33SBram Moolenaar py3 vim.current.buffer[:] = [ 'test' ] 14963dbfd33SBram Moolenaar call assert_equal( line( '.' ), 1 ) 15063dbfd33SBram Moolenaar 15163dbfd33SBram Moolenaar bwipe! 15263dbfd33SBram Moolenaarendfunction 15363dbfd33SBram Moolenaar 15463dbfd33SBram Moolenaarfunc Test_Write_To_Current_Buffer_Fixes_Cursor_Str() 15563dbfd33SBram Moolenaar call _SetUpVisibleBuffer() 15663dbfd33SBram Moolenaar 15763dbfd33SBram Moolenaar py3 vim.current.buffer[-1] = None 15863dbfd33SBram Moolenaar call assert_equal( line( '.' ), 10 ) 15963dbfd33SBram Moolenaar 16063dbfd33SBram Moolenaar bwipe! 16163dbfd33SBram Moolenaarendfunction 1627f3a2849SBram Moolenaar 1637f3a2849SBram Moolenaarfunc Test_Catch_Exception_Message() 1647f3a2849SBram Moolenaar try 1657f3a2849SBram Moolenaar py3 raise RuntimeError( 'TEST' ) 1667f3a2849SBram Moolenaar catch /.*/ 1677f3a2849SBram Moolenaar call assert_match( '^Vim(.*):RuntimeError: TEST$', v:exception ) 1687f3a2849SBram Moolenaar endtry 1697f3a2849SBram Moolenaarendfunc 170556684ffSBram Moolenaar 171556684ffSBram Moolenaarfunc Test_unicode() 172556684ffSBram Moolenaar " this crashed Vim once 1732466aea5SBram Moolenaar if &tenc != '' 1742466aea5SBram Moolenaar throw "Skipped: 'termencoding' is not empty" 1752466aea5SBram Moolenaar endif 1764b7cdca2SBram Moolenaar 177556684ffSBram Moolenaar set encoding=utf32 178556684ffSBram Moolenaar py3 print('hello') 1794b7cdca2SBram Moolenaar 180955f4e6fSBram Moolenaar if !has('win32') 181d518f952SBram Moolenaar set encoding=debug 182d518f952SBram Moolenaar py3 print('hello') 1834b7cdca2SBram Moolenaar 184d518f952SBram Moolenaar set encoding=euc-tw 185d518f952SBram Moolenaar py3 print('hello') 1867fc4785eSBram Moolenaar endif 1874b7cdca2SBram Moolenaar 188556684ffSBram Moolenaar set encoding=utf8 189556684ffSBram Moolenaarendfunc 190904edabbSBram Moolenaar 191026270c0SBram Moolenaar" Test vim.eval() with various types. 192026270c0SBram Moolenaarfunc Test_python3_vim_val() 193026270c0SBram Moolenaar call assert_equal("\n8", execute('py3 print(vim.eval("3+5"))')) 194026270c0SBram Moolenaar if has('float') 195026270c0SBram Moolenaar call assert_equal("\n3.140000", execute('py3 print(vim.eval("1.01+2.13"))')) 196026270c0SBram Moolenaar call assert_equal("\n0.000000", execute('py3 print(vim.eval("0.0/(1.0/0.0)"))')) 197026270c0SBram Moolenaar call assert_equal("\n0.000000", execute('py3 print(vim.eval("0.0/(1.0/0.0)"))')) 198026270c0SBram Moolenaar call assert_equal("\n-0.000000", execute('py3 print(vim.eval("0.0/(-1.0/0.0)"))')) 199026270c0SBram Moolenaar " Commented out: output of infinity and nan depend on platforms. 200026270c0SBram Moolenaar " call assert_equal("\ninf", execute('py3 print(vim.eval("1.0/0.0"))')) 201026270c0SBram Moolenaar " call assert_equal("\n-inf", execute('py3 print(vim.eval("-1.0/0.0"))')) 202026270c0SBram Moolenaar " call assert_equal("\n-nan", execute('py3 print(vim.eval("0.0/0.0"))')) 203026270c0SBram Moolenaar endif 204026270c0SBram Moolenaar call assert_equal("\nabc", execute('py3 print(vim.eval("\"abc\""))')) 205026270c0SBram Moolenaar call assert_equal("\n['1', '2']", execute('py3 print(vim.eval("[1, 2]"))')) 206026270c0SBram Moolenaar call assert_equal("\n{'1': '2'}", execute('py3 print(vim.eval("{1:2}"))')) 207026270c0SBram Moolenaar call assert_equal("\nTrue", execute('py3 print(vim.eval("v:true"))')) 208026270c0SBram Moolenaar call assert_equal("\nFalse", execute('py3 print(vim.eval("v:false"))')) 209026270c0SBram Moolenaar call assert_equal("\nNone", execute('py3 print(vim.eval("v:null"))')) 210026270c0SBram Moolenaar call assert_equal("\nNone", execute('py3 print(vim.eval("v:none"))')) 211026270c0SBram Moolenaar call assert_equal("\nb'\\xab\\x12'", execute('py3 print(vim.eval("0zab12"))')) 212026270c0SBram Moolenaar 213026270c0SBram Moolenaar call assert_fails('py3 vim.eval("1+")', 'vim.error: invalid expression') 214026270c0SBram Moolenaarendfunc 215026270c0SBram Moolenaar 216904edabbSBram Moolenaar" Test range objects, see :help python-range 21750985eb1SBram Moolenaarfunc Test_python3_range() 218904edabbSBram Moolenaar new 219904edabbSBram Moolenaar py3 b = vim.current.buffer 220904edabbSBram Moolenaar 221904edabbSBram Moolenaar call setline(1, range(1, 6)) 222904edabbSBram Moolenaar py3 r = b.range(2, 4) 223904edabbSBram Moolenaar call assert_equal(6, py3eval('len(b)')) 224904edabbSBram Moolenaar call assert_equal(3, py3eval('len(r)')) 225904edabbSBram Moolenaar call assert_equal('3', py3eval('b[2]')) 226904edabbSBram Moolenaar call assert_equal('4', py3eval('r[2]')) 227904edabbSBram Moolenaar 228904edabbSBram Moolenaar call assert_fails('py3 r[3] = "x"', 'IndexError: line number out of range') 229904edabbSBram Moolenaar call assert_fails('py3 x = r[3]', 'IndexError: line number out of range') 230904edabbSBram Moolenaar call assert_fails('py3 r["a"] = "x"', 'TypeError') 231904edabbSBram Moolenaar call assert_fails('py3 x = r["a"]', 'TypeError') 232904edabbSBram Moolenaar 233904edabbSBram Moolenaar py3 del r[:] 234904edabbSBram Moolenaar call assert_equal(['1', '5', '6'], getline(1, '$')) 235904edabbSBram Moolenaar 236904edabbSBram Moolenaar %d | call setline(1, range(1, 6)) 237904edabbSBram Moolenaar py3 r = b.range(2, 5) 238904edabbSBram Moolenaar py3 del r[2] 239904edabbSBram Moolenaar call assert_equal(['1', '2', '3', '5', '6'], getline(1, '$')) 240904edabbSBram Moolenaar 241904edabbSBram Moolenaar %d | call setline(1, range(1, 6)) 242904edabbSBram Moolenaar py3 r = b.range(2, 4) 243904edabbSBram Moolenaar py3 vim.command("%d,%dnorm Ax" % (r.start + 1, r.end + 1)) 244904edabbSBram Moolenaar call assert_equal(['1', '2x', '3x', '4x', '5', '6'], getline(1, '$')) 245904edabbSBram Moolenaar 246904edabbSBram Moolenaar %d | call setline(1, range(1, 4)) 247904edabbSBram Moolenaar py3 r = b.range(2, 3) 248904edabbSBram Moolenaar py3 r.append(['a', 'b']) 249904edabbSBram Moolenaar call assert_equal(['1', '2', '3', 'a', 'b', '4'], getline(1, '$')) 250904edabbSBram Moolenaar py3 r.append(['c', 'd'], 0) 251904edabbSBram Moolenaar call assert_equal(['1', 'c', 'd', '2', '3', 'a', 'b', '4'], getline(1, '$')) 252904edabbSBram Moolenaar 253904edabbSBram Moolenaar %d | call setline(1, range(1, 5)) 254904edabbSBram Moolenaar py3 r = b.range(2, 4) 255904edabbSBram Moolenaar py3 r.append('a') 256904edabbSBram Moolenaar call assert_equal(['1', '2', '3', '4', 'a', '5'], getline(1, '$')) 257904edabbSBram Moolenaar py3 r.append('b', 1) 258904edabbSBram Moolenaar call assert_equal(['1', '2', 'b', '3', '4', 'a', '5'], getline(1, '$')) 259904edabbSBram Moolenaar 260904edabbSBram Moolenaar bwipe! 261904edabbSBram Moolenaarendfunc 262*1363a30cSBram Moolenaar 263*1363a30cSBram Moolenaar" Test for resetting options with local values to global values 264*1363a30cSBram Moolenaarfunc Test_python3_opt_reset_local_to_global() 265*1363a30cSBram Moolenaar new 266*1363a30cSBram Moolenaar 267*1363a30cSBram Moolenaar py3 curbuf = vim.current.buffer 268*1363a30cSBram Moolenaar py3 curwin = vim.current.window 269*1363a30cSBram Moolenaar 270*1363a30cSBram Moolenaar " List of buffer-local options. Each list item has [option name, global 271*1363a30cSBram Moolenaar " value, buffer-local value, buffer-local value after reset] to use in the 272*1363a30cSBram Moolenaar " test. 273*1363a30cSBram Moolenaar let bopts = [ 274*1363a30cSBram Moolenaar \ ['autoread', 1, 0, -1], 275*1363a30cSBram Moolenaar \ ['equalprg', 'geprg', 'leprg', ''], 276*1363a30cSBram Moolenaar \ ['keywordprg', 'gkprg', 'lkprg', ''], 277*1363a30cSBram Moolenaar \ ['path', 'gpath', 'lpath', ''], 278*1363a30cSBram Moolenaar \ ['backupcopy', 'yes', 'no', ''], 279*1363a30cSBram Moolenaar \ ['tags', 'gtags', 'ltags', ''], 280*1363a30cSBram Moolenaar \ ['tagcase', 'ignore', 'match', ''], 281*1363a30cSBram Moolenaar \ ['define', 'gdef', 'ldef', ''], 282*1363a30cSBram Moolenaar \ ['include', 'ginc', 'linc', ''], 283*1363a30cSBram Moolenaar \ ['dict', 'gdict', 'ldict', ''], 284*1363a30cSBram Moolenaar \ ['thesaurus', 'gtsr', 'ltsr', ''], 285*1363a30cSBram Moolenaar \ ['formatprg', 'gfprg', 'lfprg', ''], 286*1363a30cSBram Moolenaar \ ['errorformat', '%f:%l:%m', '%s-%l-%m', ''], 287*1363a30cSBram Moolenaar \ ['grepprg', 'ggprg', 'lgprg', ''], 288*1363a30cSBram Moolenaar \ ['makeprg', 'gmprg', 'lmprg', ''], 289*1363a30cSBram Moolenaar \ ['balloonexpr', 'gbexpr', 'lbexpr', ''], 290*1363a30cSBram Moolenaar \ ['cryptmethod', 'blowfish2', 'zip', ''], 291*1363a30cSBram Moolenaar \ ['lispwords', 'abc', 'xyz', ''], 292*1363a30cSBram Moolenaar \ ['makeencoding', 'utf-8', 'latin1', ''], 293*1363a30cSBram Moolenaar \ ['undolevels', 100, 200, -123456]] 294*1363a30cSBram Moolenaar 295*1363a30cSBram Moolenaar " Set the global and buffer-local option values and then clear the 296*1363a30cSBram Moolenaar " buffer-local option value. 297*1363a30cSBram Moolenaar for opt in bopts 298*1363a30cSBram Moolenaar py3 pyopt = vim.bindeval("opt") 299*1363a30cSBram Moolenaar py3 vim.options[pyopt[0]] = pyopt[1] 300*1363a30cSBram Moolenaar py3 curbuf.options[pyopt[0]] = pyopt[2] 301*1363a30cSBram Moolenaar exe "call assert_equal(opt[2], &" .. opt[0] .. ")" 302*1363a30cSBram Moolenaar exe "call assert_equal(opt[1], &g:" .. opt[0] .. ")" 303*1363a30cSBram Moolenaar exe "call assert_equal(opt[2], &l:" .. opt[0] .. ")" 304*1363a30cSBram Moolenaar py3 del curbuf.options[pyopt[0]] 305*1363a30cSBram Moolenaar exe "call assert_equal(opt[1], &" .. opt[0] .. ")" 306*1363a30cSBram Moolenaar exe "call assert_equal(opt[1], &g:" .. opt[0] .. ")" 307*1363a30cSBram Moolenaar exe "call assert_equal(opt[3], &l:" .. opt[0] .. ")" 308*1363a30cSBram Moolenaar exe "set " .. opt[0] .. "&" 309*1363a30cSBram Moolenaar endfor 310*1363a30cSBram Moolenaar 311*1363a30cSBram Moolenaar " Set the global and window-local option values and then clear the 312*1363a30cSBram Moolenaar " window-local option value. 313*1363a30cSBram Moolenaar let wopts = [ 314*1363a30cSBram Moolenaar \ ['scrolloff', 5, 10, -1], 315*1363a30cSBram Moolenaar \ ['sidescrolloff', 6, 12, -1], 316*1363a30cSBram Moolenaar \ ['statusline', '%<%f', '%<%F', '']] 317*1363a30cSBram Moolenaar for opt in wopts 318*1363a30cSBram Moolenaar py3 pyopt = vim.bindeval("opt") 319*1363a30cSBram Moolenaar py3 vim.options[pyopt[0]] = pyopt[1] 320*1363a30cSBram Moolenaar py3 curwin.options[pyopt[0]] = pyopt[2] 321*1363a30cSBram Moolenaar exe "call assert_equal(opt[2], &" .. opt[0] .. ")" 322*1363a30cSBram Moolenaar exe "call assert_equal(opt[1], &g:" .. opt[0] .. ")" 323*1363a30cSBram Moolenaar exe "call assert_equal(opt[2], &l:" .. opt[0] .. ")" 324*1363a30cSBram Moolenaar py3 del curwin.options[pyopt[0]] 325*1363a30cSBram Moolenaar exe "call assert_equal(opt[1], &" .. opt[0] .. ")" 326*1363a30cSBram Moolenaar exe "call assert_equal(opt[1], &g:" .. opt[0] .. ")" 327*1363a30cSBram Moolenaar exe "call assert_equal(opt[3], &l:" .. opt[0] .. ")" 328*1363a30cSBram Moolenaar exe "set " .. opt[0] .. "&" 329*1363a30cSBram Moolenaar endfor 330*1363a30cSBram Moolenaar 331*1363a30cSBram Moolenaar close! 332*1363a30cSBram Moolenaarendfunc 333*1363a30cSBram Moolenaar 334*1363a30cSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 335