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