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 30b46f57e8SBram Moolenaarfunc AssertHighlightGroups(lnum, startcol, expected, trans = 1, msg = "") 31b46f57e8SBram Moolenaar " Assert that the characters starting at a given (line, col) 32b46f57e8SBram Moolenaar " sequentially match the expected highlight groups. 33b46f57e8SBram Moolenaar " If groups are provided as a string, each character is assumed to be a 34b46f57e8SBram Moolenaar " group and spaces represent no group, useful for visually describing tests. 35b46f57e8SBram Moolenaar let l:expectedGroups = type(a:expected) == v:t_string 36b46f57e8SBram Moolenaar \ ? a:expected->split('\zs')->map({_, v -> trim(v)}) 37b46f57e8SBram Moolenaar \ : a:expected 38b46f57e8SBram Moolenaar let l:errors = 0 39b46f57e8SBram Moolenaar let l:msg = (a:msg->empty() ? "" : a:msg .. ": ") 40b46f57e8SBram Moolenaar \ .. "Wrong highlight group at " .. a:lnum .. "," 41b46f57e8SBram Moolenaar 42b46f57e8SBram Moolenaar for l:i in range(a:startcol, a:startcol + l:expectedGroups->len() - 1) 43b46f57e8SBram Moolenaar let l:errors += synID(a:lnum, l:i, a:trans) 44b46f57e8SBram Moolenaar \ ->synIDattr("name") 45b46f57e8SBram Moolenaar \ ->assert_equal(l:expectedGroups[l:i - 1], 46b46f57e8SBram Moolenaar \ l:msg .. l:i) 47b46f57e8SBram Moolenaar endfor 48b46f57e8SBram Moolenaarendfunc 49b46f57e8SBram Moolenaar 50b8060fe8SBram Moolenaarfunc Test_syn_iskeyword() 51b8060fe8SBram Moolenaar new 52b8060fe8SBram Moolenaar call setline(1, [ 53b8060fe8SBram Moolenaar \ 'CREATE TABLE FOOBAR(', 54b8060fe8SBram Moolenaar \ ' DLTD_BY VARCHAR2(100)', 55b8060fe8SBram Moolenaar \ ');', 56b8060fe8SBram Moolenaar \ '']) 57b8060fe8SBram Moolenaar 58b8060fe8SBram Moolenaar syntax on 59b8060fe8SBram Moolenaar set ft=sql 60b8060fe8SBram Moolenaar syn match SYN /C\k\+\>/ 61b8060fe8SBram Moolenaar hi link SYN ErrorMsg 62b8060fe8SBram Moolenaar call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 63b8060fe8SBram Moolenaar /\<D\k\+\>/:norm! ygn 64b8060fe8SBram Moolenaar call assert_equal('DLTD_BY', @0) 65b8060fe8SBram Moolenaar redir @c 66b8060fe8SBram Moolenaar syn iskeyword 67b8060fe8SBram Moolenaar redir END 68b8060fe8SBram Moolenaar call assert_equal("\nsyntax iskeyword not set", @c) 69b8060fe8SBram Moolenaar 70b8060fe8SBram Moolenaar syn iskeyword @,48-57,_,192-255 71b8060fe8SBram Moolenaar redir @c 72b8060fe8SBram Moolenaar syn iskeyword 73b8060fe8SBram Moolenaar redir END 74b8060fe8SBram Moolenaar call assert_equal("\nsyntax iskeyword @,48-57,_,192-255", @c) 75b8060fe8SBram Moolenaar 76b8060fe8SBram Moolenaar setlocal isk-=_ 77b8060fe8SBram Moolenaar call assert_equal('DLTD_BY', GetSyntaxItem('DLTD')) 78b8060fe8SBram Moolenaar /\<D\k\+\>/:norm! ygn 79b8060fe8SBram Moolenaar let b2 = @0 80b8060fe8SBram Moolenaar call assert_equal('DLTD', @0) 81b8060fe8SBram Moolenaar 82b8060fe8SBram Moolenaar syn iskeyword clear 83b8060fe8SBram Moolenaar redir @c 84b8060fe8SBram Moolenaar syn iskeyword 85b8060fe8SBram Moolenaar redir END 86b8060fe8SBram Moolenaar call assert_equal("\nsyntax iskeyword not set", @c) 87b8060fe8SBram Moolenaar 88b8060fe8SBram Moolenaar quit! 89b8060fe8SBram Moolenaarendfunc 90c3691332SBram Moolenaar 91c3691332SBram Moolenaarfunc Test_syntax_after_reload() 92c3691332SBram Moolenaar split Xsomefile 93c3691332SBram Moolenaar call setline(1, ['hello', 'there']) 94c3691332SBram Moolenaar w! 95c3691332SBram Moolenaar only! 96c3691332SBram Moolenaar setl filetype=hello 97c3691332SBram Moolenaar au FileType hello let g:gotit = 1 98c3691332SBram Moolenaar call assert_false(exists('g:gotit')) 99c3691332SBram Moolenaar edit other 100c3691332SBram Moolenaar buf Xsomefile 101c3691332SBram Moolenaar call assert_equal('hello', &filetype) 102c3691332SBram Moolenaar call assert_true(exists('g:gotit')) 103c3691332SBram Moolenaar call delete('Xsomefile') 10473b484c4SBram Moolenaarendfunc 10573b484c4SBram Moolenaar 10673b484c4SBram Moolenaarfunc Test_syntime() 1076d91bcb4SBram Moolenaar CheckFeature profile 10873b484c4SBram Moolenaar 10973b484c4SBram Moolenaar syntax on 11073b484c4SBram Moolenaar syntime on 11173b484c4SBram Moolenaar let a = execute('syntime report') 11273b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 11373b484c4SBram Moolenaar 114*6d37e8e3SDominique Pelle let a = execute('syntime clear') 115*6d37e8e3SDominique Pelle call assert_equal("\nNo Syntax items defined for this buffer", a) 116*6d37e8e3SDominique Pelle 11773b484c4SBram Moolenaar view ../memfile_test.c 11873b484c4SBram Moolenaar setfiletype cpp 11973b484c4SBram Moolenaar redraw 12073b484c4SBram Moolenaar let a = execute('syntime report') 12173b484c4SBram Moolenaar call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 12273b484c4SBram Moolenaar call assert_match(' \d*\.\d* \+[^0]\d* .* cppRawString ', a) 12373b484c4SBram Moolenaar call assert_match(' \d*\.\d* \+[^0]\d* .* cppNumber ', a) 12473b484c4SBram Moolenaar 12573b484c4SBram Moolenaar syntime off 12673b484c4SBram Moolenaar syntime clear 12773b484c4SBram Moolenaar let a = execute('syntime report') 12873b484c4SBram Moolenaar call assert_match('^ TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a) 12973b484c4SBram Moolenaar call assert_notmatch('.* cppRawString *', a) 13073b484c4SBram Moolenaar call assert_notmatch('.* cppNumber*', a) 13173b484c4SBram Moolenaar call assert_notmatch('[1-9]', a) 13273b484c4SBram Moolenaar 133e2e4075fSBram Moolenaar call assert_fails('syntime abc', 'E475:') 13473b484c4SBram Moolenaar 13573b484c4SBram Moolenaar syntax clear 13673b484c4SBram Moolenaar let a = execute('syntime report') 13773b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 13873b484c4SBram Moolenaar 13973b484c4SBram Moolenaar bd 14073b484c4SBram Moolenaarendfunc 14173b484c4SBram Moolenaar 142b513d307SBram Moolenaarfunc Test_syntime_completion() 1436d91bcb4SBram Moolenaar CheckFeature profile 144b513d307SBram Moolenaar 145b513d307SBram Moolenaar call feedkeys(":syntime \<C-A>\<C-B>\"\<CR>", 'tx') 146b513d307SBram Moolenaar call assert_equal('"syntime clear off on report', @:) 147b513d307SBram Moolenaarendfunc 148b513d307SBram Moolenaar 14973b484c4SBram Moolenaarfunc Test_syntax_list() 15073b484c4SBram Moolenaar syntax on 15173b484c4SBram Moolenaar let a = execute('syntax list') 15273b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 15373b484c4SBram Moolenaar 15473b484c4SBram Moolenaar view ../memfile_test.c 15573b484c4SBram Moolenaar setfiletype c 15673b484c4SBram Moolenaar 15773b484c4SBram Moolenaar let a = execute('syntax list') 15873b484c4SBram Moolenaar call assert_match('cInclude*', a) 15973b484c4SBram Moolenaar call assert_match('cDefine', a) 16073b484c4SBram Moolenaar 16173b484c4SBram Moolenaar let a = execute('syntax list cDefine') 16273b484c4SBram Moolenaar call assert_notmatch('cInclude*', a) 16373b484c4SBram Moolenaar call assert_match('cDefine', a) 16473b484c4SBram Moolenaar call assert_match(' links to Macro$', a) 16573b484c4SBram Moolenaar 16673b484c4SBram Moolenaar call assert_fails('syntax list ABCD', 'E28:') 16773b484c4SBram Moolenaar call assert_fails('syntax list @ABCD', 'E392:') 16873b484c4SBram Moolenaar 16973b484c4SBram Moolenaar syntax clear 17073b484c4SBram Moolenaar let a = execute('syntax list') 17173b484c4SBram Moolenaar call assert_equal("\nNo Syntax items defined for this buffer", a) 17273b484c4SBram Moolenaar 17308f4157cSBram Moolenaar syntax keyword Type int containedin=g1 skipwhite skipempty skipnl nextgroup=Abc 17408f4157cSBram Moolenaar let exp = "Type xxx containedin=g1 nextgroup=Abc skipnl skipwhite skipempty int" 17508f4157cSBram Moolenaar call assert_equal(exp, split(execute("syntax list"), "\n")[1]) 17608f4157cSBram Moolenaar 17773b484c4SBram Moolenaar bd 17873b484c4SBram Moolenaarendfunc 17973b484c4SBram Moolenaar 18073b484c4SBram Moolenaarfunc Test_syntax_completion() 18173b484c4SBram Moolenaar call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx') 182e35a52aeSBram Moolenaar call assert_equal('"syn case clear cluster conceal enable foldlevel include iskeyword keyword list manual match off on region reset spell sync', @:) 18373b484c4SBram Moolenaar 18473b484c4SBram Moolenaar call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx') 18573b484c4SBram Moolenaar call assert_equal('"syn case ignore match', @:) 18673b484c4SBram Moolenaar 1872d028390SBram Moolenaar call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx') 1882d028390SBram Moolenaar call assert_equal('"syn spell default notoplevel toplevel', @:) 1892d028390SBram Moolenaar 1902d028390SBram Moolenaar call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx') 1912d028390SBram Moolenaar call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:) 1922d028390SBram Moolenaar 193d61e8aaaSBram Moolenaar " Check that clearing "Aap" avoids it showing up before Boolean. 194d61e8aaaSBram Moolenaar hi Aap ctermfg=blue 195d61e8aaaSBram Moolenaar call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 196d61e8aaaSBram Moolenaar call assert_match('^"syn list Aap Boolean Character ', @:) 197d61e8aaaSBram Moolenaar hi clear Aap 198d61e8aaaSBram Moolenaar 19973b484c4SBram Moolenaar call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx') 20073b484c4SBram Moolenaar call assert_match('^"syn list Boolean Character ', @:) 20173b484c4SBram Moolenaar 20273b484c4SBram Moolenaar call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx') 20373b484c4SBram Moolenaar call assert_match('^"syn match Boolean Character ', @:) 204c3691332SBram Moolenaarendfunc 205de318c5cSBram Moolenaar 206297610baSBram Moolenaarfunc Test_echohl_completion() 207297610baSBram Moolenaar call feedkeys(":echohl no\<C-A>\<C-B>\"\<CR>", 'tx') 208297610baSBram Moolenaar call assert_equal('"echohl NonText Normal none', @:) 209297610baSBram Moolenaarendfunc 210297610baSBram Moolenaar 211de318c5cSBram Moolenaarfunc Test_syntax_arg_skipped() 212de318c5cSBram Moolenaar syn clear 213de318c5cSBram Moolenaar syntax case ignore 214de318c5cSBram Moolenaar if 0 215de318c5cSBram Moolenaar syntax case match 216de318c5cSBram Moolenaar endif 217de318c5cSBram Moolenaar call assert_match('case ignore', execute('syntax case')) 218de318c5cSBram Moolenaar 219de318c5cSBram Moolenaar syn keyword Foo foo 220de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax')) 221de318c5cSBram Moolenaar syn clear 222de318c5cSBram Moolenaar call assert_match('case match', execute('syntax case')) 223de318c5cSBram Moolenaar call assert_notmatch('Foo', execute('syntax')) 224de318c5cSBram Moolenaar 225de318c5cSBram Moolenaar if has('conceal') 226de318c5cSBram Moolenaar syn clear 227de318c5cSBram Moolenaar syntax conceal on 228de318c5cSBram Moolenaar if 0 229de318c5cSBram Moolenaar syntax conceal off 230de318c5cSBram Moolenaar endif 231de318c5cSBram Moolenaar call assert_match('conceal on', execute('syntax conceal')) 232de318c5cSBram Moolenaar syn clear 233de318c5cSBram Moolenaar call assert_match('conceal off', execute('syntax conceal')) 23458f60ca2SBram Moolenaar 23558f60ca2SBram Moolenaar syntax conceal on 23658f60ca2SBram Moolenaar syntax conceal off 23758f60ca2SBram Moolenaar call assert_match('conceal off', execute('syntax conceal')) 238de318c5cSBram Moolenaar endif 239de318c5cSBram Moolenaar 240d61e8aaaSBram Moolenaar syntax region Bar start=/</ end=/>/ 241de318c5cSBram Moolenaar if 0 242de318c5cSBram Moolenaar syntax region NotTest start=/</ end=/>/ contains=@Spell 243de318c5cSBram Moolenaar endif 244d61e8aaaSBram Moolenaar call assert_match('Bar', execute('syntax')) 245de318c5cSBram Moolenaar call assert_notmatch('NotTest', execute('syntax')) 246de318c5cSBram Moolenaar call assert_notmatch('Spell', execute('syntax')) 247de318c5cSBram Moolenaar 248de318c5cSBram Moolenaar hi Foo ctermfg=blue 249de318c5cSBram Moolenaar let a = execute('hi Foo') 250de318c5cSBram Moolenaar if 0 251de318c5cSBram Moolenaar syntax rest 252de318c5cSBram Moolenaar endif 253de318c5cSBram Moolenaar call assert_equal(a, execute('hi Foo')) 254d61e8aaaSBram Moolenaar hi clear Bar 255d61e8aaaSBram Moolenaar hi clear Foo 256de318c5cSBram Moolenaar 257de318c5cSBram Moolenaar set ft=tags 258de318c5cSBram Moolenaar syn off 259de318c5cSBram Moolenaar if 0 260de318c5cSBram Moolenaar syntax enable 261de318c5cSBram Moolenaar endif 262de318c5cSBram Moolenaar call assert_match('No Syntax items defined', execute('syntax')) 263de318c5cSBram Moolenaar syntax enable 264de318c5cSBram Moolenaar call assert_match('tagComment', execute('syntax')) 265de318c5cSBram Moolenaar set ft= 266de318c5cSBram Moolenaar 267de318c5cSBram Moolenaar syn clear 268de318c5cSBram Moolenaar if 0 269de318c5cSBram Moolenaar syntax include @Spell nothing 270de318c5cSBram Moolenaar endif 271de318c5cSBram Moolenaar call assert_notmatch('Spell', execute('syntax')) 272de318c5cSBram Moolenaar 273de318c5cSBram Moolenaar syn clear 274de318c5cSBram Moolenaar syn iskeyword 48-57,$,_ 275de318c5cSBram Moolenaar call assert_match('48-57,$,_', execute('syntax iskeyword')) 276de318c5cSBram Moolenaar if 0 277de318c5cSBram Moolenaar syn clear 278de318c5cSBram Moolenaar syn iskeyword clear 279de318c5cSBram Moolenaar endif 280de318c5cSBram Moolenaar call assert_match('48-57,$,_', execute('syntax iskeyword')) 281de318c5cSBram Moolenaar syn iskeyword clear 282de318c5cSBram Moolenaar call assert_match('not set', execute('syntax iskeyword')) 283de318c5cSBram Moolenaar syn iskeyword 48-57,$,_ 284de318c5cSBram Moolenaar syn clear 285de318c5cSBram Moolenaar call assert_match('not set', execute('syntax iskeyword')) 286de318c5cSBram Moolenaar 287de318c5cSBram Moolenaar syn clear 288de318c5cSBram Moolenaar syn keyword Foo foo 289de318c5cSBram Moolenaar if 0 290de318c5cSBram Moolenaar syn keyword NotAdded bar 291de318c5cSBram Moolenaar endif 292de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax')) 293de318c5cSBram Moolenaar call assert_notmatch('NotAdded', execute('highlight')) 294de318c5cSBram Moolenaar 295de318c5cSBram Moolenaar syn clear 296de318c5cSBram Moolenaar syn keyword Foo foo 297de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax')) 298de318c5cSBram Moolenaar call assert_match('Foo', execute('syntax list')) 299de318c5cSBram Moolenaar call assert_notmatch('Foo', execute('if 0 | syntax | endif')) 300de318c5cSBram Moolenaar call assert_notmatch('Foo', execute('if 0 | syntax list | endif')) 301de318c5cSBram Moolenaar 302de318c5cSBram Moolenaar syn clear 303de318c5cSBram Moolenaar syn match Fopi /asdf/ 304de318c5cSBram Moolenaar if 0 305de318c5cSBram Moolenaar syn match Fopx /asdf/ 306de318c5cSBram Moolenaar endif 307de318c5cSBram Moolenaar call assert_match('Fopi', execute('syntax')) 308de318c5cSBram Moolenaar call assert_notmatch('Fopx', execute('syntax')) 309de318c5cSBram Moolenaar 310de318c5cSBram Moolenaar syn clear 311de318c5cSBram Moolenaar syn spell toplevel 312de318c5cSBram Moolenaar call assert_match('spell toplevel', execute('syntax spell')) 313de318c5cSBram Moolenaar if 0 314de318c5cSBram Moolenaar syn spell notoplevel 315de318c5cSBram Moolenaar endif 316de318c5cSBram Moolenaar call assert_match('spell toplevel', execute('syntax spell')) 317de318c5cSBram Moolenaar syn spell notoplevel 318de318c5cSBram Moolenaar call assert_match('spell notoplevel', execute('syntax spell')) 319de318c5cSBram Moolenaar syn spell default 320de318c5cSBram Moolenaar call assert_match('spell default', execute('syntax spell')) 321de318c5cSBram Moolenaar 322de318c5cSBram Moolenaar syn clear 323de318c5cSBram Moolenaar if 0 324de318c5cSBram Moolenaar syntax cluster Spell 325de318c5cSBram Moolenaar endif 326de318c5cSBram Moolenaar call assert_notmatch('Spell', execute('syntax')) 327de318c5cSBram Moolenaar 328de318c5cSBram Moolenaar syn clear 329de318c5cSBram Moolenaar syn keyword Foo foo 330de318c5cSBram Moolenaar syn sync ccomment 331de318c5cSBram Moolenaar syn sync maxlines=5 332de318c5cSBram Moolenaar if 0 333de318c5cSBram Moolenaar syn sync maxlines=11 334de318c5cSBram Moolenaar endif 335de318c5cSBram Moolenaar call assert_match('on C-style comments', execute('syntax sync')) 336de318c5cSBram Moolenaar call assert_match('maximal 5 lines', execute('syntax sync')) 33758f60ca2SBram Moolenaar syn sync clear 338de318c5cSBram Moolenaar if 0 339de318c5cSBram Moolenaar syn sync ccomment 340de318c5cSBram Moolenaar endif 341de318c5cSBram Moolenaar call assert_notmatch('on C-style comments', execute('syntax sync')) 3429950280dSBram Moolenaar syn sync fromstart 3439950280dSBram Moolenaar call assert_match('syncing starts at the first line', execute('syntax sync')) 344de318c5cSBram Moolenaar 345de318c5cSBram Moolenaar syn clear 346de318c5cSBram Moolenaarendfunc 347de318c5cSBram Moolenaar 348fbf2122cSBram Moolenaar" Check for an error. Used when multiple errors are thrown and we are checking 349fbf2122cSBram Moolenaar" for an earliest error. 350fbf2122cSBram Moolenaarfunc AssertFails(cmd, errcode) 351fbf2122cSBram Moolenaar let save_exception = '' 352fbf2122cSBram Moolenaar try 353fbf2122cSBram Moolenaar exe a:cmd 354fbf2122cSBram Moolenaar catch 355fbf2122cSBram Moolenaar let save_exception = v:exception 356fbf2122cSBram Moolenaar endtry 357fbf2122cSBram Moolenaar call assert_match(a:errcode, save_exception) 358fbf2122cSBram Moolenaarendfunc 359fbf2122cSBram Moolenaar 360ea588154SBram Moolenaarfunc Test_syntax_invalid_arg() 36158f60ca2SBram Moolenaar call assert_fails('syntax case asdf', 'E390:') 362d61e8aaaSBram Moolenaar if has('conceal') 36358f60ca2SBram Moolenaar call assert_fails('syntax conceal asdf', 'E390:') 364d61e8aaaSBram Moolenaar endif 36558f60ca2SBram Moolenaar call assert_fails('syntax spell asdf', 'E390:') 366ea588154SBram Moolenaar call assert_fails('syntax clear @ABCD', 'E391:') 367fbf2122cSBram Moolenaar call assert_fails('syntax include random_file', 'E484:') 368fbf2122cSBram Moolenaar call assert_fails('syntax include <afile>', 'E495:') 369ea588154SBram Moolenaar call assert_fails('syntax sync x', 'E404:') 370ea588154SBram Moolenaar call assert_fails('syntax keyword Abc a[', 'E789:') 371ea588154SBram Moolenaar call assert_fails('syntax keyword Abc a[bc]d', 'E890:') 3729b7bf9e9SBram Moolenaar call assert_fails('syntax cluster Abc add=A add=', 'E406:') 373476a6131SBram Moolenaar 374476a6131SBram Moolenaar " Test for too many \z\( and unmatched \z\( 375476a6131SBram Moolenaar " Not able to use assert_fails() here because both E50:/E879: and E475: 376476a6131SBram Moolenaar " messages are emitted. 377476a6131SBram Moolenaar set regexpengine=1 378fbf2122cSBram Moolenaar call AssertFails("syntax region MyRegion start='\\z\\(' end='\\*/'", 'E52:') 379476a6131SBram Moolenaar 380476a6131SBram Moolenaar let cmd = "syntax region MyRegion start='" 381476a6131SBram Moolenaar let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'" 382fbf2122cSBram Moolenaar call AssertFails(cmd, 'E50:') 383476a6131SBram Moolenaar 384476a6131SBram Moolenaar set regexpengine=2 385fbf2122cSBram Moolenaar call AssertFails("syntax region MyRegion start='\\z\\(' end='\\*/'", 'E54:') 386476a6131SBram Moolenaar 387476a6131SBram Moolenaar let cmd = "syntax region MyRegion start='" 388476a6131SBram Moolenaar let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'" 389fbf2122cSBram Moolenaar call AssertFails(cmd, 'E879:') 390476a6131SBram Moolenaar set regexpengine& 391fbf2122cSBram Moolenaar 392fbf2122cSBram Moolenaar call AssertFails('syntax keyword cMyItem grouphere G1', 'E393:') 393fbf2122cSBram Moolenaar call AssertFails('syntax sync match Abc grouphere MyItem "abc"', 'E394:') 394fbf2122cSBram Moolenaar call AssertFails('syn keyword Type contains int', 'E395:') 395fbf2122cSBram Moolenaar call assert_fails('syntax include @Xxx', 'E397:') 396fbf2122cSBram Moolenaar call AssertFails('syntax region X start', 'E398:') 397fbf2122cSBram Moolenaar call assert_fails('syntax region X start="{"', 'E399:') 398fbf2122cSBram Moolenaar call AssertFails('syntax cluster contains=Abc', 'E400:') 399fbf2122cSBram Moolenaar call AssertFails("syntax match Character /'.'", 'E401:') 400fbf2122cSBram Moolenaar call AssertFails("syntax match Character /'.'/a", 'E402:') 401531be47aSBram Moolenaar call assert_fails('syntax sync linecont /\%(/', 'E53:') 402fbf2122cSBram Moolenaar call assert_fails('syntax sync linecont /pat', 'E404:') 403fbf2122cSBram Moolenaar call assert_fails('syntax sync linecont', 'E404:') 404fbf2122cSBram Moolenaar call assert_fails('syntax sync linecont /pat1/ linecont /pat2/', 'E403:') 405fbf2122cSBram Moolenaar call assert_fails('syntax sync minlines=a', 'E404:') 406fbf2122cSBram Moolenaar call AssertFails('syntax match ABC /x/ contains=', 'E406:') 407fbf2122cSBram Moolenaar call AssertFails("syntax match Character contains /'.'/", 'E405:') 408fbf2122cSBram Moolenaar call AssertFails('syntax match ccFoo "Foo" nextgroup=ALLBUT,F', 'E407:') 409fbf2122cSBram Moolenaar call AssertFails('syntax region Block start="{" contains=F,ALLBUT', 'E408:') 410fbf2122cSBram Moolenaar call AssertFails("syntax match Characters contains=a.*x /'.'/", 'E409:') 411531be47aSBram Moolenaar call assert_fails('syntax match Search /abc/ contains=ALLBUT,/\%(/', 'E53:') 41258f60ca2SBram Moolenaarendfunc 41358f60ca2SBram Moolenaar 41458f60ca2SBram Moolenaarfunc Test_syn_sync() 41558f60ca2SBram Moolenaar syntax region HereGroup start=/this/ end=/that/ 41658f60ca2SBram Moolenaar syntax sync match SyncHere grouphere HereGroup "pattern" 41758f60ca2SBram Moolenaar call assert_match('SyncHere', execute('syntax sync')) 41858f60ca2SBram Moolenaar syn sync clear 41958f60ca2SBram Moolenaar call assert_notmatch('SyncHere', execute('syntax sync')) 42058f60ca2SBram Moolenaar syn clear 42158f60ca2SBram Moolenaarendfunc 42258f60ca2SBram Moolenaar 42358f60ca2SBram Moolenaarfunc Test_syn_clear() 42458f60ca2SBram Moolenaar syntax keyword Foo foo 425d61e8aaaSBram Moolenaar syntax keyword Bar tar 42658f60ca2SBram Moolenaar call assert_match('Foo', execute('syntax')) 427d61e8aaaSBram Moolenaar call assert_match('Bar', execute('syntax')) 428c96272e3SBram Moolenaar call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 42958f60ca2SBram Moolenaar syn clear Foo 43058f60ca2SBram Moolenaar call assert_notmatch('Foo', execute('syntax')) 431d61e8aaaSBram Moolenaar call assert_match('Bar', execute('syntax')) 432c96272e3SBram Moolenaar call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 433d61e8aaaSBram Moolenaar syn clear Foo Bar 43458f60ca2SBram Moolenaar call assert_notmatch('Foo', execute('syntax')) 435d61e8aaaSBram Moolenaar call assert_notmatch('Bar', execute('syntax')) 436d61e8aaaSBram Moolenaar hi clear Foo 437c96272e3SBram Moolenaar call assert_equal('Foo', synIDattr(hlID("Foo"), "name")) 438d61e8aaaSBram Moolenaar hi clear Bar 439fbf2122cSBram Moolenaar call assert_fails('syntax clear invalid_syngroup', 'E28:') 44058f60ca2SBram Moolenaarendfunc 4414007ed4aSBram Moolenaar 4424007ed4aSBram Moolenaarfunc Test_invalid_name() 4434007ed4aSBram Moolenaar syn clear 4444007ed4aSBram Moolenaar syn keyword Nop yes 4454007ed4aSBram Moolenaar call assert_fails("syntax keyword Wr\x17ong bar", 'E669:') 4464007ed4aSBram Moolenaar syntax keyword @Wrong bar 4474007ed4aSBram Moolenaar call assert_match('W18:', execute('1messages')) 4484007ed4aSBram Moolenaar syn clear 4494007ed4aSBram Moolenaar hi clear Nop 4504007ed4aSBram Moolenaar hi clear @Wrong 4514007ed4aSBram Moolenaarendfunc 452f8ec9986SBram Moolenaar 453f8ec9986SBram Moolenaarfunc Test_ownsyntax() 454f8ec9986SBram Moolenaar new Xfoo 455f8ec9986SBram Moolenaar call setline(1, '#define FOO') 456f8ec9986SBram Moolenaar syntax on 457f8ec9986SBram Moolenaar set filetype=c 458d1f76afaSBram Moolenaar 459f8ec9986SBram Moolenaar ownsyntax perl 460d1f76afaSBram Moolenaar " this should not crash 461d1f76afaSBram Moolenaar set 462d1f76afaSBram Moolenaar 463f8ec9986SBram Moolenaar call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name')) 464f8ec9986SBram Moolenaar call assert_equal('c', b:current_syntax) 465f8ec9986SBram Moolenaar call assert_equal('perl', w:current_syntax) 466f8ec9986SBram Moolenaar 467f8ec9986SBram Moolenaar " A new split window should have the original syntax. 468f8ec9986SBram Moolenaar split 469f8ec9986SBram Moolenaar call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name')) 470f8ec9986SBram Moolenaar call assert_equal('c', b:current_syntax) 471f8ec9986SBram Moolenaar call assert_equal(0, exists('w:current_syntax')) 472f8ec9986SBram Moolenaar 473f8ec9986SBram Moolenaar wincmd x 474f8ec9986SBram Moolenaar call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name")) 475f8ec9986SBram Moolenaar 476f8ec9986SBram Moolenaar syntax off 477f8ec9986SBram Moolenaar set filetype& 478f8ec9986SBram Moolenaar %bw! 479f8ec9986SBram Moolenaarendfunc 480f8ec9986SBram Moolenaar 481f8ec9986SBram Moolenaarfunc Test_ownsyntax_completion() 482f8ec9986SBram Moolenaar call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx') 483ea7a08a5SBram Moolenaar call assert_equal('"ownsyntax java javacc javascript javascriptreact', @:) 484f8ec9986SBram Moolenaarendfunc 485ea588154SBram Moolenaar 486ea588154SBram Moolenaarfunc Test_highlight_invalid_arg() 487ea588154SBram Moolenaar if has('gui_running') 488ea588154SBram Moolenaar call assert_fails('hi XXX guifg=xxx', 'E254:') 489ea588154SBram Moolenaar endif 490ea588154SBram Moolenaar call assert_fails('hi DoesNotExist', 'E411:') 491ea588154SBram Moolenaar call assert_fails('hi link', 'E412:') 492ea588154SBram Moolenaar call assert_fails('hi link a', 'E412:') 493ea588154SBram Moolenaar call assert_fails('hi link a b c', 'E413:') 494ea588154SBram Moolenaar call assert_fails('hi XXX =', 'E415:') 495ea588154SBram Moolenaar call assert_fails('hi XXX cterm', 'E416:') 496ea588154SBram Moolenaar call assert_fails('hi XXX cterm=', 'E417:') 497ea588154SBram Moolenaar call assert_fails('hi XXX cterm=DoesNotExist', 'E418:') 498ea588154SBram Moolenaar call assert_fails('hi XXX ctermfg=DoesNotExist', 'E421:') 499ea588154SBram Moolenaar call assert_fails('hi XXX xxx=White', 'E423:') 500ea588154SBram Moolenaarendfunc 501ea588154SBram Moolenaar 5021615b36bSBram Moolenaarfunc Test_bg_detection() 5038c5a278fSBram Moolenaar CheckNotGui 5048c5a278fSBram Moolenaar 5051615b36bSBram Moolenaar " auto-detection of &bg, make sure sure it isn't set anywhere before 5061615b36bSBram Moolenaar " this test 5071615b36bSBram Moolenaar hi Normal ctermbg=0 5081615b36bSBram Moolenaar call assert_equal('dark', &bg) 5091615b36bSBram Moolenaar hi Normal ctermbg=4 5101615b36bSBram Moolenaar call assert_equal('dark', &bg) 5111615b36bSBram Moolenaar hi Normal ctermbg=12 5121615b36bSBram Moolenaar call assert_equal('light', &bg) 5131615b36bSBram Moolenaar hi Normal ctermbg=15 5141615b36bSBram Moolenaar call assert_equal('light', &bg) 5151615b36bSBram Moolenaar 5160b2eef24SBram Moolenaar " manually-set &bg takes precedence over auto-detection 5171615b36bSBram Moolenaar set bg=light 5181615b36bSBram Moolenaar hi Normal ctermbg=4 5191615b36bSBram Moolenaar call assert_equal('light', &bg) 5201615b36bSBram Moolenaar set bg=dark 5211615b36bSBram Moolenaar hi Normal ctermbg=12 5221615b36bSBram Moolenaar call assert_equal('dark', &bg) 5236acadda8SBram Moolenaar 5246acadda8SBram Moolenaar hi Normal ctermbg=NONE 5251615b36bSBram Moolenaarendfunc 52606f1ed2fSBram Moolenaar 52706f1ed2fSBram Moolenaarfunc Test_syntax_hangs() 5286d91bcb4SBram Moolenaar CheckFunction reltimefloat 5296d91bcb4SBram Moolenaar CheckFeature syntax 53006f1ed2fSBram Moolenaar 53106f1ed2fSBram Moolenaar " This pattern takes a long time to match, it should timeout. 53206f1ed2fSBram Moolenaar new 53306f1ed2fSBram Moolenaar call setline(1, ['aaa', repeat('abc ', 1000), 'ccc']) 53406f1ed2fSBram Moolenaar let start = reltime() 53506f1ed2fSBram Moolenaar set nolazyredraw redrawtime=101 53606f1ed2fSBram Moolenaar syn match Error /\%#=1a*.*X\@<=b*/ 53706f1ed2fSBram Moolenaar redraw 53806f1ed2fSBram Moolenaar let elapsed = reltimefloat(reltime(start)) 53906f1ed2fSBram Moolenaar call assert_true(elapsed > 0.1) 54006f1ed2fSBram Moolenaar call assert_true(elapsed < 1.0) 54106f1ed2fSBram Moolenaar 54206f1ed2fSBram Moolenaar " second time syntax HL is disabled 54306f1ed2fSBram Moolenaar let start = reltime() 54406f1ed2fSBram Moolenaar redraw 54506f1ed2fSBram Moolenaar let elapsed = reltimefloat(reltime(start)) 54606f1ed2fSBram Moolenaar call assert_true(elapsed < 0.1) 54706f1ed2fSBram Moolenaar 54806f1ed2fSBram Moolenaar " after CTRL-L the timeout flag is reset 54906f1ed2fSBram Moolenaar let start = reltime() 55006f1ed2fSBram Moolenaar exe "normal \<C-L>" 55106f1ed2fSBram Moolenaar redraw 55206f1ed2fSBram Moolenaar let elapsed = reltimefloat(reltime(start)) 55306f1ed2fSBram Moolenaar call assert_true(elapsed > 0.1) 55406f1ed2fSBram Moolenaar call assert_true(elapsed < 1.0) 55506f1ed2fSBram Moolenaar 55606f1ed2fSBram Moolenaar set redrawtime& 55706f1ed2fSBram Moolenaar bwipe! 55806f1ed2fSBram Moolenaarendfunc 5594d785895SBram Moolenaar 5604d785895SBram Moolenaarfunc Test_conceal() 5616d91bcb4SBram Moolenaar CheckFeature conceal 5624d785895SBram Moolenaar 5634d785895SBram Moolenaar new 5644d785895SBram Moolenaar call setline(1, ['', '123456']) 5654d785895SBram Moolenaar syn match test23 "23" conceal cchar=X 5664d785895SBram Moolenaar syn match test45 "45" conceal 5674d785895SBram Moolenaar 5684d785895SBram Moolenaar set conceallevel=0 5694d785895SBram Moolenaar call assert_equal('123456 ', ScreenLines(2, 7)[0]) 570cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 5714d785895SBram Moolenaar 5724d785895SBram Moolenaar set conceallevel=1 5734d785895SBram Moolenaar call assert_equal('1X 6 ', ScreenLines(2, 7)[0]) 574cc0750dcSBram 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)')) 5754d785895SBram Moolenaar 5764d785895SBram Moolenaar set conceallevel=1 5774d785895SBram Moolenaar set listchars=conceal:Y 578cc0750dcSBram 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)')) 5794d785895SBram Moolenaar call assert_equal('1XY6 ', ScreenLines(2, 7)[0]) 5804d785895SBram Moolenaar 5814d785895SBram Moolenaar set conceallevel=2 5824d785895SBram Moolenaar call assert_match('1X6 ', ScreenLines(2, 7)[0]) 583cc0750dcSBram 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)')) 5844d785895SBram Moolenaar 5854d785895SBram Moolenaar set conceallevel=3 5864d785895SBram Moolenaar call assert_match('16 ', ScreenLines(2, 7)[0]) 587cc0750dcSBram Moolenaar call assert_equal([[0, '', 0], [1, '', 1], [1, '', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)')) 5884d785895SBram Moolenaar 589fbf2122cSBram Moolenaar call AssertFails("syntax match Entity '&' conceal cchar=\<Tab>", 'E844:') 590fbf2122cSBram Moolenaar 5914d785895SBram Moolenaar syn clear 5924d785895SBram Moolenaar set conceallevel& 5934d785895SBram Moolenaar bw! 5944d785895SBram Moolenaarendfunc 5950b2eef24SBram Moolenaar 596da65058aSBram Moolenaarfunc Test_synstack_synIDtrans() 5970b2eef24SBram Moolenaar new 5980b2eef24SBram Moolenaar setfiletype c 5990b2eef24SBram Moolenaar syntax on 6000b2eef24SBram Moolenaar call setline(1, ' /* A comment with a TODO */') 6010b2eef24SBram Moolenaar 6020b2eef24SBram Moolenaar call assert_equal([], synstack(1, 1)) 6030b2eef24SBram Moolenaar 6040b2eef24SBram Moolenaar norm f/ 605a74e4946SBram Moolenaar eval synstack(line("."), col("."))->map('synIDattr(v:val, "name")')->assert_equal(['cComment', 'cCommentStart']) 606a74e4946SBram Moolenaar eval synstack(line("."), col("."))->map('synIDattr(synIDtrans(v:val), "name")')->assert_equal(['Comment', 'Comment']) 6070b2eef24SBram Moolenaar 6080b2eef24SBram Moolenaar norm fA 6090b2eef24SBram Moolenaar call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 6100b2eef24SBram Moolenaar call assert_equal(['Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 6110b2eef24SBram Moolenaar 6120b2eef24SBram Moolenaar norm fT 6130b2eef24SBram Moolenaar call assert_equal(['cComment', 'cTodo'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 6140b2eef24SBram Moolenaar call assert_equal(['Comment', 'Todo'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")')) 6150b2eef24SBram Moolenaar 6160e05de46SBram Moolenaar call assert_fails("let n=synIDtrans([])", 'E745:') 6170e05de46SBram Moolenaar 6180b2eef24SBram Moolenaar syn clear 6190b2eef24SBram Moolenaar bw! 6200b2eef24SBram Moolenaarendfunc 621da65058aSBram Moolenaar 622da65058aSBram Moolenaar" Check highlighting for a small piece of C code with a screen dump. 623da65058aSBram Moolenaarfunc Test_syntax_c() 624494e9069SBram Moolenaar CheckRunVimInTerminal 625da65058aSBram Moolenaar call writefile([ 626da65058aSBram Moolenaar \ '/* comment line at the top */', 62783e9a1ceSBram Moolenaar \ 'int main(int argc, char **argv) { // another comment', 628da65058aSBram Moolenaar \ '#if 0', 629da65058aSBram Moolenaar \ ' int not_used;', 630da65058aSBram Moolenaar \ '#else', 631da65058aSBram Moolenaar \ ' int used;', 632da65058aSBram Moolenaar \ '#endif', 633da65058aSBram Moolenaar \ ' printf("Just an example piece of C code\n");', 634da65058aSBram Moolenaar \ ' return 0x0ff;', 635da65058aSBram Moolenaar \ '}', 63682260afbSBram Moolenaar \ "\t\t ", 637da65058aSBram Moolenaar \ ' static void', 638da65058aSBram Moolenaar \ 'myFunction(const double count, struct nothing, long there) {', 6398459006aSBram Moolenaar \ "\t// 123: nothing to endif here", 6409115c611SBram Moolenaar \ "\tfor (int i = 0; i < count; ++i) {", 6419115c611SBram Moolenaar \ "\t break;", 6429115c611SBram Moolenaar \ "\t}", 643bbfd1562SBram Moolenaar \ "\tNote: asdf", 644da65058aSBram Moolenaar \ '}', 645da65058aSBram Moolenaar \ ], 'Xtest.c') 646b7ea7cb8SBram Moolenaar 647b7ea7cb8SBram Moolenaar " This makes the default for 'background' use "dark", check that the 648b7ea7cb8SBram Moolenaar " response to t_RB corrects it to "light". 649b7ea7cb8SBram Moolenaar let $COLORFGBG = '15;0' 650b7ea7cb8SBram Moolenaar 65183e9a1ceSBram Moolenaar let buf = RunVimInTerminal('Xtest.c', {}) 652bbfd1562SBram Moolenaar call term_sendkeys(buf, ":syn keyword Search Note\r") 65382260afbSBram Moolenaar call term_sendkeys(buf, ":syn match Error /^\\s\\+$/\r") 6548459006aSBram Moolenaar call term_sendkeys(buf, ":set hlsearch\r") 6558459006aSBram Moolenaar call term_sendkeys(buf, "/endif\r") 6568459006aSBram Moolenaar call term_sendkeys(buf, "vjfC") 6576bb2cdfeSBram Moolenaar call VerifyScreenDump(buf, 'Test_syntax_c_01', {}) 6588459006aSBram Moolenaar 6598459006aSBram Moolenaar call term_sendkeys(buf, "\<Esc>") 660da65058aSBram Moolenaar call StopVimInTerminal(buf) 661da65058aSBram Moolenaar 662b7ea7cb8SBram Moolenaar let $COLORFGBG = '' 663da65058aSBram Moolenaar call delete('Xtest.c') 664da65058aSBram Moolenaarendfun 665bcf94423SBram Moolenaar 666bcf94423SBram Moolenaar" Using \z() in a region with NFA failing should not crash. 667bcf94423SBram Moolenaarfunc Test_syn_wrong_z_one() 668bcf94423SBram Moolenaar new 669bcf94423SBram Moolenaar call setline(1, ['just some text', 'with foo and bar to match with']) 670bcf94423SBram Moolenaar syn region FooBar start="foo\z(.*\)bar" end="\z1" 671bcf94423SBram Moolenaar call test_override("nfa_fail", 1) 672bcf94423SBram Moolenaar redraw! 673bcf94423SBram Moolenaar redraw! 674bcf94423SBram Moolenaar call test_override("ALL", 0) 675bcf94423SBram Moolenaar bwipe! 676bcf94423SBram Moolenaarendfunc 677c7f1e400SBram Moolenaar 678c7f1e400SBram Moolenaarfunc Test_syntax_after_bufdo() 679c7f1e400SBram Moolenaar call writefile(['/* aaa comment */'], 'Xaaa.c') 680c7f1e400SBram Moolenaar call writefile(['/* bbb comment */'], 'Xbbb.c') 681c7f1e400SBram Moolenaar call writefile(['/* ccc comment */'], 'Xccc.c') 682c7f1e400SBram Moolenaar call writefile(['/* ddd comment */'], 'Xddd.c') 683c7f1e400SBram Moolenaar 684c7f1e400SBram Moolenaar let bnr = bufnr('%') 685c7f1e400SBram Moolenaar new Xaaa.c 686c7f1e400SBram Moolenaar badd Xbbb.c 687c7f1e400SBram Moolenaar badd Xccc.c 688c7f1e400SBram Moolenaar badd Xddd.c 689c7f1e400SBram Moolenaar exe "bwipe " . bnr 690c7f1e400SBram Moolenaar let l = [] 691c7f1e400SBram Moolenaar bufdo call add(l, bufnr('%')) 692c7f1e400SBram Moolenaar call assert_equal(4, len(l)) 693c7f1e400SBram Moolenaar 694c7f1e400SBram Moolenaar syntax on 695c7f1e400SBram Moolenaar 696c7f1e400SBram Moolenaar " This used to only enable syntax HL in the last buffer. 697c7f1e400SBram Moolenaar bufdo tab split 698c7f1e400SBram Moolenaar tabrewind 699c7f1e400SBram Moolenaar for tab in range(1, 4) 700c7f1e400SBram Moolenaar norm fm 701c7f1e400SBram Moolenaar call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")')) 702c7f1e400SBram Moolenaar tabnext 703c7f1e400SBram Moolenaar endfor 704c7f1e400SBram Moolenaar 705c7f1e400SBram Moolenaar bwipe! Xaaa.c 706c7f1e400SBram Moolenaar bwipe! Xbbb.c 707c7f1e400SBram Moolenaar bwipe! Xccc.c 708c7f1e400SBram Moolenaar bwipe! Xddd.c 709c7f1e400SBram Moolenaar syntax off 710c7f1e400SBram Moolenaar call delete('Xaaa.c') 711c7f1e400SBram Moolenaar call delete('Xbbb.c') 712c7f1e400SBram Moolenaar call delete('Xccc.c') 713c7f1e400SBram Moolenaar call delete('Xddd.c') 714c7f1e400SBram Moolenaarendfunc 7150e05de46SBram Moolenaar 716e35a52aeSBram Moolenaarfunc Test_syntax_foldlevel() 717e35a52aeSBram Moolenaar new 718e35a52aeSBram Moolenaar call setline(1, [ 719e35a52aeSBram Moolenaar \ 'void f(int a)', 720e35a52aeSBram Moolenaar \ '{', 721e35a52aeSBram Moolenaar \ ' if (a == 1) {', 722e35a52aeSBram Moolenaar \ ' a = 0;', 723e35a52aeSBram Moolenaar \ ' } else if (a == 2) {', 724e35a52aeSBram Moolenaar \ ' a = 1;', 725e35a52aeSBram Moolenaar \ ' } else {', 726e35a52aeSBram Moolenaar \ ' a = 2;', 727e35a52aeSBram Moolenaar \ ' }', 728e35a52aeSBram Moolenaar \ ' if (a > 0) {', 729e35a52aeSBram Moolenaar \ ' if (a == 1) {', 730e35a52aeSBram Moolenaar \ ' a = 0;', 731e35a52aeSBram Moolenaar \ ' } /* missing newline */ } /* end of outer if */ else {', 732e35a52aeSBram Moolenaar \ ' a = 1;', 733e35a52aeSBram Moolenaar \ ' }', 734e35a52aeSBram Moolenaar \ ' if (a == 1)', 735e35a52aeSBram Moolenaar \ ' {', 736e35a52aeSBram Moolenaar \ ' a = 0;', 737e35a52aeSBram Moolenaar \ ' }', 738e35a52aeSBram Moolenaar \ ' else if (a == 2)', 739e35a52aeSBram Moolenaar \ ' {', 740e35a52aeSBram Moolenaar \ ' a = 1;', 741e35a52aeSBram Moolenaar \ ' }', 742e35a52aeSBram Moolenaar \ ' else', 743e35a52aeSBram Moolenaar \ ' {', 744e35a52aeSBram Moolenaar \ ' a = 2;', 745e35a52aeSBram Moolenaar \ ' }', 746e35a52aeSBram Moolenaar \ '}', 747e35a52aeSBram Moolenaar \ ]) 748e35a52aeSBram Moolenaar setfiletype c 749e35a52aeSBram Moolenaar syntax on 750e35a52aeSBram Moolenaar set foldmethod=syntax 751e35a52aeSBram Moolenaar 752e2e4075fSBram Moolenaar call assert_fails('syn foldlevel start start', 'E390:') 753e2e4075fSBram Moolenaar call assert_fails('syn foldlevel not_an_option', 'E390:') 754e35a52aeSBram Moolenaar 755e35a52aeSBram Moolenaar set foldlevel=1 756e35a52aeSBram Moolenaar 757e35a52aeSBram Moolenaar syn foldlevel start 758e35a52aeSBram Moolenaar redir @c 759e35a52aeSBram Moolenaar syn foldlevel 760e35a52aeSBram Moolenaar redir END 761e35a52aeSBram Moolenaar call assert_equal("\nsyntax foldlevel start", @c) 762e35a52aeSBram Moolenaar syn sync fromstart 7639950280dSBram Moolenaar call assert_match('from the first line$', execute('syn sync')) 764e35a52aeSBram Moolenaar let a = map(range(3,9), 'foldclosed(v:val)') 765e35a52aeSBram Moolenaar call assert_equal([3,3,3,3,3,3,3], a) " attached cascade folds together 766e35a52aeSBram Moolenaar let a = map(range(10,15), 'foldclosed(v:val)') 767e35a52aeSBram Moolenaar call assert_equal([10,10,10,10,10,10], a) " over-attached 'else' hidden 768e35a52aeSBram Moolenaar let a = map(range(16,27), 'foldclosed(v:val)') 769e35a52aeSBram Moolenaar let unattached_results = [-1,17,17,17,-1,21,21,21,-1,25,25,25] 770e35a52aeSBram Moolenaar call assert_equal(unattached_results, a) " unattached cascade folds separately 771e35a52aeSBram Moolenaar 772e35a52aeSBram Moolenaar syn foldlevel minimum 773e35a52aeSBram Moolenaar redir @c 774e35a52aeSBram Moolenaar syn foldlevel 775e35a52aeSBram Moolenaar redir END 776e35a52aeSBram Moolenaar call assert_equal("\nsyntax foldlevel minimum", @c) 777e35a52aeSBram Moolenaar syn sync fromstart 778e35a52aeSBram Moolenaar let a = map(range(3,9), 'foldclosed(v:val)') 779e35a52aeSBram Moolenaar call assert_equal([3,3,5,5,7,7,7], a) " attached cascade folds separately 780e35a52aeSBram Moolenaar let a = map(range(10,15), 'foldclosed(v:val)') 781e35a52aeSBram Moolenaar call assert_equal([10,10,10,13,13,13], a) " over-attached 'else' visible 782e35a52aeSBram Moolenaar let a = map(range(16,27), 'foldclosed(v:val)') 783e35a52aeSBram Moolenaar call assert_equal(unattached_results, a) " unattached cascade folds separately 784e35a52aeSBram Moolenaar 785e35a52aeSBram Moolenaar set foldlevel=2 786e35a52aeSBram Moolenaar 787e35a52aeSBram Moolenaar syn foldlevel start 788e35a52aeSBram Moolenaar syn sync fromstart 789e35a52aeSBram Moolenaar let a = map(range(11,14), 'foldclosed(v:val)') 790e35a52aeSBram Moolenaar call assert_equal([11,11,11,-1], a) " over-attached 'else' hidden 791e35a52aeSBram Moolenaar 792e35a52aeSBram Moolenaar syn foldlevel minimum 793e35a52aeSBram Moolenaar syn sync fromstart 794e35a52aeSBram Moolenaar let a = map(range(11,14), 'foldclosed(v:val)') 795e35a52aeSBram Moolenaar call assert_equal([11,11,-1,-1], a) " over-attached 'else' visible 796e35a52aeSBram Moolenaar 797e35a52aeSBram Moolenaar quit! 798e35a52aeSBram Moolenaarendfunc 799e35a52aeSBram Moolenaar 800adc17a5fSBram Moolenaarfunc Test_search_syntax_skip() 801adc17a5fSBram Moolenaar new 802adc17a5fSBram Moolenaar let lines =<< trim END 803adc17a5fSBram Moolenaar 804adc17a5fSBram Moolenaar /* This is VIM */ 805adc17a5fSBram Moolenaar Another Text for VIM 806adc17a5fSBram Moolenaar let a = "VIM" 807adc17a5fSBram Moolenaar END 808adc17a5fSBram Moolenaar call setline(1, lines) 809adc17a5fSBram Moolenaar syntax on 810adc17a5fSBram Moolenaar syntax match Comment "^/\*.*\*/" 811adc17a5fSBram Moolenaar syntax match String '".*"' 812adc17a5fSBram Moolenaar 813adc17a5fSBram Moolenaar " Skip argument using string evaluation. 814adc17a5fSBram Moolenaar 1 815adc17a5fSBram Moolenaar call search('VIM', 'w', '', 0, 'synIDattr(synID(line("."), col("."), 1), "name") =~? "comment"') 816adc17a5fSBram Moolenaar call assert_equal('Another Text for VIM', getline('.')) 817adc17a5fSBram Moolenaar 1 818adc17a5fSBram Moolenaar call search('VIM', 'w', '', 0, 'synIDattr(synID(line("."), col("."), 1), "name") !~? "string"') 819adc17a5fSBram Moolenaar call assert_equal(' let a = "VIM"', getline('.')) 820adc17a5fSBram Moolenaar 821adc17a5fSBram Moolenaar " Skip argument using Lambda. 822adc17a5fSBram Moolenaar 1 823adc17a5fSBram Moolenaar call search('VIM', 'w', '', 0, { -> synIDattr(synID(line("."), col("."), 1), "name") =~? "comment"}) 824adc17a5fSBram Moolenaar call assert_equal('Another Text for VIM', getline('.')) 825adc17a5fSBram Moolenaar 826adc17a5fSBram Moolenaar 1 827adc17a5fSBram Moolenaar call search('VIM', 'w', '', 0, { -> synIDattr(synID(line("."), col("."), 1), "name") !~? "string"}) 828adc17a5fSBram Moolenaar call assert_equal(' let a = "VIM"', getline('.')) 829adc17a5fSBram Moolenaar 830adc17a5fSBram Moolenaar " Skip argument using funcref. 831adc17a5fSBram Moolenaar func InComment() 832adc17a5fSBram Moolenaar return synIDattr(synID(line("."), col("."), 1), "name") =~? "comment" 833adc17a5fSBram Moolenaar endfunc 834adc17a5fSBram Moolenaar func InString() 835adc17a5fSBram Moolenaar return synIDattr(synID(line("."), col("."), 1), "name") !~? "string" 836adc17a5fSBram Moolenaar endfunc 837adc17a5fSBram Moolenaar 1 838adc17a5fSBram Moolenaar call search('VIM', 'w', '', 0, function('InComment')) 839adc17a5fSBram Moolenaar call assert_equal('Another Text for VIM', getline('.')) 840adc17a5fSBram Moolenaar 841adc17a5fSBram Moolenaar 1 842adc17a5fSBram Moolenaar call search('VIM', 'w', '', 0, function('InString')) 843adc17a5fSBram Moolenaar call assert_equal(' let a = "VIM"', getline('.')) 844adc17a5fSBram Moolenaar 845adc17a5fSBram Moolenaar delfunc InComment 846adc17a5fSBram Moolenaar delfunc InString 847adc17a5fSBram Moolenaar bwipe! 848adc17a5fSBram Moolenaarendfunc 849adc17a5fSBram Moolenaar 850b46f57e8SBram Moolenaarfunc Test_syn_contained_transparent() 851b46f57e8SBram Moolenaar " Comments starting with "Regression:" show the result when the highlighting 852b46f57e8SBram Moolenaar " span of the containing item is assigned to the contained region. 853b46f57e8SBram Moolenaar syntax on 854b46f57e8SBram Moolenaar 855b46f57e8SBram Moolenaar let l:case = "Transparent region contained in region" 856b46f57e8SBram Moolenaar new 857b46f57e8SBram Moolenaar syntax region X start=/\[/ end=/\]/ contained transparent 858b46f57e8SBram Moolenaar syntax region Y start=/(/ end=/)/ contains=X 859b46f57e8SBram Moolenaar 860b46f57e8SBram Moolenaar call setline(1, "==(--[~~]--)==") 861b46f57e8SBram Moolenaar let l:expected = " YYYYYYYYYY " 862b46f57e8SBram Moolenaar eval AssertHighlightGroups(1, 1, l:expected, 1, l:case) 863b46f57e8SBram Moolenaar syntax clear Y X 864b46f57e8SBram Moolenaar bw! 865b46f57e8SBram Moolenaar 866b46f57e8SBram Moolenaar let l:case = "Transparent region extends region" 867b46f57e8SBram Moolenaar new 868b46f57e8SBram Moolenaar syntax region X start=/\[/ end=/\]/ contained transparent 869b46f57e8SBram Moolenaar syntax region Y start=/(/ end=/)/ end=/e/ contains=X 870b46f57e8SBram Moolenaar 871b46f57e8SBram Moolenaar call setline(1, "==(--[~~e~~]--)==") 872b46f57e8SBram Moolenaar let l:expected = " YYYYYYYYYYYYY " 873b46f57e8SBram Moolenaar " Regression: " YYYYYYY YYY " 874b46f57e8SBram Moolenaar eval AssertHighlightGroups(1, 1, l:expected, 1, l:case) 875b46f57e8SBram Moolenaar syntax clear Y X 876b46f57e8SBram Moolenaar bw! 877b46f57e8SBram Moolenaar 878b46f57e8SBram Moolenaar let l:case = "Nested transparent regions extend region" 879b46f57e8SBram Moolenaar new 880b46f57e8SBram Moolenaar syntax region X start=/\[/ end=/\]/ contained transparent 881b46f57e8SBram Moolenaar syntax region Y start=/(/ end=/)/ end=/e/ contains=X 882b46f57e8SBram Moolenaar 883b46f57e8SBram Moolenaar call setline(1, "==(--[~~e~~[~~e~~]~~e~~]--)==") 884b46f57e8SBram Moolenaar let l:expected = " YYYYYYYYYYYYYYYYYYYYYYYYY " 885b46f57e8SBram Moolenaar " Regression: " YYYYYYY YYYYYYYYY " 886b46f57e8SBram Moolenaar eval AssertHighlightGroups(1, 1, l:expected, 1, l:case) 887b46f57e8SBram Moolenaar syntax clear Y X 888b46f57e8SBram Moolenaar bw! 889b46f57e8SBram Moolenaar 890b46f57e8SBram Moolenaar let l:case = "Transparent region contained in match" 891b46f57e8SBram Moolenaar new 892b46f57e8SBram Moolenaar syntax region X start=/\[/ end=/\]/ contained transparent 893b46f57e8SBram Moolenaar syntax match Y /(.\{-})/ contains=X 894b46f57e8SBram Moolenaar 895b46f57e8SBram Moolenaar call setline(1, "==(--[~~]--)==") 896b46f57e8SBram Moolenaar let l:expected = " YYYYYYYYYY " 897b46f57e8SBram Moolenaar eval AssertHighlightGroups(1, 1, l:expected, 1, l:case) 898b46f57e8SBram Moolenaar syntax clear Y X 899b46f57e8SBram Moolenaar bw! 900b46f57e8SBram Moolenaar 901b46f57e8SBram Moolenaar let l:case = "Transparent region extends match" 902b46f57e8SBram Moolenaar new 903b46f57e8SBram Moolenaar syntax region X start=/\[/ end=/\]/ contained transparent 904b46f57e8SBram Moolenaar syntax match Y /(.\{-}[e)]/ contains=X 905b46f57e8SBram Moolenaar 906b46f57e8SBram Moolenaar call setline(1, "==(--[~~e~~]--)==") 907b46f57e8SBram Moolenaar let l:expected = " YYYYYYYYYY " 908b46f57e8SBram Moolenaar " Regression: " YYYYYYY " 909b46f57e8SBram Moolenaar eval AssertHighlightGroups(1, 1, l:expected, 1, l:case) 910b46f57e8SBram Moolenaar syntax clear Y X 911b46f57e8SBram Moolenaar bw! 912b46f57e8SBram Moolenaar 913b46f57e8SBram Moolenaar let l:case = "Nested transparent regions extend match" 914b46f57e8SBram Moolenaar new 915b46f57e8SBram Moolenaar syntax region X start=/\[/ end=/\]/ contained transparent 916b46f57e8SBram Moolenaar syntax match Y /(.\{-}[e)]/ contains=X 917b46f57e8SBram Moolenaar 918b46f57e8SBram Moolenaar call setline(1, "==(--[~~e~~[~~e~~]~~e~~]--)==") 919b46f57e8SBram Moolenaar let l:expected = " YYYYYYYYYYYYYYYYYYYYYY " 920b46f57e8SBram Moolenaar " Regression: " YYYYYYY YYYYYY " 921b46f57e8SBram Moolenaar eval AssertHighlightGroups(1, 1, l:expected, 1, l:case) 922b46f57e8SBram Moolenaar syntax clear Y X 923b46f57e8SBram Moolenaar bw! 924b46f57e8SBram Moolenaarendfunc 925b46f57e8SBram Moolenaar 9262e240bd4SBram Moolenaarfunc Test_syn_include_contains_TOP() 9272e240bd4SBram Moolenaar let l:case = "TOP in included syntax means its group list name" 9282e240bd4SBram Moolenaar new 9292e240bd4SBram Moolenaar syntax include @INCLUDED syntax/c.vim 9302e240bd4SBram Moolenaar syntax region FencedCodeBlockC start=/```c/ end=/```/ contains=@INCLUDED 9312e240bd4SBram Moolenaar 9322e240bd4SBram Moolenaar call setline(1, ['```c', '#if 0', 'int', '#else', 'int', '#endif', '```' ]) 9332e240bd4SBram Moolenaar let l:expected = ["cCppOutIf2"] 9342e240bd4SBram Moolenaar eval AssertHighlightGroups(3, 1, l:expected, 1) 9352e240bd4SBram Moolenaar " cCppOutElse has contains=TOP 9362e240bd4SBram Moolenaar let l:expected = ["cType"] 9372e240bd4SBram Moolenaar eval AssertHighlightGroups(5, 1, l:expected, 1, l:case) 9382e240bd4SBram Moolenaar syntax clear 9392e240bd4SBram Moolenaar bw! 9402e240bd4SBram Moolenaarendfunc 9412e240bd4SBram Moolenaar 9422e240bd4SBram Moolenaar 9430e05de46SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 944