1b8060fe8SBram Moolenaar" Test for syntax and syntax iskeyword option 2b8060fe8SBram Moolenaar 3b8060fe8SBram Moolenaarif !has("syntax") 4b8060fe8SBram Moolenaar finish 5b8060fe8SBram Moolenaarendif 6b8060fe8SBram Moolenaar 74d785895SBram Moolenaarsource view_util.vim 8da65058aSBram Moolenaarsource screendump.vim 94d785895SBram Moolenaar 10b8060fe8SBram Moolenaarfunc GetSyntaxItem(pat) 11b8060fe8SBram Moolenaar let c = '' 12b8060fe8SBram Moolenaar let a = ['a', getreg('a'), getregtype('a')] 13b8060fe8SBram Moolenaar 0 14b8060fe8SBram Moolenaar redraw! 15b8060fe8SBram Moolenaar call search(a:pat, 'W') 16b8060fe8SBram Moolenaar let synid = synID(line('.'), col('.'), 1) 17b8060fe8SBram Moolenaar while synid == synID(line('.'), col('.'), 1) 18b8060fe8SBram Moolenaar norm! v"ay 19b8060fe8SBram Moolenaar " stop at whitespace 20b8060fe8SBram Moolenaar if @a =~# '\s' 21b8060fe8SBram Moolenaar break 22b8060fe8SBram Moolenaar endif 23b8060fe8SBram Moolenaar let c .= @a 24b8060fe8SBram Moolenaar norm! l 25b8060fe8SBram Moolenaar endw 26b8060fe8SBram Moolenaar call call('setreg', a) 27b8060fe8SBram Moolenaar 0 28b8060fe8SBram Moolenaar return c 29b8060fe8SBram Moolenaarendfunc 30b8060fe8SBram Moolenaar 31b8060fe8SBram Moolenaarfunc Test_syn_iskeyword() 32b8060fe8SBram Moolenaar new 33b8060fe8SBram Moolenaar call setline(1, [ 34b8060fe8SBram Moolenaar \ 'CREATE TABLE FOOBAR(', 35b8060fe8SBram Moolenaar \ ' DLTD_BY VARCHAR2(100)', 36b8060fe8SBram Moolenaar \ ');', 37b8060fe8SBram Moolenaar \ '']) 38b8060fe8SBram Moolenaar 39b8060fe8SBram Moolenaar syntax on 40b8060fe8SBram Moolenaar set ft=sql 41b8060fe8SBram Moolenaar syn match SYN /C\k\+\>/ 42b8060fe8SBram Moolenaar hi link SYN ErrorMsg 43b8060fe8SBram Moolenaar call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 44b8060fe8SBram Moolenaar /\<D\k\+\>/:norm! ygn 45b8060fe8SBram Moolenaar call assert_equal('DLTD_BY', @0) 46b8060fe8SBram Moolenaar redir @c 47b8060fe8SBram Moolenaar syn iskeyword 48b8060fe8SBram Moolenaar redir END 49b8060fe8SBram Moolenaar call assert_equal("\nsyntax iskeyword not set", @c) 50b8060fe8SBram Moolenaar 51b8060fe8SBram Moolenaar syn iskeyword @,48-57,_,192-255 52b8060fe8SBram Moolenaar redir @c 53b8060fe8SBram Moolenaar syn iskeyword 54b8060fe8SBram Moolenaar redir END 55b8060fe8SBram Moolenaar call assert_equal("\nsyntax iskeyword @,48-57,_,192-255", @c) 56b8060fe8SBram Moolenaar 57b8060fe8SBram Moolenaar setlocal isk-=_ 58b8060fe8SBram Moolenaar call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 59b8060fe8SBram Moolenaar /\<D\k\+\>/:norm! ygn 60b8060fe8SBram Moolenaar let b2 = @0 61b8060fe8SBram Moolenaar call assert_equal('DLTD', @0) 62b8060fe8SBram Moolenaar 63b8060fe8SBram Moolenaar syn iskeyword clear 64b8060fe8SBram Moolenaar redir @c 65b8060fe8SBram Moolenaar syn iskeyword 66b8060fe8SBram Moolenaar redir END 67b8060fe8SBram Moolenaar call assert_equal("\nsyntax iskeyword not set", @c) 68b8060fe8SBram Moolenaar 69b8060fe8SBram Moolenaar quit! 70b8060fe8SBram Moolenaarendfunc 71c3691332SBram Moolenaar 72c3691332SBram Moolenaarfunc Test_syntax_after_reload() 73c3691332SBram Moolenaar split Xsomefile 74c3691332SBram Moolenaar call setline(1, ['hello', 'there']) 75c3691332SBram Moolenaar w! 76c3691332SBram Moolenaar only! 77c3691332SBram Moolenaar setl filetype=hello 78c3691332SBram Moolenaar au FileType hello let g:gotit = 1 79c3691332SBram Moolenaar call assert_false(exists('g:gotit')) 80c3691332SBram Moolenaar edit other 81c3691332SBram Moolenaar buf Xsomefile 82c3691332SBram Moolenaar call assert_equal('hello', &filetype) 83c3691332SBram Moolenaar call assert_true(exists('g:gotit')) 84c3691332SBram Moolenaar call delete('Xsomefile') 8573b484c4SBram Moolenaarendfunc 8673b484c4SBram Moolenaar 8773b484c4SBram Moolenaarfunc Test_syntime() 8873b484c4SBram Moolenaar if !has('profile') 894c8980b7SBram Moolenaar return 9073b484c4SBram Moolenaar endif 9173b484c4SBram Moolenaar 9273b484c4SBram Moolenaar syntax on 9373b484c4SBram Moolenaar syntime on 9473b484c4SBram Moolenaar let a = execute('syntime report') 9573b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 9673b484c4SBram Moolenaar 9773b484c4SBram Moolenaar view ../memfile_test.c 9873b484c4SBram Moolenaar setfiletype cpp 9973b484c4SBram Moolenaar redraw 10073b484c4SBram Moolenaar let a = execute('syntime report') 10173b484c4SBram Moolenaar call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 10273b484c4SBram Moolenaar call assert_match(' \d*\.\d* \+[^0]\d* .* cppRawString ', a) 10373b484c4SBram Moolenaar call assert_match(' \d*\.\d* \+[^0]\d* .* cppNumber ', a) 10473b484c4SBram Moolenaar 10573b484c4SBram Moolenaar syntime off 10673b484c4SBram Moolenaar syntime clear 10773b484c4SBram Moolenaar let a = execute('syntime report') 10873b484c4SBram Moolenaar call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 10973b484c4SBram Moolenaar call assert_notmatch('.* cppRawString *', a) 11073b484c4SBram Moolenaar call assert_notmatch('.* cppNumber*', a) 11173b484c4SBram Moolenaar call assert_notmatch('[1-9]', a) 11273b484c4SBram Moolenaar 11373b484c4SBram Moolenaar call assert_fails('syntime abc', 'E475') 11473b484c4SBram Moolenaar 11573b484c4SBram Moolenaar syntax clear 11673b484c4SBram Moolenaar let a = execute('syntime report') 11773b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 11873b484c4SBram Moolenaar 11973b484c4SBram Moolenaar bd 12073b484c4SBram Moolenaarendfunc 12173b484c4SBram Moolenaar 122b513d307SBram Moolenaarfunc Test_syntime_completion() 123b513d307SBram Moolenaar if !has('profile') 124b513d307SBram Moolenaar return 125b513d307SBram Moolenaar endif 126b513d307SBram Moolenaar 127b513d307SBram Moolenaar call feedkeys(":syntime \<C-A>\<C-B>\"\<CR>", 'tx') 128b513d307SBram Moolenaar call assert_equal('"syntime clear off on report', @:) 129b513d307SBram Moolenaarendfunc 130b513d307SBram Moolenaar 13173b484c4SBram Moolenaarfunc Test_syntax_list() 13273b484c4SBram Moolenaar syntax on 13373b484c4SBram Moolenaar let a = execute('syntax list') 13473b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 13573b484c4SBram Moolenaar 13673b484c4SBram Moolenaar view ../memfile_test.c 13773b484c4SBram Moolenaar setfiletype c 13873b484c4SBram Moolenaar 13973b484c4SBram Moolenaar let a = execute('syntax list') 14073b484c4SBram Moolenaar call assert_match('cInclude*', a) 14173b484c4SBram Moolenaar call assert_match('cDefine', a) 14273b484c4SBram Moolenaar 14373b484c4SBram Moolenaar let a = execute('syntax list cDefine') 14473b484c4SBram Moolenaar call assert_notmatch('cInclude*', a) 14573b484c4SBram Moolenaar call assert_match('cDefine', a) 14673b484c4SBram Moolenaar call assert_match(' links to Macro$', a) 14773b484c4SBram Moolenaar 14873b484c4SBram Moolenaar call assert_fails('syntax list ABCD', 'E28:') 14973b484c4SBram Moolenaar call assert_fails('syntax list @ABCD', 'E392:') 15073b484c4SBram Moolenaar 15173b484c4SBram Moolenaar syntax clear 15273b484c4SBram Moolenaar let a = execute('syntax list') 15373b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 15473b484c4SBram Moolenaar 15573b484c4SBram Moolenaar bd 15673b484c4SBram Moolenaarendfunc 15773b484c4SBram Moolenaar 15873b484c4SBram Moolenaarfunc Test_syntax_completion() 15973b484c4SBram Moolenaar call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx') 16073b484c4SBram Moolenaar call assert_equal('"syn case clear cluster conceal enable include iskeyword keyword list manual match off on region reset spell sync', @:) 16173b484c4SBram Moolenaar 16273b484c4SBram Moolenaar call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx') 16373b484c4SBram Moolenaar call assert_equal('"syn case ignore match', @:) 16473b484c4SBram Moolenaar 1652d028390SBram Moolenaar call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx') 1662d028390SBram Moolenaar call assert_equal('"syn spell default notoplevel toplevel', @:) 1672d028390SBram Moolenaar 1682d028390SBram Moolenaar call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx') 1692d028390SBram Moolenaar call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:) 1702d028390SBram Moolenaar 171d61e8aaaSBram Moolenaar " Check that clearing "Aap" avoids it showing up before Boolean. 172d61e8aaaSBram Moolenaar hi Aap ctermfg=blue 173d61e8aaaSBram Moolenaar call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 174d61e8aaaSBram Moolenaar call assert_match('^"syn list Aap Boolean Character ', @:) 175d61e8aaaSBram Moolenaar hi clear Aap 176d61e8aaaSBram Moolenaar 17773b484c4SBram Moolenaar call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 17873b484c4SBram Moolenaar call assert_match('^"syn list Boolean Character ', @:) 17973b484c4SBram Moolenaar 18073b484c4SBram Moolenaar call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx') 18173b484c4SBram Moolenaar call assert_match('^"syn match Boolean Character ', @:) 182c3691332SBram Moolenaarendfunc 183de318c5cSBram Moolenaar 184de318c5cSBram Moolenaarfunc Test_syntax_arg_skipped() 185de318c5cSBram Moolenaar syn clear 186de318c5cSBram Moolenaar syntax case ignore 187de318c5cSBram Moolenaar if 0 188de318c5cSBram Moolenaar syntax case match 189de318c5cSBram Moolenaar endif 190de318c5cSBram Moolenaar call assert_match('case ignore', execute('syntax case')) 191de318c5cSBram Moolenaar 192de318c5cSBram Moolenaar syn keyword Foo foo 193de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax')) 194de318c5cSBram Moolenaar syn clear 195de318c5cSBram Moolenaar call assert_match('case match', execute('syntax case')) 196de318c5cSBram Moolenaar call assert_notmatch('Foo', execute('syntax')) 197de318c5cSBram Moolenaar 198de318c5cSBram Moolenaar if has('conceal') 199de318c5cSBram Moolenaar syn clear 200de318c5cSBram Moolenaar syntax conceal on 201de318c5cSBram Moolenaar if 0 202de318c5cSBram Moolenaar syntax conceal off 203de318c5cSBram Moolenaar endif 204de318c5cSBram Moolenaar call assert_match('conceal on', execute('syntax conceal')) 205de318c5cSBram Moolenaar syn clear 206de318c5cSBram Moolenaar call assert_match('conceal off', execute('syntax conceal')) 20758f60ca2SBram Moolenaar 20858f60ca2SBram Moolenaar syntax conceal on 20958f60ca2SBram Moolenaar syntax conceal off 21058f60ca2SBram Moolenaar call assert_match('conceal off', execute('syntax conceal')) 211de318c5cSBram Moolenaar endif 212de318c5cSBram Moolenaar 213d61e8aaaSBram Moolenaar syntax region Bar start=/</ end=/>/ 214de318c5cSBram Moolenaar if 0 215de318c5cSBram Moolenaar syntax region NotTest start=/</ end=/>/ contains=@Spell 216de318c5cSBram Moolenaar endif 217d61e8aaaSBram Moolenaar call assert_match('Bar', execute('syntax')) 218de318c5cSBram Moolenaar call assert_notmatch('NotTest', execute('syntax')) 219de318c5cSBram Moolenaar call assert_notmatch('Spell', execute('syntax')) 220de318c5cSBram Moolenaar 221de318c5cSBram Moolenaar hi Foo ctermfg=blue 222de318c5cSBram Moolenaar let a = execute('hi Foo') 223de318c5cSBram Moolenaar if 0 224de318c5cSBram Moolenaar syntax rest 225de318c5cSBram Moolenaar endif 226de318c5cSBram Moolenaar call assert_equal(a, execute('hi Foo')) 227d61e8aaaSBram Moolenaar hi clear Bar 228d61e8aaaSBram Moolenaar hi clear Foo 229de318c5cSBram Moolenaar 230de318c5cSBram Moolenaar set ft=tags 231de318c5cSBram Moolenaar syn off 232de318c5cSBram Moolenaar if 0 233de318c5cSBram Moolenaar syntax enable 234de318c5cSBram Moolenaar endif 235de318c5cSBram Moolenaar call assert_match('No Syntax items defined', execute('syntax')) 236de318c5cSBram Moolenaar syntax enable 237de318c5cSBram Moolenaar call assert_match('tagComment', execute('syntax')) 238de318c5cSBram Moolenaar set ft= 239de318c5cSBram Moolenaar 240de318c5cSBram Moolenaar syn clear 241de318c5cSBram Moolenaar if 0 242de318c5cSBram Moolenaar syntax include @Spell nothing 243de318c5cSBram Moolenaar endif 244de318c5cSBram Moolenaar call assert_notmatch('Spell', execute('syntax')) 245de318c5cSBram Moolenaar 246de318c5cSBram Moolenaar syn clear 247de318c5cSBram Moolenaar syn iskeyword 48-57,$,_ 248de318c5cSBram Moolenaar call assert_match('48-57,$,_', execute('syntax iskeyword')) 249de318c5cSBram Moolenaar if 0 250de318c5cSBram Moolenaar syn clear 251de318c5cSBram Moolenaar syn iskeyword clear 252de318c5cSBram Moolenaar endif 253de318c5cSBram Moolenaar call assert_match('48-57,$,_', execute('syntax iskeyword')) 254de318c5cSBram Moolenaar syn iskeyword clear 255de318c5cSBram Moolenaar call assert_match('not set', execute('syntax iskeyword')) 256de318c5cSBram Moolenaar syn iskeyword 48-57,$,_ 257de318c5cSBram Moolenaar syn clear 258de318c5cSBram Moolenaar call assert_match('not set', execute('syntax iskeyword')) 259de318c5cSBram Moolenaar 260de318c5cSBram Moolenaar syn clear 261de318c5cSBram Moolenaar syn keyword Foo foo 262de318c5cSBram Moolenaar if 0 263de318c5cSBram Moolenaar syn keyword NotAdded bar 264de318c5cSBram Moolenaar endif 265de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax')) 266de318c5cSBram Moolenaar call assert_notmatch('NotAdded', execute('highlight')) 267de318c5cSBram Moolenaar 268de318c5cSBram Moolenaar syn clear 269de318c5cSBram Moolenaar syn keyword Foo foo 270de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax')) 271de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax list')) 272de318c5cSBram Moolenaar call assert_notmatch('Foo', execute('if 0 | syntax | endif')) 273de318c5cSBram Moolenaar call assert_notmatch('Foo', execute('if 0 | syntax list | endif')) 274de318c5cSBram Moolenaar 275de318c5cSBram Moolenaar syn clear 276de318c5cSBram Moolenaar syn match Fopi /asdf/ 277de318c5cSBram Moolenaar if 0 278de318c5cSBram Moolenaar syn match Fopx /asdf/ 279de318c5cSBram Moolenaar endif 280de318c5cSBram Moolenaar call assert_match('Fopi', execute('syntax')) 281de318c5cSBram Moolenaar call assert_notmatch('Fopx', execute('syntax')) 282de318c5cSBram Moolenaar 283de318c5cSBram Moolenaar syn clear 284de318c5cSBram Moolenaar syn spell toplevel 285de318c5cSBram Moolenaar call assert_match('spell toplevel', execute('syntax spell')) 286de318c5cSBram Moolenaar if 0 287de318c5cSBram Moolenaar syn spell notoplevel 288de318c5cSBram Moolenaar endif 289de318c5cSBram Moolenaar call assert_match('spell toplevel', execute('syntax spell')) 290de318c5cSBram Moolenaar syn spell notoplevel 291de318c5cSBram Moolenaar call assert_match('spell notoplevel', execute('syntax spell')) 292de318c5cSBram Moolenaar syn spell default 293de318c5cSBram Moolenaar call assert_match('spell default', execute('syntax spell')) 294de318c5cSBram Moolenaar 295de318c5cSBram Moolenaar syn clear 296de318c5cSBram Moolenaar if 0 297de318c5cSBram Moolenaar syntax cluster Spell 298de318c5cSBram Moolenaar endif 299de318c5cSBram Moolenaar call assert_notmatch('Spell', execute('syntax')) 300de318c5cSBram Moolenaar 301de318c5cSBram Moolenaar syn clear 302de318c5cSBram Moolenaar syn keyword Foo foo 303de318c5cSBram Moolenaar syn sync ccomment 304de318c5cSBram Moolenaar syn sync maxlines=5 305de318c5cSBram Moolenaar if 0 306de318c5cSBram Moolenaar syn sync maxlines=11 307de318c5cSBram Moolenaar endif 308de318c5cSBram Moolenaar call assert_match('on C-style comments', execute('syntax sync')) 309de318c5cSBram Moolenaar call assert_match('maximal 5 lines', execute('syntax sync')) 31058f60ca2SBram Moolenaar syn sync clear 311de318c5cSBram Moolenaar if 0 312de318c5cSBram Moolenaar syn sync ccomment 313de318c5cSBram Moolenaar endif 314de318c5cSBram Moolenaar call assert_notmatch('on C-style comments', execute('syntax sync')) 315de318c5cSBram Moolenaar 316de318c5cSBram Moolenaar syn clear 317de318c5cSBram Moolenaarendfunc 318de318c5cSBram Moolenaar 319ea588154SBram Moolenaarfunc Test_syntax_invalid_arg() 32058f60ca2SBram Moolenaar call assert_fails('syntax case asdf', 'E390:') 321d61e8aaaSBram Moolenaar if has('conceal') 32258f60ca2SBram Moolenaar call assert_fails('syntax conceal asdf', 'E390:') 323d61e8aaaSBram Moolenaar endif 32458f60ca2SBram Moolenaar call assert_fails('syntax spell asdf', 'E390:') 325ea588154SBram Moolenaar call assert_fails('syntax clear @ABCD', 'E391:') 326ea588154SBram Moolenaar call assert_fails('syntax include @Xxx', 'E397:') 327ea588154SBram Moolenaar call assert_fails('syntax region X start="{"', 'E399:') 328ea588154SBram Moolenaar call assert_fails('syntax sync x', 'E404:') 329ea588154SBram Moolenaar call assert_fails('syntax keyword Abc a[', 'E789:') 330ea588154SBram Moolenaar call assert_fails('syntax keyword Abc a[bc]d', 'E890:') 33158f60ca2SBram Moolenaarendfunc 33258f60ca2SBram Moolenaar 33358f60ca2SBram Moolenaarfunc Test_syn_sync() 33458f60ca2SBram Moolenaar syntax region HereGroup start=/this/ end=/that/ 33558f60ca2SBram Moolenaar syntax sync match SyncHere grouphere HereGroup "pattern" 33658f60ca2SBram Moolenaar call assert_match('SyncHere', execute('syntax sync')) 33758f60ca2SBram Moolenaar syn sync clear 33858f60ca2SBram Moolenaar call assert_notmatch('SyncHere', execute('syntax sync')) 33958f60ca2SBram Moolenaar syn clear 34058f60ca2SBram Moolenaarendfunc 34158f60ca2SBram Moolenaar 34258f60ca2SBram Moolenaarfunc Test_syn_clear() 34358f60ca2SBram Moolenaar syntax keyword Foo foo 344d61e8aaaSBram Moolenaar syntax keyword Bar tar 34558f60ca2SBram Moolenaar call assert_match('Foo', execute('syntax')) 346d61e8aaaSBram Moolenaar call assert_match('Bar', execute('syntax')) 347c96272e3SBram Moolenaar call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 34858f60ca2SBram Moolenaar syn clear Foo 34958f60ca2SBram Moolenaar call assert_notmatch('Foo', execute('syntax')) 350d61e8aaaSBram Moolenaar call assert_match('Bar', execute('syntax')) 351c96272e3SBram Moolenaar call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 352d61e8aaaSBram Moolenaar syn clear Foo Bar 35358f60ca2SBram Moolenaar call assert_notmatch('Foo', execute('syntax')) 354d61e8aaaSBram Moolenaar call assert_notmatch('Bar', execute('syntax')) 355d61e8aaaSBram Moolenaar hi clear Foo 356c96272e3SBram Moolenaar call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 357d61e8aaaSBram Moolenaar hi clear Bar 35858f60ca2SBram Moolenaarendfunc 3594007ed4aSBram Moolenaar 3604007ed4aSBram Moolenaarfunc Test_invalid_name() 3614007ed4aSBram Moolenaar syn clear 3624007ed4aSBram Moolenaar syn keyword Nop yes 3634007ed4aSBram Moolenaar call assert_fails("syntax keyword Wr\x17ong bar", 'E669:') 3644007ed4aSBram Moolenaar syntax keyword @Wrong bar 3654007ed4aSBram Moolenaar call assert_match('W18:', execute('1messages')) 3664007ed4aSBram Moolenaar syn clear 3674007ed4aSBram Moolenaar hi clear Nop 3684007ed4aSBram Moolenaar hi clear @Wrong 3694007ed4aSBram Moolenaarendfunc 370f8ec9986SBram Moolenaar 371f8ec9986SBram Moolenaarfunc Test_ownsyntax() 372f8ec9986SBram Moolenaar new Xfoo 373f8ec9986SBram Moolenaar call setline(1, '#define FOO') 374f8ec9986SBram Moolenaar syntax on 375f8ec9986SBram Moolenaar set filetype=c 376f8ec9986SBram Moolenaar ownsyntax perl 377f8ec9986SBram Moolenaar call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name')) 378f8ec9986SBram Moolenaar call assert_equal('c', b:current_syntax) 379f8ec9986SBram Moolenaar call assert_equal('perl', w:current_syntax) 380f8ec9986SBram Moolenaar 381f8ec9986SBram Moolenaar " A new split window should have the original syntax. 382f8ec9986SBram Moolenaar split 383f8ec9986SBram Moolenaar call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name')) 384f8ec9986SBram Moolenaar call assert_equal('c', b:current_syntax) 385f8ec9986SBram Moolenaar call assert_equal(0, exists('w:current_syntax')) 386f8ec9986SBram Moolenaar 387f8ec9986SBram Moolenaar wincmd x 388f8ec9986SBram Moolenaar call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name")) 389f8ec9986SBram Moolenaar 390f8ec9986SBram Moolenaar syntax off 391f8ec9986SBram Moolenaar set filetype& 392f8ec9986SBram Moolenaar %bw! 393f8ec9986SBram Moolenaarendfunc 394f8ec9986SBram Moolenaar 395f8ec9986SBram Moolenaarfunc Test_ownsyntax_completion() 396f8ec9986SBram Moolenaar call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx') 397f8ec9986SBram Moolenaar call assert_equal('"ownsyntax java javacc javascript', @:) 398f8ec9986SBram Moolenaarendfunc 399ea588154SBram Moolenaar 400ea588154SBram Moolenaarfunc Test_highlight_invalid_arg() 401ea588154SBram Moolenaar if has('gui_running') 402ea588154SBram Moolenaar call assert_fails('hi XXX guifg=xxx', 'E254:') 403ea588154SBram Moolenaar endif 404ea588154SBram Moolenaar call assert_fails('hi DoesNotExist', 'E411:') 405ea588154SBram Moolenaar call assert_fails('hi link', 'E412:') 406ea588154SBram Moolenaar call assert_fails('hi link a', 'E412:') 407ea588154SBram Moolenaar call assert_fails('hi link a b c', 'E413:') 408ea588154SBram Moolenaar call assert_fails('hi XXX =', 'E415:') 409ea588154SBram Moolenaar call assert_fails('hi XXX cterm', 'E416:') 410ea588154SBram Moolenaar call assert_fails('hi XXX cterm=', 'E417:') 411ea588154SBram Moolenaar call assert_fails('hi XXX cterm=DoesNotExist', 'E418:') 412ea588154SBram Moolenaar call assert_fails('hi XXX ctermfg=DoesNotExist', 'E421:') 413ea588154SBram Moolenaar call assert_fails('hi XXX xxx=White', 'E423:') 414ea588154SBram Moolenaarendfunc 415ea588154SBram Moolenaar 4161615b36bSBram Moolenaarfunc Test_bg_detection() 4171615b36bSBram Moolenaar if has('gui_running') 4181615b36bSBram Moolenaar return 4191615b36bSBram Moolenaar endif 4201615b36bSBram Moolenaar " auto-detection of &bg, make sure sure it isn't set anywhere before 4211615b36bSBram Moolenaar " this test 4221615b36bSBram Moolenaar hi Normal ctermbg=0 4231615b36bSBram Moolenaar call assert_equal('dark', &bg) 4241615b36bSBram Moolenaar hi Normal ctermbg=4 4251615b36bSBram Moolenaar call assert_equal('dark', &bg) 4261615b36bSBram Moolenaar hi Normal ctermbg=12 4271615b36bSBram Moolenaar call assert_equal('light', &bg) 4281615b36bSBram Moolenaar hi Normal ctermbg=15 4291615b36bSBram Moolenaar call assert_equal('light', &bg) 4301615b36bSBram Moolenaar 4310b2eef24SBram Moolenaar " manually-set &bg takes precedence over auto-detection 4321615b36bSBram Moolenaar set bg=light 4331615b36bSBram Moolenaar hi Normal ctermbg=4 4341615b36bSBram Moolenaar call assert_equal('light', &bg) 4351615b36bSBram Moolenaar set bg=dark 4361615b36bSBram Moolenaar hi Normal ctermbg=12 4371615b36bSBram Moolenaar call assert_equal('dark', &bg) 4386acadda8SBram Moolenaar 4396acadda8SBram Moolenaar hi Normal ctermbg=NONE 4401615b36bSBram Moolenaarendfunc 44106f1ed2fSBram Moolenaar 44206f1ed2fSBram Moolenaarfunc Test_syntax_hangs() 44306f1ed2fSBram Moolenaar if !has('reltime') || !has('float') || !has('syntax') 44406f1ed2fSBram Moolenaar return 44506f1ed2fSBram Moolenaar endif 44606f1ed2fSBram Moolenaar 44706f1ed2fSBram Moolenaar " This pattern takes a long time to match, it should timeout. 44806f1ed2fSBram Moolenaar new 44906f1ed2fSBram Moolenaar call setline(1, ['aaa', repeat('abc ', 1000), 'ccc']) 45006f1ed2fSBram Moolenaar let start = reltime() 45106f1ed2fSBram Moolenaar set nolazyredraw redrawtime=101 45206f1ed2fSBram Moolenaar syn match Error /\%#=1a*.*X\@<=b*/ 45306f1ed2fSBram Moolenaar redraw 45406f1ed2fSBram Moolenaar let elapsed = reltimefloat(reltime(start)) 45506f1ed2fSBram Moolenaar call assert_true(elapsed > 0.1) 45606f1ed2fSBram Moolenaar call assert_true(elapsed < 1.0) 45706f1ed2fSBram Moolenaar 45806f1ed2fSBram Moolenaar " second time syntax HL is disabled 45906f1ed2fSBram Moolenaar let start = reltime() 46006f1ed2fSBram Moolenaar redraw 46106f1ed2fSBram Moolenaar let elapsed = reltimefloat(reltime(start)) 46206f1ed2fSBram Moolenaar call assert_true(elapsed < 0.1) 46306f1ed2fSBram Moolenaar 46406f1ed2fSBram Moolenaar " after CTRL-L the timeout flag is reset 46506f1ed2fSBram Moolenaar let start = reltime() 46606f1ed2fSBram Moolenaar exe "normal \<C-L>" 46706f1ed2fSBram Moolenaar redraw 46806f1ed2fSBram Moolenaar let elapsed = reltimefloat(reltime(start)) 46906f1ed2fSBram Moolenaar call assert_true(elapsed > 0.1) 47006f1ed2fSBram Moolenaar call assert_true(elapsed < 1.0) 47106f1ed2fSBram Moolenaar 47206f1ed2fSBram Moolenaar set redrawtime& 47306f1ed2fSBram Moolenaar bwipe! 47406f1ed2fSBram Moolenaarendfunc 4754d785895SBram Moolenaar 4764d785895SBram Moolenaarfunc Test_conceal() 4774d785895SBram Moolenaar if !has('conceal') 4784d785895SBram Moolenaar return 4794d785895SBram Moolenaar endif 4804d785895SBram Moolenaar 4814d785895SBram Moolenaar new 4824d785895SBram Moolenaar call setline(1, ['', '123456']) 4834d785895SBram Moolenaar syn match test23 "23" conceal cchar=X 4844d785895SBram Moolenaar syn match test45 "45" conceal 4854d785895SBram Moolenaar 4864d785895SBram Moolenaar set conceallevel=0 4874d785895SBram Moolenaar call assert_equal('123456 ', ScreenLines(2, 7)[0]) 488cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 4894d785895SBram Moolenaar 4904d785895SBram Moolenaar set conceallevel=1 4914d785895SBram Moolenaar call assert_equal('1X 6 ', ScreenLines(2, 7)[0]) 492cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, ' ', 2], [1, ' ', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 4934d785895SBram Moolenaar 4944d785895SBram Moolenaar set conceallevel=1 4954d785895SBram Moolenaar set listchars=conceal:Y 496cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, 'Y', 2], [1, 'Y', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 4974d785895SBram Moolenaar call assert_equal('1XY6 ', ScreenLines(2, 7)[0]) 4984d785895SBram Moolenaar 4994d785895SBram Moolenaar set conceallevel=2 5004d785895SBram Moolenaar call assert_match('1X6 ', ScreenLines(2, 7)[0]) 501cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [1, 'X', 1], [1, 'X', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 5024d785895SBram Moolenaar 5034d785895SBram Moolenaar set conceallevel=3 5044d785895SBram Moolenaar call assert_match('16 ', ScreenLines(2, 7)[0]) 505cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [1, '', 1], [1, '', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 5064d785895SBram Moolenaar 5074d785895SBram Moolenaar syn clear 5084d785895SBram Moolenaar set conceallevel& 5094d785895SBram Moolenaar bw! 5104d785895SBram Moolenaarendfunc 5110b2eef24SBram Moolenaar 512da65058aSBram Moolenaarfunc Test_synstack_synIDtrans() 5130b2eef24SBram Moolenaar new 5140b2eef24SBram Moolenaar setfiletype c 5150b2eef24SBram Moolenaar syntax on 5160b2eef24SBram Moolenaar call setline(1, ' /* A comment with a TODO */') 5170b2eef24SBram Moolenaar 5180b2eef24SBram Moolenaar call assert_equal([], synstack(1, 1)) 5190b2eef24SBram Moolenaar 5200b2eef24SBram Moolenaar norm f/ 5210b2eef24SBram Moolenaar call assert_equal(['cComment', 'cCommentStart'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 5220b2eef24SBram Moolenaar call assert_equal(['Comment', 'Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 5230b2eef24SBram Moolenaar 5240b2eef24SBram Moolenaar norm fA 5250b2eef24SBram Moolenaar call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 5260b2eef24SBram Moolenaar call assert_equal(['Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 5270b2eef24SBram Moolenaar 5280b2eef24SBram Moolenaar norm fT 5290b2eef24SBram Moolenaar call assert_equal(['cComment', 'cTodo'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 5300b2eef24SBram Moolenaar call assert_equal(['Comment', 'Todo'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 5310b2eef24SBram Moolenaar 5320b2eef24SBram Moolenaar syn clear 5330b2eef24SBram Moolenaar bw! 5340b2eef24SBram Moolenaarendfunc 535da65058aSBram Moolenaar 536da65058aSBram Moolenaar" Check highlighting for a small piece of C code with a screen dump. 537da65058aSBram Moolenaarfunc Test_syntax_c() 5386bb2cdfeSBram Moolenaar if !CanRunVimInTerminal() 539*5d30ff19SBram Moolenaar throw 'Skipped: cannot make screendumps' 540da65058aSBram Moolenaar endif 541da65058aSBram Moolenaar call writefile([ 542da65058aSBram Moolenaar \ '/* comment line at the top */', 543da65058aSBram Moolenaar \ ' int', 544da65058aSBram Moolenaar \ 'main(int argc, char **argv)// another comment', 545da65058aSBram Moolenaar \ '{', 546da65058aSBram Moolenaar \ '#if 0', 547da65058aSBram Moolenaar \ ' int not_used;', 548da65058aSBram Moolenaar \ '#else', 549da65058aSBram Moolenaar \ ' int used;', 550da65058aSBram Moolenaar \ '#endif', 551da65058aSBram Moolenaar \ ' printf("Just an example piece of C code\n");', 552da65058aSBram Moolenaar \ ' return 0x0ff;', 553da65058aSBram Moolenaar \ '}', 554da65058aSBram Moolenaar \ ' static void', 555da65058aSBram Moolenaar \ 'myFunction(const double count, struct nothing, long there) {', 556da65058aSBram Moolenaar \ ' // 123: nothing to read here', 557da65058aSBram Moolenaar \ ' for (int i = 0; i < count; ++i) {', 558da65058aSBram Moolenaar \ ' break;', 559da65058aSBram Moolenaar \ ' }', 560da65058aSBram Moolenaar \ '}', 561da65058aSBram Moolenaar \ ], 'Xtest.c') 562b7ea7cb8SBram Moolenaar 563b7ea7cb8SBram Moolenaar " This makes the default for 'background' use "dark", check that the 564b7ea7cb8SBram Moolenaar " response to t_RB corrects it to "light". 565b7ea7cb8SBram Moolenaar let $COLORFGBG = '15;0' 566b7ea7cb8SBram Moolenaar 567da65058aSBram Moolenaar let buf = RunVimInTerminal('Xtest.c', {}) 5686bb2cdfeSBram Moolenaar call VerifyScreenDump(buf, 'Test_syntax_c_01', {}) 569da65058aSBram Moolenaar call StopVimInTerminal(buf) 570da65058aSBram Moolenaar 571b7ea7cb8SBram Moolenaar let $COLORFGBG = '' 572da65058aSBram Moolenaar call delete('Xtest.c') 573da65058aSBram Moolenaarendfun 574bcf94423SBram Moolenaar 575bcf94423SBram Moolenaar" Using \z() in a region with NFA failing should not crash. 576bcf94423SBram Moolenaarfunc Test_syn_wrong_z_one() 577bcf94423SBram Moolenaar new 578bcf94423SBram Moolenaar call setline(1, ['just some text', 'with foo and bar to match with']) 579bcf94423SBram Moolenaar syn region FooBar start="foo\z(.*\)bar" end="\z1" 580bcf94423SBram Moolenaar call test_override("nfa_fail", 1) 581bcf94423SBram Moolenaar redraw! 582bcf94423SBram Moolenaar redraw! 583bcf94423SBram Moolenaar call test_override("ALL", 0) 584bcf94423SBram Moolenaar bwipe! 585bcf94423SBram Moolenaarendfunc 586