xref: /vim-8.2.3635/src/testdir/test_syntax.vim (revision 6bb2cdfe)
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
12273b484c4SBram Moolenaarfunc Test_syntax_list()
12373b484c4SBram Moolenaar  syntax on
12473b484c4SBram Moolenaar  let a = execute('syntax list')
12573b484c4SBram Moolenaar  call assert_equal("\nNo Syntax items defined for this buffer", a)
12673b484c4SBram Moolenaar
12773b484c4SBram Moolenaar  view ../memfile_test.c
12873b484c4SBram Moolenaar  setfiletype c
12973b484c4SBram Moolenaar
13073b484c4SBram Moolenaar  let a = execute('syntax list')
13173b484c4SBram Moolenaar  call assert_match('cInclude*', a)
13273b484c4SBram Moolenaar  call assert_match('cDefine', a)
13373b484c4SBram Moolenaar
13473b484c4SBram Moolenaar  let a = execute('syntax list cDefine')
13573b484c4SBram Moolenaar  call assert_notmatch('cInclude*', a)
13673b484c4SBram Moolenaar  call assert_match('cDefine', a)
13773b484c4SBram Moolenaar  call assert_match(' links to Macro$', a)
13873b484c4SBram Moolenaar
13973b484c4SBram Moolenaar  call assert_fails('syntax list ABCD', 'E28:')
14073b484c4SBram Moolenaar  call assert_fails('syntax list @ABCD', 'E392:')
14173b484c4SBram Moolenaar
14273b484c4SBram Moolenaar  syntax clear
14373b484c4SBram Moolenaar  let a = execute('syntax list')
14473b484c4SBram Moolenaar  call assert_equal("\nNo Syntax items defined for this buffer", a)
14573b484c4SBram Moolenaar
14673b484c4SBram Moolenaar  bd
14773b484c4SBram Moolenaarendfunc
14873b484c4SBram Moolenaar
14973b484c4SBram Moolenaarfunc Test_syntax_completion()
15073b484c4SBram Moolenaar  call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx')
15173b484c4SBram Moolenaar  call assert_equal('"syn case clear cluster conceal enable include iskeyword keyword list manual match off on region reset spell sync', @:)
15273b484c4SBram Moolenaar
15373b484c4SBram Moolenaar  call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx')
15473b484c4SBram Moolenaar  call assert_equal('"syn case ignore match', @:)
15573b484c4SBram Moolenaar
1562d028390SBram Moolenaar  call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx')
1572d028390SBram Moolenaar  call assert_equal('"syn spell default notoplevel toplevel', @:)
1582d028390SBram Moolenaar
1592d028390SBram Moolenaar  call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx')
1602d028390SBram Moolenaar  call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:)
1612d028390SBram Moolenaar
162d61e8aaaSBram Moolenaar  " Check that clearing "Aap" avoids it showing up before Boolean.
163d61e8aaaSBram Moolenaar  hi Aap ctermfg=blue
164d61e8aaaSBram Moolenaar  call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
165d61e8aaaSBram Moolenaar  call assert_match('^"syn list Aap Boolean Character ', @:)
166d61e8aaaSBram Moolenaar  hi clear Aap
167d61e8aaaSBram Moolenaar
16873b484c4SBram Moolenaar  call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
16973b484c4SBram Moolenaar  call assert_match('^"syn list Boolean Character ', @:)
17073b484c4SBram Moolenaar
17173b484c4SBram Moolenaar  call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx')
17273b484c4SBram Moolenaar  call assert_match('^"syn match Boolean Character ', @:)
173c3691332SBram Moolenaarendfunc
174de318c5cSBram Moolenaar
175de318c5cSBram Moolenaarfunc Test_syntax_arg_skipped()
176de318c5cSBram Moolenaar  syn clear
177de318c5cSBram Moolenaar  syntax case ignore
178de318c5cSBram Moolenaar  if 0
179de318c5cSBram Moolenaar    syntax case match
180de318c5cSBram Moolenaar  endif
181de318c5cSBram Moolenaar  call assert_match('case ignore', execute('syntax case'))
182de318c5cSBram Moolenaar
183de318c5cSBram Moolenaar  syn keyword Foo foo
184de318c5cSBram Moolenaar  call assert_match('Foo', execute('syntax'))
185de318c5cSBram Moolenaar  syn clear
186de318c5cSBram Moolenaar  call assert_match('case match', execute('syntax case'))
187de318c5cSBram Moolenaar  call assert_notmatch('Foo', execute('syntax'))
188de318c5cSBram Moolenaar
189de318c5cSBram Moolenaar  if has('conceal')
190de318c5cSBram Moolenaar    syn clear
191de318c5cSBram Moolenaar    syntax conceal on
192de318c5cSBram Moolenaar    if 0
193de318c5cSBram Moolenaar      syntax conceal off
194de318c5cSBram Moolenaar    endif
195de318c5cSBram Moolenaar    call assert_match('conceal on', execute('syntax conceal'))
196de318c5cSBram Moolenaar    syn clear
197de318c5cSBram Moolenaar    call assert_match('conceal off', execute('syntax conceal'))
19858f60ca2SBram Moolenaar
19958f60ca2SBram Moolenaar    syntax conceal on
20058f60ca2SBram Moolenaar    syntax conceal off
20158f60ca2SBram Moolenaar    call assert_match('conceal off', execute('syntax conceal'))
202de318c5cSBram Moolenaar  endif
203de318c5cSBram Moolenaar
204d61e8aaaSBram Moolenaar  syntax region Bar start=/</ end=/>/
205de318c5cSBram Moolenaar  if 0
206de318c5cSBram Moolenaar    syntax region NotTest start=/</ end=/>/ contains=@Spell
207de318c5cSBram Moolenaar  endif
208d61e8aaaSBram Moolenaar  call assert_match('Bar', execute('syntax'))
209de318c5cSBram Moolenaar  call assert_notmatch('NotTest', execute('syntax'))
210de318c5cSBram Moolenaar  call assert_notmatch('Spell', execute('syntax'))
211de318c5cSBram Moolenaar
212de318c5cSBram Moolenaar  hi Foo ctermfg=blue
213de318c5cSBram Moolenaar  let a = execute('hi Foo')
214de318c5cSBram Moolenaar  if 0
215de318c5cSBram Moolenaar    syntax rest
216de318c5cSBram Moolenaar  endif
217de318c5cSBram Moolenaar  call assert_equal(a, execute('hi Foo'))
218d61e8aaaSBram Moolenaar  hi clear Bar
219d61e8aaaSBram Moolenaar  hi clear Foo
220de318c5cSBram Moolenaar
221de318c5cSBram Moolenaar  set ft=tags
222de318c5cSBram Moolenaar  syn off
223de318c5cSBram Moolenaar  if 0
224de318c5cSBram Moolenaar    syntax enable
225de318c5cSBram Moolenaar  endif
226de318c5cSBram Moolenaar  call assert_match('No Syntax items defined', execute('syntax'))
227de318c5cSBram Moolenaar  syntax enable
228de318c5cSBram Moolenaar  call assert_match('tagComment', execute('syntax'))
229de318c5cSBram Moolenaar  set ft=
230de318c5cSBram Moolenaar
231de318c5cSBram Moolenaar  syn clear
232de318c5cSBram Moolenaar  if 0
233de318c5cSBram Moolenaar    syntax include @Spell nothing
234de318c5cSBram Moolenaar  endif
235de318c5cSBram Moolenaar  call assert_notmatch('Spell', execute('syntax'))
236de318c5cSBram Moolenaar
237de318c5cSBram Moolenaar  syn clear
238de318c5cSBram Moolenaar  syn iskeyword 48-57,$,_
239de318c5cSBram Moolenaar  call assert_match('48-57,$,_', execute('syntax iskeyword'))
240de318c5cSBram Moolenaar  if 0
241de318c5cSBram Moolenaar    syn clear
242de318c5cSBram Moolenaar    syn iskeyword clear
243de318c5cSBram Moolenaar  endif
244de318c5cSBram Moolenaar  call assert_match('48-57,$,_', execute('syntax iskeyword'))
245de318c5cSBram Moolenaar  syn iskeyword clear
246de318c5cSBram Moolenaar  call assert_match('not set', execute('syntax iskeyword'))
247de318c5cSBram Moolenaar  syn iskeyword 48-57,$,_
248de318c5cSBram Moolenaar  syn clear
249de318c5cSBram Moolenaar  call assert_match('not set', execute('syntax iskeyword'))
250de318c5cSBram Moolenaar
251de318c5cSBram Moolenaar  syn clear
252de318c5cSBram Moolenaar  syn keyword Foo foo
253de318c5cSBram Moolenaar  if 0
254de318c5cSBram Moolenaar    syn keyword NotAdded bar
255de318c5cSBram Moolenaar  endif
256de318c5cSBram Moolenaar  call assert_match('Foo', execute('syntax'))
257de318c5cSBram Moolenaar  call assert_notmatch('NotAdded', execute('highlight'))
258de318c5cSBram Moolenaar
259de318c5cSBram Moolenaar  syn clear
260de318c5cSBram Moolenaar  syn keyword Foo foo
261de318c5cSBram Moolenaar  call assert_match('Foo', execute('syntax'))
262de318c5cSBram Moolenaar  call assert_match('Foo', execute('syntax list'))
263de318c5cSBram Moolenaar  call assert_notmatch('Foo', execute('if 0 | syntax | endif'))
264de318c5cSBram Moolenaar  call assert_notmatch('Foo', execute('if 0 | syntax list | endif'))
265de318c5cSBram Moolenaar
266de318c5cSBram Moolenaar  syn clear
267de318c5cSBram Moolenaar  syn match Fopi /asdf/
268de318c5cSBram Moolenaar  if 0
269de318c5cSBram Moolenaar    syn match Fopx /asdf/
270de318c5cSBram Moolenaar  endif
271de318c5cSBram Moolenaar  call assert_match('Fopi', execute('syntax'))
272de318c5cSBram Moolenaar  call assert_notmatch('Fopx', execute('syntax'))
273de318c5cSBram Moolenaar
274de318c5cSBram Moolenaar  syn clear
275de318c5cSBram Moolenaar  syn spell toplevel
276de318c5cSBram Moolenaar  call assert_match('spell toplevel', execute('syntax spell'))
277de318c5cSBram Moolenaar  if 0
278de318c5cSBram Moolenaar    syn spell notoplevel
279de318c5cSBram Moolenaar  endif
280de318c5cSBram Moolenaar  call assert_match('spell toplevel', execute('syntax spell'))
281de318c5cSBram Moolenaar  syn spell notoplevel
282de318c5cSBram Moolenaar  call assert_match('spell notoplevel', execute('syntax spell'))
283de318c5cSBram Moolenaar  syn spell default
284de318c5cSBram Moolenaar  call assert_match('spell default', execute('syntax spell'))
285de318c5cSBram Moolenaar
286de318c5cSBram Moolenaar  syn clear
287de318c5cSBram Moolenaar  if 0
288de318c5cSBram Moolenaar    syntax cluster Spell
289de318c5cSBram Moolenaar  endif
290de318c5cSBram Moolenaar  call assert_notmatch('Spell', execute('syntax'))
291de318c5cSBram Moolenaar
292de318c5cSBram Moolenaar  syn clear
293de318c5cSBram Moolenaar  syn keyword Foo foo
294de318c5cSBram Moolenaar  syn sync ccomment
295de318c5cSBram Moolenaar  syn sync maxlines=5
296de318c5cSBram Moolenaar  if 0
297de318c5cSBram Moolenaar    syn sync maxlines=11
298de318c5cSBram Moolenaar  endif
299de318c5cSBram Moolenaar  call assert_match('on C-style comments', execute('syntax sync'))
300de318c5cSBram Moolenaar  call assert_match('maximal 5 lines', execute('syntax sync'))
30158f60ca2SBram Moolenaar  syn sync clear
302de318c5cSBram Moolenaar  if 0
303de318c5cSBram Moolenaar    syn sync ccomment
304de318c5cSBram Moolenaar  endif
305de318c5cSBram Moolenaar  call assert_notmatch('on C-style comments', execute('syntax sync'))
306de318c5cSBram Moolenaar
307de318c5cSBram Moolenaar  syn clear
308de318c5cSBram Moolenaarendfunc
309de318c5cSBram Moolenaar
310ea588154SBram Moolenaarfunc Test_syntax_invalid_arg()
31158f60ca2SBram Moolenaar  call assert_fails('syntax case asdf', 'E390:')
312d61e8aaaSBram Moolenaar  if has('conceal')
31358f60ca2SBram Moolenaar    call assert_fails('syntax conceal asdf', 'E390:')
314d61e8aaaSBram Moolenaar  endif
31558f60ca2SBram Moolenaar  call assert_fails('syntax spell asdf', 'E390:')
316ea588154SBram Moolenaar  call assert_fails('syntax clear @ABCD', 'E391:')
317ea588154SBram Moolenaar  call assert_fails('syntax include @Xxx', 'E397:')
318ea588154SBram Moolenaar  call assert_fails('syntax region X start="{"', 'E399:')
319ea588154SBram Moolenaar  call assert_fails('syntax sync x', 'E404:')
320ea588154SBram Moolenaar  call assert_fails('syntax keyword Abc a[', 'E789:')
321ea588154SBram Moolenaar  call assert_fails('syntax keyword Abc a[bc]d', 'E890:')
32258f60ca2SBram Moolenaarendfunc
32358f60ca2SBram Moolenaar
32458f60ca2SBram Moolenaarfunc Test_syn_sync()
32558f60ca2SBram Moolenaar  syntax region HereGroup start=/this/ end=/that/
32658f60ca2SBram Moolenaar  syntax sync match SyncHere grouphere HereGroup "pattern"
32758f60ca2SBram Moolenaar  call assert_match('SyncHere', execute('syntax sync'))
32858f60ca2SBram Moolenaar  syn sync clear
32958f60ca2SBram Moolenaar  call assert_notmatch('SyncHere', execute('syntax sync'))
33058f60ca2SBram Moolenaar  syn clear
33158f60ca2SBram Moolenaarendfunc
33258f60ca2SBram Moolenaar
33358f60ca2SBram Moolenaarfunc Test_syn_clear()
33458f60ca2SBram Moolenaar  syntax keyword Foo foo
335d61e8aaaSBram Moolenaar  syntax keyword Bar tar
33658f60ca2SBram Moolenaar  call assert_match('Foo', execute('syntax'))
337d61e8aaaSBram Moolenaar  call assert_match('Bar', execute('syntax'))
338c96272e3SBram Moolenaar  call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
33958f60ca2SBram Moolenaar  syn clear Foo
34058f60ca2SBram Moolenaar  call assert_notmatch('Foo', execute('syntax'))
341d61e8aaaSBram Moolenaar  call assert_match('Bar', execute('syntax'))
342c96272e3SBram Moolenaar  call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
343d61e8aaaSBram Moolenaar  syn clear Foo Bar
34458f60ca2SBram Moolenaar  call assert_notmatch('Foo', execute('syntax'))
345d61e8aaaSBram Moolenaar  call assert_notmatch('Bar', execute('syntax'))
346d61e8aaaSBram Moolenaar  hi clear Foo
347c96272e3SBram Moolenaar  call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
348d61e8aaaSBram Moolenaar  hi clear Bar
34958f60ca2SBram Moolenaarendfunc
3504007ed4aSBram Moolenaar
3514007ed4aSBram Moolenaarfunc Test_invalid_name()
3524007ed4aSBram Moolenaar  syn clear
3534007ed4aSBram Moolenaar  syn keyword Nop yes
3544007ed4aSBram Moolenaar  call assert_fails("syntax keyword Wr\x17ong bar", 'E669:')
3554007ed4aSBram Moolenaar  syntax keyword @Wrong bar
3564007ed4aSBram Moolenaar  call assert_match('W18:', execute('1messages'))
3574007ed4aSBram Moolenaar  syn clear
3584007ed4aSBram Moolenaar  hi clear Nop
3594007ed4aSBram Moolenaar  hi clear @Wrong
3604007ed4aSBram Moolenaarendfunc
361f8ec9986SBram Moolenaar
362f8ec9986SBram Moolenaarfunc Test_ownsyntax()
363f8ec9986SBram Moolenaar  new Xfoo
364f8ec9986SBram Moolenaar  call setline(1, '#define FOO')
365f8ec9986SBram Moolenaar  syntax on
366f8ec9986SBram Moolenaar  set filetype=c
367f8ec9986SBram Moolenaar  ownsyntax perl
368f8ec9986SBram Moolenaar  call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name'))
369f8ec9986SBram Moolenaar  call assert_equal('c',    b:current_syntax)
370f8ec9986SBram Moolenaar  call assert_equal('perl', w:current_syntax)
371f8ec9986SBram Moolenaar
372f8ec9986SBram Moolenaar  " A new split window should have the original syntax.
373f8ec9986SBram Moolenaar  split
374f8ec9986SBram Moolenaar  call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name'))
375f8ec9986SBram Moolenaar  call assert_equal('c', b:current_syntax)
376f8ec9986SBram Moolenaar  call assert_equal(0, exists('w:current_syntax'))
377f8ec9986SBram Moolenaar
378f8ec9986SBram Moolenaar  wincmd x
379f8ec9986SBram Moolenaar  call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name"))
380f8ec9986SBram Moolenaar
381f8ec9986SBram Moolenaar  syntax off
382f8ec9986SBram Moolenaar  set filetype&
383f8ec9986SBram Moolenaar  %bw!
384f8ec9986SBram Moolenaarendfunc
385f8ec9986SBram Moolenaar
386f8ec9986SBram Moolenaarfunc Test_ownsyntax_completion()
387f8ec9986SBram Moolenaar  call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx')
388f8ec9986SBram Moolenaar  call assert_equal('"ownsyntax java javacc javascript', @:)
389f8ec9986SBram Moolenaarendfunc
390ea588154SBram Moolenaar
391ea588154SBram Moolenaarfunc Test_highlight_invalid_arg()
392ea588154SBram Moolenaar  if has('gui_running')
393ea588154SBram Moolenaar    call assert_fails('hi XXX guifg=xxx', 'E254:')
394ea588154SBram Moolenaar  endif
395ea588154SBram Moolenaar  call assert_fails('hi DoesNotExist', 'E411:')
396ea588154SBram Moolenaar  call assert_fails('hi link', 'E412:')
397ea588154SBram Moolenaar  call assert_fails('hi link a', 'E412:')
398ea588154SBram Moolenaar  call assert_fails('hi link a b c', 'E413:')
399ea588154SBram Moolenaar  call assert_fails('hi XXX =', 'E415:')
400ea588154SBram Moolenaar  call assert_fails('hi XXX cterm', 'E416:')
401ea588154SBram Moolenaar  call assert_fails('hi XXX cterm=', 'E417:')
402ea588154SBram Moolenaar  call assert_fails('hi XXX cterm=DoesNotExist', 'E418:')
403ea588154SBram Moolenaar  call assert_fails('hi XXX ctermfg=DoesNotExist', 'E421:')
404ea588154SBram Moolenaar  call assert_fails('hi XXX xxx=White', 'E423:')
405ea588154SBram Moolenaarendfunc
406ea588154SBram Moolenaar
4071615b36bSBram Moolenaarfunc Test_bg_detection()
4081615b36bSBram Moolenaar  if has('gui_running')
4091615b36bSBram Moolenaar    return
4101615b36bSBram Moolenaar  endif
4111615b36bSBram Moolenaar  " auto-detection of &bg, make sure sure it isn't set anywhere before
4121615b36bSBram Moolenaar  " this test
4131615b36bSBram Moolenaar  hi Normal ctermbg=0
4141615b36bSBram Moolenaar  call assert_equal('dark', &bg)
4151615b36bSBram Moolenaar  hi Normal ctermbg=4
4161615b36bSBram Moolenaar  call assert_equal('dark', &bg)
4171615b36bSBram Moolenaar  hi Normal ctermbg=12
4181615b36bSBram Moolenaar  call assert_equal('light', &bg)
4191615b36bSBram Moolenaar  hi Normal ctermbg=15
4201615b36bSBram Moolenaar  call assert_equal('light', &bg)
4211615b36bSBram Moolenaar
4220b2eef24SBram Moolenaar  " manually-set &bg takes precedence over auto-detection
4231615b36bSBram Moolenaar  set bg=light
4241615b36bSBram Moolenaar  hi Normal ctermbg=4
4251615b36bSBram Moolenaar  call assert_equal('light', &bg)
4261615b36bSBram Moolenaar  set bg=dark
4271615b36bSBram Moolenaar  hi Normal ctermbg=12
4281615b36bSBram Moolenaar  call assert_equal('dark', &bg)
4296acadda8SBram Moolenaar
4306acadda8SBram Moolenaar  hi Normal ctermbg=NONE
4311615b36bSBram Moolenaarendfunc
43206f1ed2fSBram Moolenaar
43306f1ed2fSBram Moolenaarfunc Test_syntax_hangs()
43406f1ed2fSBram Moolenaar  if !has('reltime') || !has('float') || !has('syntax')
43506f1ed2fSBram Moolenaar    return
43606f1ed2fSBram Moolenaar  endif
43706f1ed2fSBram Moolenaar
43806f1ed2fSBram Moolenaar  " This pattern takes a long time to match, it should timeout.
43906f1ed2fSBram Moolenaar  new
44006f1ed2fSBram Moolenaar  call setline(1, ['aaa', repeat('abc ', 1000), 'ccc'])
44106f1ed2fSBram Moolenaar  let start = reltime()
44206f1ed2fSBram Moolenaar  set nolazyredraw redrawtime=101
44306f1ed2fSBram Moolenaar  syn match Error /\%#=1a*.*X\@<=b*/
44406f1ed2fSBram Moolenaar  redraw
44506f1ed2fSBram Moolenaar  let elapsed = reltimefloat(reltime(start))
44606f1ed2fSBram Moolenaar  call assert_true(elapsed > 0.1)
44706f1ed2fSBram Moolenaar  call assert_true(elapsed < 1.0)
44806f1ed2fSBram Moolenaar
44906f1ed2fSBram Moolenaar  " second time syntax HL is disabled
45006f1ed2fSBram Moolenaar  let start = reltime()
45106f1ed2fSBram Moolenaar  redraw
45206f1ed2fSBram Moolenaar  let elapsed = reltimefloat(reltime(start))
45306f1ed2fSBram Moolenaar  call assert_true(elapsed < 0.1)
45406f1ed2fSBram Moolenaar
45506f1ed2fSBram Moolenaar  " after CTRL-L the timeout flag is reset
45606f1ed2fSBram Moolenaar  let start = reltime()
45706f1ed2fSBram Moolenaar  exe "normal \<C-L>"
45806f1ed2fSBram Moolenaar  redraw
45906f1ed2fSBram Moolenaar  let elapsed = reltimefloat(reltime(start))
46006f1ed2fSBram Moolenaar  call assert_true(elapsed > 0.1)
46106f1ed2fSBram Moolenaar  call assert_true(elapsed < 1.0)
46206f1ed2fSBram Moolenaar
46306f1ed2fSBram Moolenaar  set redrawtime&
46406f1ed2fSBram Moolenaar  bwipe!
46506f1ed2fSBram Moolenaarendfunc
4664d785895SBram Moolenaar
4674d785895SBram Moolenaarfunc Test_conceal()
4684d785895SBram Moolenaar  if !has('conceal')
4694d785895SBram Moolenaar    return
4704d785895SBram Moolenaar  endif
4714d785895SBram Moolenaar
4724d785895SBram Moolenaar  new
4734d785895SBram Moolenaar  call setline(1, ['', '123456'])
4744d785895SBram Moolenaar  syn match test23 "23" conceal cchar=X
4754d785895SBram Moolenaar  syn match test45 "45" conceal
4764d785895SBram Moolenaar
4774d785895SBram Moolenaar  set conceallevel=0
4784d785895SBram Moolenaar  call assert_equal('123456 ', ScreenLines(2, 7)[0])
479cc0750dcSBram Moolenaar  call assert_equal([[0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
4804d785895SBram Moolenaar
4814d785895SBram Moolenaar  set conceallevel=1
4824d785895SBram Moolenaar  call assert_equal('1X 6   ', ScreenLines(2, 7)[0])
483cc0750dcSBram 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)'))
4844d785895SBram Moolenaar
4854d785895SBram Moolenaar  set conceallevel=1
4864d785895SBram Moolenaar  set listchars=conceal:Y
487cc0750dcSBram 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)'))
4884d785895SBram Moolenaar  call assert_equal('1XY6   ', ScreenLines(2, 7)[0])
4894d785895SBram Moolenaar
4904d785895SBram Moolenaar  set conceallevel=2
4914d785895SBram Moolenaar  call assert_match('1X6    ', 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=3
4954d785895SBram Moolenaar  call assert_match('16     ', ScreenLines(2, 7)[0])
496cc0750dcSBram Moolenaar  call assert_equal([[0, '', 0], [1, '', 1], [1, '', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
4974d785895SBram Moolenaar
4984d785895SBram Moolenaar  syn clear
4994d785895SBram Moolenaar  set conceallevel&
5004d785895SBram Moolenaar  bw!
5014d785895SBram Moolenaarendfunc
5020b2eef24SBram Moolenaar
503da65058aSBram Moolenaarfunc Test_synstack_synIDtrans()
5040b2eef24SBram Moolenaar  new
5050b2eef24SBram Moolenaar  setfiletype c
5060b2eef24SBram Moolenaar  syntax on
5070b2eef24SBram Moolenaar  call setline(1, ' /* A comment with a TODO */')
5080b2eef24SBram Moolenaar
5090b2eef24SBram Moolenaar  call assert_equal([], synstack(1, 1))
5100b2eef24SBram Moolenaar
5110b2eef24SBram Moolenaar  norm f/
5120b2eef24SBram Moolenaar  call assert_equal(['cComment', 'cCommentStart'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
5130b2eef24SBram Moolenaar  call assert_equal(['Comment', 'Comment'],        map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
5140b2eef24SBram Moolenaar
5150b2eef24SBram Moolenaar  norm fA
5160b2eef24SBram Moolenaar  call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
5170b2eef24SBram Moolenaar  call assert_equal(['Comment'],  map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
5180b2eef24SBram Moolenaar
5190b2eef24SBram Moolenaar  norm fT
5200b2eef24SBram Moolenaar  call assert_equal(['cComment', 'cTodo'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
5210b2eef24SBram Moolenaar  call assert_equal(['Comment', 'Todo'],   map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
5220b2eef24SBram Moolenaar
5230b2eef24SBram Moolenaar  syn clear
5240b2eef24SBram Moolenaar  bw!
5250b2eef24SBram Moolenaarendfunc
526da65058aSBram Moolenaar
527da65058aSBram Moolenaar" Check highlighting for a small piece of C code with a screen dump.
528da65058aSBram Moolenaarfunc Test_syntax_c()
529*6bb2cdfeSBram Moolenaar  if !CanRunVimInTerminal()
530da65058aSBram Moolenaar    return
531da65058aSBram Moolenaar  endif
532da65058aSBram Moolenaar  call writefile([
533da65058aSBram Moolenaar	\ '/* comment line at the top */',
534da65058aSBram Moolenaar	\ '  int',
535da65058aSBram Moolenaar	\ 'main(int argc, char **argv)// another comment',
536da65058aSBram Moolenaar	\ '{',
537da65058aSBram Moolenaar	\ '#if 0',
538da65058aSBram Moolenaar	\ '   int   not_used;',
539da65058aSBram Moolenaar	\ '#else',
540da65058aSBram Moolenaar	\ '   int   used;',
541da65058aSBram Moolenaar	\ '#endif',
542da65058aSBram Moolenaar	\ '   printf("Just an example piece of C code\n");',
543da65058aSBram Moolenaar	\ '   return 0x0ff;',
544da65058aSBram Moolenaar	\ '}',
545da65058aSBram Moolenaar	\ '   static void',
546da65058aSBram Moolenaar	\ 'myFunction(const double count, struct nothing, long there) {',
547da65058aSBram Moolenaar	\ '  // 123: nothing to read here',
548da65058aSBram Moolenaar	\ '  for (int i = 0; i < count; ++i) {',
549da65058aSBram Moolenaar	\ '    break;',
550da65058aSBram Moolenaar	\ '  }',
551da65058aSBram Moolenaar	\ '}',
552da65058aSBram Moolenaar	\ ], 'Xtest.c')
553b7ea7cb8SBram Moolenaar
554b7ea7cb8SBram Moolenaar  " This makes the default for 'background' use "dark", check that the
555b7ea7cb8SBram Moolenaar  " response to t_RB corrects it to "light".
556b7ea7cb8SBram Moolenaar  let $COLORFGBG = '15;0'
557b7ea7cb8SBram Moolenaar
558da65058aSBram Moolenaar  let buf = RunVimInTerminal('Xtest.c', {})
559*6bb2cdfeSBram Moolenaar  call VerifyScreenDump(buf, 'Test_syntax_c_01', {})
560da65058aSBram Moolenaar  call StopVimInTerminal(buf)
561da65058aSBram Moolenaar
562b7ea7cb8SBram Moolenaar  let $COLORFGBG = ''
563da65058aSBram Moolenaar  call delete('Xtest.c')
564da65058aSBram Moolenaarendfun
565