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