145e18cbdSBram Moolenaar" Test 'tagfunc' 245e18cbdSBram Moolenaar 345e18cbdSBram Moolenaarfunc TagFunc(pat, flag, info) 445e18cbdSBram Moolenaar let g:tagfunc_args = [a:pat, a:flag, a:info] 545e18cbdSBram Moolenaar let tags = [] 645e18cbdSBram Moolenaar for num in range(1,10) 745e18cbdSBram Moolenaar let tags += [{ 845e18cbdSBram Moolenaar \ 'cmd': '2', 'name': 'nothing'.num, 'kind': 'm', 945e18cbdSBram Moolenaar \ 'filename': 'Xfile1', 'user_data': 'somedata'.num, 1045e18cbdSBram Moolenaar \}] 1145e18cbdSBram Moolenaar endfor 1245e18cbdSBram Moolenaar return tags 1345e18cbdSBram Moolenaarendfunc 1445e18cbdSBram Moolenaar 1545e18cbdSBram Moolenaarfunc Test_tagfunc() 1645e18cbdSBram Moolenaar set tagfunc=TagFunc 1745e18cbdSBram Moolenaar new Xfile1 1845e18cbdSBram Moolenaar call setline(1, ['empty', 'one()', 'empty']) 1945e18cbdSBram Moolenaar write 2045e18cbdSBram Moolenaar 2145e18cbdSBram Moolenaar call assert_equal({'cmd': '2', 'static': 0, 2245e18cbdSBram Moolenaar \ 'name': 'nothing2', 'user_data': 'somedata2', 2345e18cbdSBram Moolenaar \ 'kind': 'm', 'filename': 'Xfile1'}, taglist('.')[1]) 2445e18cbdSBram Moolenaar 2545e18cbdSBram Moolenaar call settagstack(win_getid(), {'items': []}) 2645e18cbdSBram Moolenaar 2745e18cbdSBram Moolenaar tag arbitrary 2845e18cbdSBram Moolenaar call assert_equal('arbitrary', g:tagfunc_args[0]) 2945e18cbdSBram Moolenaar call assert_equal('', g:tagfunc_args[1]) 3045e18cbdSBram Moolenaar call assert_equal('somedata1', gettagstack().items[0].user_data) 3145e18cbdSBram Moolenaar 5tag arbitrary 3245e18cbdSBram Moolenaar call assert_equal('arbitrary', g:tagfunc_args[0]) 3345e18cbdSBram Moolenaar call assert_equal('', g:tagfunc_args[1]) 3445e18cbdSBram Moolenaar call assert_equal('somedata5', gettagstack().items[1].user_data) 3545e18cbdSBram Moolenaar pop 3645e18cbdSBram Moolenaar tag 3745e18cbdSBram Moolenaar call assert_equal('arbitrary', g:tagfunc_args[0]) 3845e18cbdSBram Moolenaar call assert_equal('', g:tagfunc_args[1]) 3945e18cbdSBram Moolenaar call assert_equal('somedata5', gettagstack().items[1].user_data) 4045e18cbdSBram Moolenaar 4145e18cbdSBram Moolenaar let g:tagfunc_args=[] 4245e18cbdSBram Moolenaar execute "normal! \<c-]>" 4345e18cbdSBram Moolenaar call assert_equal('one', g:tagfunc_args[0]) 4445e18cbdSBram Moolenaar call assert_equal('c', g:tagfunc_args[1]) 4545e18cbdSBram Moolenaar 46*f90c855cSBram Moolenaar let g:tagfunc_args=[] 47*f90c855cSBram Moolenaar execute "tag /foo$" 48*f90c855cSBram Moolenaar call assert_equal('foo$', g:tagfunc_args[0]) 49*f90c855cSBram Moolenaar call assert_equal('r', g:tagfunc_args[1]) 50*f90c855cSBram Moolenaar 5145e18cbdSBram Moolenaar set cpt=t 5245e18cbdSBram Moolenaar let g:tagfunc_args=[] 5345e18cbdSBram Moolenaar execute "normal! i\<c-n>\<c-y>" 54*f90c855cSBram Moolenaar call assert_equal('\<\k\k', g:tagfunc_args[0]) 55*f90c855cSBram Moolenaar call assert_equal('cir', g:tagfunc_args[1]) 5645e18cbdSBram Moolenaar call assert_equal('nothing1', getline('.')[0:7]) 5745e18cbdSBram Moolenaar 58*f90c855cSBram Moolenaar let g:tagfunc_args=[] 59*f90c855cSBram Moolenaar execute "normal! ono\<c-n>\<c-n>\<c-y>" 60*f90c855cSBram Moolenaar call assert_equal('\<no', g:tagfunc_args[0]) 61*f90c855cSBram Moolenaar call assert_equal('cir', g:tagfunc_args[1]) 62*f90c855cSBram Moolenaar call assert_equal('nothing2', getline('.')[0:7]) 63*f90c855cSBram Moolenaar 6445e18cbdSBram Moolenaar func BadTagFunc1(...) 6545e18cbdSBram Moolenaar return 0 6645e18cbdSBram Moolenaar endfunc 6745e18cbdSBram Moolenaar func BadTagFunc2(...) 6845e18cbdSBram Moolenaar return [1] 6945e18cbdSBram Moolenaar endfunc 7045e18cbdSBram Moolenaar func BadTagFunc3(...) 7145e18cbdSBram Moolenaar return [{'name': 'foo'}] 7245e18cbdSBram Moolenaar endfunc 7345e18cbdSBram Moolenaar 7445e18cbdSBram Moolenaar for &tagfunc in ['BadTagFunc1', 'BadTagFunc2', 'BadTagFunc3'] 7545e18cbdSBram Moolenaar try 7645e18cbdSBram Moolenaar tag nothing 7745e18cbdSBram Moolenaar call assert_false(1, 'tag command should have failed') 7845e18cbdSBram Moolenaar catch 7945e18cbdSBram Moolenaar call assert_exception('E987:') 8045e18cbdSBram Moolenaar endtry 8145e18cbdSBram Moolenaar exe 'delf' &tagfunc 8245e18cbdSBram Moolenaar endfor 8345e18cbdSBram Moolenaar 8445e18cbdSBram Moolenaar func NullTagFunc(...) 8545e18cbdSBram Moolenaar return v:null 8645e18cbdSBram Moolenaar endfunc 8745e18cbdSBram Moolenaar set tags= tfu=NullTagFunc 88e2e4075fSBram Moolenaar call assert_fails('tag nothing', 'E433:') 8945e18cbdSBram Moolenaar delf NullTagFunc 9045e18cbdSBram Moolenaar 9145e18cbdSBram Moolenaar bwipe! 9245e18cbdSBram Moolenaar set tags& tfu& cpt& 9345e18cbdSBram Moolenaar call delete('Xfile1') 9445e18cbdSBram Moolenaarendfunc 9545e18cbdSBram Moolenaar 96830c1afcSBram Moolenaar" Test for modifying the tag stack from a tag function and jumping to a tag 97830c1afcSBram Moolenaar" from a tag function 98830c1afcSBram Moolenaarfunc Test_tagfunc_settagstack() 99830c1afcSBram Moolenaar func Mytagfunc1(pat, flags, info) 100830c1afcSBram Moolenaar call settagstack(1, {'tagname' : 'mytag', 'from' : [0, 10, 1, 0]}) 101830c1afcSBram Moolenaar return [{'name' : 'mytag', 'filename' : 'Xtest', 'cmd' : '1'}] 102830c1afcSBram Moolenaar endfunc 103830c1afcSBram Moolenaar set tagfunc=Mytagfunc1 104830c1afcSBram Moolenaar call writefile([''], 'Xtest') 105830c1afcSBram Moolenaar call assert_fails('tag xyz', 'E986:') 106830c1afcSBram Moolenaar 107830c1afcSBram Moolenaar func Mytagfunc2(pat, flags, info) 108830c1afcSBram Moolenaar tag test_tag 109830c1afcSBram Moolenaar return [{'name' : 'mytag', 'filename' : 'Xtest', 'cmd' : '1'}] 110830c1afcSBram Moolenaar endfunc 111830c1afcSBram Moolenaar set tagfunc=Mytagfunc2 112830c1afcSBram Moolenaar call assert_fails('tag xyz', 'E986:') 113830c1afcSBram Moolenaar 114830c1afcSBram Moolenaar call delete('Xtest') 115830c1afcSBram Moolenaar set tagfunc& 116830c1afcSBram Moolenaar delfunc Mytagfunc1 117830c1afcSBram Moolenaar delfunc Mytagfunc2 118830c1afcSBram Moolenaarendfunc 119830c1afcSBram Moolenaar 12045e18cbdSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 121