xref: /vim-8.2.3635/src/testdir/test_syntax.vim (revision 6d37e8e3)
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 '&amp;' 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