1" Test for cscope commands. 2 3source check.vim 4CheckFeature cscope 5CheckFeature quickfix 6CheckExecutable cscope 7 8func CscopeSetupOrClean(setup) 9 if a:setup 10 noa sp ../memfile_test.c 11 saveas! Xmemfile_test.c 12 call system('cscope -bk -fXcscope.out Xmemfile_test.c') 13 call system('cscope -bk -fXcscope2.out Xmemfile_test.c') 14 cscope add Xcscope.out 15 set cscopequickfix=s-,g-,d-,c-,t-,e-,f-,i-,a- 16 else 17 cscope kill -1 18 for file in ['Xcscope.out', 'Xcscope2.out', 'Xmemfile_test.c'] 19 call delete(file) 20 endfo 21 endif 22endfunc 23 24func Test_cscopeWithCscopeConnections() 25 call CscopeSetupOrClean(1) 26 " Test: E568: duplicate cscope database not added 27 try 28 set nocscopeverbose 29 cscope add Xcscope.out 30 set cscopeverbose 31 catch 32 call assert_report('exception thrown') 33 endtry 34 call assert_fails('cscope add', 'E560') 35 call assert_fails('cscope add Xcscope.out', 'E568') 36 call assert_fails('cscope add doesnotexist.out', 'E563') 37 if has('unix') 38 call assert_fails('cscope add /dev/null', 'E564:') 39 endif 40 41 " Test: Find this C-Symbol 42 for cmd in ['cs find s main', 'cs find 0 main'] 43 let a = execute(cmd) 44 " Test where it moves the cursor 45 call assert_equal('main(void)', getline('.')) 46 " Test the output of the :cs command 47 call assert_match('\n(1 of 1): <<main>> main(void )', a) 48 endfor 49 50 " Test: Find this definition 51 for cmd in ['cs find g test_mf_hash', 52 \ 'cs find 1 test_mf_hash', 53 \ 'cs find 1 test_mf_hash'] " leading space ignored. 54 exe cmd 55 call assert_equal(['', '/*', ' * Test mf_hash_*() functions.', ' */', ' static void', 'test_mf_hash(void)', '{'], getline(line('.')-5, line('.')+1)) 56 endfor 57 58 " Test: Find functions called by this function 59 for cmd in ['cs find d test_mf_hash', 'cs find 2 test_mf_hash'] 60 let a = execute(cmd) 61 call assert_match('\n(1 of 42): <<mf_hash_init>> mf_hash_init(&ht);', a) 62 call assert_equal(' mf_hash_init(&ht);', getline('.')) 63 endfor 64 65 " Test: Find functions calling this function 66 for cmd in ['cs find c test_mf_hash', 'cs find 3 test_mf_hash'] 67 let a = execute(cmd) 68 call assert_match('\n(1 of 1): <<main>> test_mf_hash();', a) 69 call assert_equal(' test_mf_hash();', getline('.')) 70 endfor 71 72 " Test: Find this text string 73 for cmd in ['cs find t Bram', 'cs find 4 Bram'] 74 let a = execute(cmd) 75 call assert_match('(1 of 1): <<<unknown>>> \* VIM - Vi IMproved^Iby Bram Moolenaar', a) 76 call assert_equal(' * VIM - Vi IMproved by Bram Moolenaar', getline('.')) 77 endfor 78 79 " Test: Find this egrep pattern 80 " test all matches returned by cscope 81 for cmd in ['cs find e ^\#includ.', 'cs find 6 ^\#includ.'] 82 let a = execute(cmd) 83 call assert_match('\n(1 of 3): <<<unknown>>> #include <assert.h>', a) 84 call assert_equal('#include <assert.h>', getline('.')) 85 cnext 86 call assert_equal('#include "main.c"', getline('.')) 87 cnext 88 call assert_equal('#include "memfile.c"', getline('.')) 89 call assert_fails('cnext', 'E553:') 90 endfor 91 92 " Test: Find the same egrep pattern using lcscope this time. 93 let a = execute('lcs find e ^\#includ.') 94 call assert_match('\n(1 of 3): <<<unknown>>> #include <assert.h>', a) 95 call assert_equal('#include <assert.h>', getline('.')) 96 lnext 97 call assert_equal('#include "main.c"', getline('.')) 98 lnext 99 call assert_equal('#include "memfile.c"', getline('.')) 100 call assert_fails('lnext', 'E553:') 101 102 " Test: Find this file 103 for cmd in ['cs find f Xmemfile_test.c', 'cs find 7 Xmemfile_test.c'] 104 enew 105 let a = execute(cmd) 106 call assert_true(a =~ '"Xmemfile_test.c" \d\+L, \d\+C') 107 call assert_equal('Xmemfile_test.c', @%) 108 endfor 109 110 " Test: Find files #including this file 111 for cmd in ['cs find i assert.h', 'cs find 8 assert.h'] 112 enew 113 let a = execute(cmd) 114 let alines = split(a, '\n', 1) 115 call assert_equal('', alines[0]) 116 call assert_true(alines[1] =~ '"Xmemfile_test.c" \d\+L, \d\+C') 117 call assert_equal('(1 of 1): <<global>> #include <assert.h>', alines[2]) 118 call assert_equal('#include <assert.h>', getline('.')) 119 endfor 120 121 " Test: Invalid find command 122 call assert_fails('cs find x', 'E560:') 123 124 if has('float') 125 " Test: Find places where this symbol is assigned a value 126 " this needs a cscope >= 15.8 127 " unfortunately, Travis has cscope version 15.7 128 let cscope_version = systemlist('cscope --version')[0] 129 let cs_version = str2float(matchstr(cscope_version, '\d\+\(\.\d\+\)\?')) 130 if cs_version >= 15.8 131 for cmd in ['cs find a item', 'cs find 9 item'] 132 let a = execute(cmd) 133 call assert_equal(['', '(1 of 4): <<test_mf_hash>> item = LALLOC_CLEAR_ONE(mf_hashitem_T);'], split(a, '\n', 1)) 134 call assert_equal(' item = LALLOC_CLEAR_ONE(mf_hashitem_T);', getline('.')) 135 cnext 136 call assert_equal(' item = mf_hash_find(&ht, key);', getline('.')) 137 cnext 138 call assert_equal(' item = mf_hash_find(&ht, key);', getline('.')) 139 cnext 140 call assert_equal(' item = mf_hash_find(&ht, key);', getline('.')) 141 endfor 142 endif 143 endif 144 145 " Test: leading whitespace is not removed for cscope find text 146 let a = execute('cscope find t test_mf_hash') 147 call assert_equal(['', '(1 of 1): <<<unknown>>> test_mf_hash();'], split(a, '\n', 1)) 148 call assert_equal(' test_mf_hash();', getline('.')) 149 150 " Test: test with scscope 151 let a = execute('scs find t Bram') 152 call assert_match('(1 of 1): <<<unknown>>> \* VIM - Vi IMproved^Iby Bram Moolenaar', a) 153 call assert_equal(' * VIM - Vi IMproved by Bram Moolenaar', getline('.')) 154 155 " Test: cscope help 156 for cmd in ['cs', 'cs help', 'cs xxx'] 157 let a = execute(cmd) 158 call assert_match('^cscope commands:\n', a) 159 call assert_match('\nadd :', a) 160 call assert_match('\nfind :', a) 161 call assert_match('\nhelp : Show this message', a) 162 call assert_match('\nkill : Kill a connection', a) 163 call assert_match('\nreset: Reinit all connections', a) 164 call assert_match('\nshow : Show connections', a) 165 endfor 166 let a = execute('scscope help') 167 call assert_match('This cscope command does not support splitting the window\.', a) 168 169 " Test: reset connections 170 let a = execute('cscope reset') 171 call assert_match('\nAdded cscope database.*Xcscope.out (#0)', a) 172 call assert_match('\nAll cscope databases reset', a) 173 174 " Test: cscope show 175 let a = execute('cscope show') 176 call assert_match('\n 0 \d\+.*Xcscope.out\s*<none>', a) 177 178 " Test: cstag and 'csto' option 179 set csto=0 180 let a = execute('cstag TEST_COUNT') 181 call assert_match('(1 of 1): <<TEST_COUNT>> #define TEST_COUNT 50000', a) 182 call assert_equal('#define TEST_COUNT 50000', getline('.')) 183 set csto=1 184 let a = execute('cstag index_to_key') 185 call assert_match('(1 of 1): <<index_to_key>> #define index_to_key(i) ((i) ^ 15167)', a) 186 call assert_equal('#define index_to_key(i) ((i) ^ 15167)', getline('.')) 187 call assert_fails('cstag xxx', 'E257:') 188 call assert_fails('cstag', 'E562:') 189 190 " Test: 'cst' option 191 set nocst 192 call assert_fails('tag TEST_COUNT', 'E426:') 193 set cst 194 let a = execute('tag TEST_COUNT') 195 call assert_match('(1 of 1): <<TEST_COUNT>> #define TEST_COUNT 50000', a) 196 call assert_equal('#define TEST_COUNT 50000', getline('.')) 197 let a = execute('tags') 198 call assert_match('1 1 TEST_COUNT\s\+\d\+\s\+#define index_to_key', a) 199 200 " Test: 'cscoperelative' 201 call mkdir('Xcscoperelative') 202 cd Xcscoperelative 203 let a = execute('cs find g test_mf_hash') 204 call assert_notequal('test_mf_hash(void)', getline('.')) 205 set cscoperelative 206 let a = execute('cs find g test_mf_hash') 207 call assert_equal('test_mf_hash(void)', getline('.')) 208 set nocscoperelative 209 cd .. 210 call delete('Xcscoperelative', 'd') 211 212 " Test: this should trigger call to cs_print_tags() 213 " Unclear how to check result though, we just exercise the code. 214 set cst cscopequickfix=s0 215 call feedkeys(":cs find s main\<CR>", 't') 216 217 " Test: cscope kill 218 call assert_fails('cscope kill 2', 'E261:') 219 call assert_fails('cscope kill xxx', 'E261:') 220 221 let a = execute('cscope kill 0') 222 call assert_match('cscope connection 0 closed', a) 223 224 cscope add Xcscope.out 225 let a = execute('cscope kill Xcscope.out') 226 call assert_match('cscope connection Xcscope.out closed', a) 227 228 cscope add Xcscope.out . 229 let a = execute('cscope kill -1') 230 call assert_match('cscope connection .*Xcscope.out closed', a) 231 let a = execute('cscope kill -1') 232 call assert_equal('', a) 233 234 " Test: 'csprg' option 235 call assert_equal('cscope', &csprg) 236 set csprg=doesnotexist 237 call assert_fails('cscope add Xcscope2.out', 'E609:') 238 set csprg=cscope 239 240 " Test: multiple cscope connections 241 cscope add Xcscope.out 242 cscope add Xcscope2.out . -C 243 let a = execute('cscope show') 244 call assert_match('\n 0 \d\+.*Xcscope.out\s*<none>', a) 245 call assert_match('\n 1 \d\+.*Xcscope2.out\s*\.', a) 246 247 " Test: test Ex command line completion 248 call feedkeys(":cs \<C-A>\<C-B>\"\<CR>", 'tx') 249 call assert_equal('"cs add find help kill reset show', @:) 250 251 call feedkeys(":scs \<C-A>\<C-B>\"\<CR>", 'tx') 252 call assert_equal('"scs find', @:) 253 254 call feedkeys(":cs find \<C-A>\<C-B>\"\<CR>", 'tx') 255 call assert_equal('"cs find a c d e f g i s t', @:) 256 257 call feedkeys(":cs kill \<C-A>\<C-B>\"\<CR>", 'tx') 258 call assert_equal('"cs kill -1 0 1', @:) 259 260 call feedkeys(":cs add Xcscope\<C-A>\<C-B>\"\<CR>", 'tx') 261 call assert_equal('"cs add Xcscope.out Xcscope2.out', @:) 262 263 " Test: cscope_connection() 264 call assert_equal(cscope_connection(), 1) 265 call assert_equal(cscope_connection(0, 'out'), 1) 266 call assert_equal(cscope_connection(0, 'xxx'), 1) 267 268 call assert_equal(cscope_connection(1, 'out'), 1) 269 call assert_equal(cscope_connection(1, 'xxx'), 0) 270 271 call assert_equal(cscope_connection(2, 'out'), 0) 272 call assert_equal(cscope_connection(2, getcwd() .. '/Xcscope.out', 1), 1) 273 274 call assert_equal(cscope_connection(3, 'xxx', '..'), 0) 275 call assert_equal(cscope_connection(3, 'out', 'xxx'), 0) 276 call assert_equal(cscope_connection(3, 'out', '.'), 1) 277 278 call assert_equal(cscope_connection(4, 'out', '.'), 0) 279 280 call assert_equal(cscope_connection(5, 'out'), 0) 281 call assert_equal(cscope_connection(-1, 'out'), 0) 282 283 call CscopeSetupOrClean(0) 284endfunc 285 286" Test ":cs add {dir}" (add the {dir}/cscope.out database) 287func Test_cscope_add_dir() 288 call mkdir('Xcscopedir', 'p') 289 290 " Cscope doesn't handle symlinks, so this needs to be resolved in case a 291 " shadow directory is being used. 292 let memfile = resolve('../memfile_test.c') 293 call system('cscope -bk -fXcscopedir/cscope.out ' . memfile) 294 295 cs add Xcscopedir 296 let a = execute('cscope show') 297 let lines = split(a, "\n", 1) 298 call assert_equal(3, len(lines)) 299 call assert_equal(' # pid database name prepend path', lines[0]) 300 call assert_equal('', lines[1]) 301 call assert_match('^ 0 \d\+.*Xcscopedir/cscope.out\s\+<none>$', lines[2]) 302 303 cs kill -1 304 call delete('Xcscopedir/cscope.out') 305 call assert_fails('cs add Xcscopedir', 'E563:') 306 307 call delete('Xcscopedir', 'd') 308endfunc 309 310func Test_cscopequickfix() 311 set cscopequickfix=s-,g-,d+,c-,t+,e-,f0,i-,a- 312 call assert_equal('s-,g-,d+,c-,t+,e-,f0,i-,a-', &cscopequickfix) 313 314 call assert_fails('set cscopequickfix=x-', 'E474:') 315 call assert_fails('set cscopequickfix=s', 'E474:') 316 call assert_fails('set cscopequickfix=s7', 'E474:') 317 call assert_fails('set cscopequickfix=s-a', 'E474:') 318endfunc 319 320func Test_withoutCscopeConnection() 321 call assert_equal(cscope_connection(), 0) 322 323 call assert_fails('cscope find s main', 'E567:') 324 let a = execute('cscope show') 325 call assert_match('no cscope connections', a) 326endfunc 327 328 329" vim: shiftwidth=2 sts=2 expandtab 330