1" Test for syntax and syntax iskeyword option 2 3if !has("syntax") 4 finish 5endif 6 7func GetSyntaxItem(pat) 8 let c = '' 9 let a = ['a', getreg('a'), getregtype('a')] 10 0 11 redraw! 12 call search(a:pat, 'W') 13 let synid = synID(line('.'), col('.'), 1) 14 while synid == synID(line('.'), col('.'), 1) 15 norm! v"ay 16 " stop at whitespace 17 if @a =~# '\s' 18 break 19 endif 20 let c .= @a 21 norm! l 22 endw 23 call call('setreg', a) 24 0 25 return c 26endfunc 27 28func Test_syn_iskeyword() 29 new 30 call setline(1, [ 31 \ 'CREATE TABLE FOOBAR(', 32 \ ' DLTD_BY VARCHAR2(100)', 33 \ ');', 34 \ '']) 35 36 syntax on 37 set ft=sql 38 syn match SYN /C\k\+\>/ 39 hi link SYN ErrorMsg 40 call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 41 /\<D\k\+\>/:norm! ygn 42 call assert_equal('DLTD_BY', @0) 43 redir @c 44 syn iskeyword 45 redir END 46 call assert_equal("\nsyntax iskeyword not set", @c) 47 48 syn iskeyword @,48-57,_,192-255 49 redir @c 50 syn iskeyword 51 redir END 52 call assert_equal("\nsyntax iskeyword @,48-57,_,192-255", @c) 53 54 setlocal isk-=_ 55 call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 56 /\<D\k\+\>/:norm! ygn 57 let b2 = @0 58 call assert_equal('DLTD', @0) 59 60 syn iskeyword clear 61 redir @c 62 syn iskeyword 63 redir END 64 call assert_equal("\nsyntax iskeyword not set", @c) 65 66 quit! 67endfunc 68 69func Test_syntax_after_reload() 70 split Xsomefile 71 call setline(1, ['hello', 'there']) 72 w! 73 only! 74 setl filetype=hello 75 au FileType hello let g:gotit = 1 76 call assert_false(exists('g:gotit')) 77 edit other 78 buf Xsomefile 79 call assert_equal('hello', &filetype) 80 call assert_true(exists('g:gotit')) 81 call delete('Xsomefile') 82endfunc 83 84func Test_syntime() 85 if !has('profile') 86 return 87 endif 88 89 syntax on 90 syntime on 91 let a = execute('syntime report') 92 call assert_equal("\nNo Syntax items defined for this buffer", a) 93 94 view ../memfile_test.c 95 setfiletype cpp 96 redraw 97 let a = execute('syntime report') 98 call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 99 call assert_match(' \d*\.\d* \+[^0]\d* .* cppRawString ', a) 100 call assert_match(' \d*\.\d* \+[^0]\d* .* cppNumber ', a) 101 102 syntime off 103 syntime clear 104 let a = execute('syntime report') 105 call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 106 call assert_notmatch('.* cppRawString *', a) 107 call assert_notmatch('.* cppNumber*', a) 108 call assert_notmatch('[1-9]', a) 109 110 call assert_fails('syntime abc', 'E475') 111 112 syntax clear 113 let a = execute('syntime report') 114 call assert_equal("\nNo Syntax items defined for this buffer", a) 115 116 bd 117endfunc 118 119func Test_syntax_list() 120 syntax on 121 let a = execute('syntax list') 122 call assert_equal("\nNo Syntax items defined for this buffer", a) 123 124 view ../memfile_test.c 125 setfiletype c 126 127 let a = execute('syntax list') 128 call assert_match('cInclude*', a) 129 call assert_match('cDefine', a) 130 131 let a = execute('syntax list cDefine') 132 call assert_notmatch('cInclude*', a) 133 call assert_match('cDefine', a) 134 call assert_match(' links to Macro$', a) 135 136 call assert_fails('syntax list ABCD', 'E28:') 137 call assert_fails('syntax list @ABCD', 'E392:') 138 139 syntax clear 140 let a = execute('syntax list') 141 call assert_equal("\nNo Syntax items defined for this buffer", a) 142 143 bd 144endfunc 145 146func Test_syntax_completion() 147 call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx') 148 call assert_equal('"syn case clear cluster conceal enable include iskeyword keyword list manual match off on region reset spell sync', @:) 149 150 call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx') 151 call assert_equal('"syn case ignore match', @:) 152 153 call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx') 154 call assert_equal('"syn spell default notoplevel toplevel', @:) 155 156 call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx') 157 call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:) 158 159 " Check that clearing "Aap" avoids it showing up before Boolean. 160 hi Aap ctermfg=blue 161 call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 162 call assert_match('^"syn list Aap Boolean Character ', @:) 163 hi clear Aap 164 165 call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 166 call assert_match('^"syn list Boolean Character ', @:) 167 168 call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx') 169 call assert_match('^"syn match Boolean Character ', @:) 170endfunc 171 172func Test_syntax_arg_skipped() 173 syn clear 174 syntax case ignore 175 if 0 176 syntax case match 177 endif 178 call assert_match('case ignore', execute('syntax case')) 179 180 syn keyword Foo foo 181 call assert_match('Foo', execute('syntax')) 182 syn clear 183 call assert_match('case match', execute('syntax case')) 184 call assert_notmatch('Foo', execute('syntax')) 185 186 if has('conceal') 187 syn clear 188 syntax conceal on 189 if 0 190 syntax conceal off 191 endif 192 call assert_match('conceal on', execute('syntax conceal')) 193 syn clear 194 call assert_match('conceal off', execute('syntax conceal')) 195 196 syntax conceal on 197 syntax conceal off 198 call assert_match('conceal off', execute('syntax conceal')) 199 endif 200 201 syntax region Bar start=/</ end=/>/ 202 if 0 203 syntax region NotTest start=/</ end=/>/ contains=@Spell 204 endif 205 call assert_match('Bar', execute('syntax')) 206 call assert_notmatch('NotTest', execute('syntax')) 207 call assert_notmatch('Spell', execute('syntax')) 208 209 hi Foo ctermfg=blue 210 let a = execute('hi Foo') 211 if 0 212 syntax rest 213 endif 214 call assert_equal(a, execute('hi Foo')) 215 hi clear Bar 216 hi clear Foo 217 218 set ft=tags 219 syn off 220 if 0 221 syntax enable 222 endif 223 call assert_match('No Syntax items defined', execute('syntax')) 224 syntax enable 225 call assert_match('tagComment', execute('syntax')) 226 set ft= 227 228 syn clear 229 if 0 230 syntax include @Spell nothing 231 endif 232 call assert_notmatch('Spell', execute('syntax')) 233 234 syn clear 235 syn iskeyword 48-57,$,_ 236 call assert_match('48-57,$,_', execute('syntax iskeyword')) 237 if 0 238 syn clear 239 syn iskeyword clear 240 endif 241 call assert_match('48-57,$,_', execute('syntax iskeyword')) 242 syn iskeyword clear 243 call assert_match('not set', execute('syntax iskeyword')) 244 syn iskeyword 48-57,$,_ 245 syn clear 246 call assert_match('not set', execute('syntax iskeyword')) 247 248 syn clear 249 syn keyword Foo foo 250 if 0 251 syn keyword NotAdded bar 252 endif 253 call assert_match('Foo', execute('syntax')) 254 call assert_notmatch('NotAdded', execute('highlight')) 255 256 syn clear 257 syn keyword Foo foo 258 call assert_match('Foo', execute('syntax')) 259 call assert_match('Foo', execute('syntax list')) 260 call assert_notmatch('Foo', execute('if 0 | syntax | endif')) 261 call assert_notmatch('Foo', execute('if 0 | syntax list | endif')) 262 263 syn clear 264 syn match Fopi /asdf/ 265 if 0 266 syn match Fopx /asdf/ 267 endif 268 call assert_match('Fopi', execute('syntax')) 269 call assert_notmatch('Fopx', execute('syntax')) 270 271 syn clear 272 syn spell toplevel 273 call assert_match('spell toplevel', execute('syntax spell')) 274 if 0 275 syn spell notoplevel 276 endif 277 call assert_match('spell toplevel', execute('syntax spell')) 278 syn spell notoplevel 279 call assert_match('spell notoplevel', execute('syntax spell')) 280 syn spell default 281 call assert_match('spell default', execute('syntax spell')) 282 283 syn clear 284 if 0 285 syntax cluster Spell 286 endif 287 call assert_notmatch('Spell', execute('syntax')) 288 289 syn clear 290 syn keyword Foo foo 291 syn sync ccomment 292 syn sync maxlines=5 293 if 0 294 syn sync maxlines=11 295 endif 296 call assert_match('on C-style comments', execute('syntax sync')) 297 call assert_match('maximal 5 lines', execute('syntax sync')) 298 syn sync clear 299 if 0 300 syn sync ccomment 301 endif 302 call assert_notmatch('on C-style comments', execute('syntax sync')) 303 304 syn clear 305endfunc 306 307func Test_invalid_arg() 308 call assert_fails('syntax case asdf', 'E390:') 309 if has('conceal') 310 call assert_fails('syntax conceal asdf', 'E390:') 311 endif 312 call assert_fails('syntax spell asdf', 'E390:') 313endfunc 314 315func Test_syn_sync() 316 syntax region HereGroup start=/this/ end=/that/ 317 syntax sync match SyncHere grouphere HereGroup "pattern" 318 call assert_match('SyncHere', execute('syntax sync')) 319 syn sync clear 320 call assert_notmatch('SyncHere', execute('syntax sync')) 321 syn clear 322endfunc 323 324func Test_syn_clear() 325 syntax keyword Foo foo 326 syntax keyword Bar tar 327 call assert_match('Foo', execute('syntax')) 328 call assert_match('Bar', execute('syntax')) 329 call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 330 syn clear Foo 331 call assert_notmatch('Foo', execute('syntax')) 332 call assert_match('Bar', execute('syntax')) 333 call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 334 syn clear Foo Bar 335 call assert_notmatch('Foo', execute('syntax')) 336 call assert_notmatch('Bar', execute('syntax')) 337 hi clear Foo 338 call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 339 hi clear Bar 340endfunc 341 342func Test_invalid_name() 343 syn clear 344 syn keyword Nop yes 345 call assert_fails("syntax keyword Wr\x17ong bar", 'E669:') 346 syntax keyword @Wrong bar 347 call assert_match('W18:', execute('1messages')) 348 syn clear 349 hi clear Nop 350 hi clear @Wrong 351endfunc 352 353func Test_ownsyntax() 354 new Xfoo 355 call setline(1, '#define FOO') 356 syntax on 357 set filetype=c 358 ownsyntax perl 359 call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name')) 360 call assert_equal('c', b:current_syntax) 361 call assert_equal('perl', w:current_syntax) 362 363 " A new split window should have the original syntax. 364 split 365 call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name')) 366 call assert_equal('c', b:current_syntax) 367 call assert_equal(0, exists('w:current_syntax')) 368 369 wincmd x 370 call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name")) 371 372 syntax off 373 set filetype& 374 %bw! 375endfunc 376 377func Test_ownsyntax_completion() 378 call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx') 379 call assert_equal('"ownsyntax java javacc javascript', @:) 380endfunc 381