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