xref: /vim-8.2.3635/src/testdir/test_syntax.vim (revision fbf2122c)
1" Test for syntax and syntax iskeyword option
2
3source check.vim
4CheckFeature syntax
5
6source view_util.vim
7source screendump.vim
8
9func GetSyntaxItem(pat)
10  let c = ''
11  let a = ['a', getreg('a'), getregtype('a')]
12  0
13  redraw!
14  call search(a:pat, 'W')
15  let synid = synID(line('.'), col('.'), 1)
16  while synid == synID(line('.'), col('.'), 1)
17    norm! v"ay
18    " stop at whitespace
19    if @a =~# '\s'
20      break
21    endif
22    let c .= @a
23    norm! l
24  endw
25  call call('setreg', a)
26  0
27  return c
28endfunc
29
30func Test_syn_iskeyword()
31  new
32  call setline(1, [
33	\ 'CREATE TABLE FOOBAR(',
34	\ '    DLTD_BY VARCHAR2(100)',
35	\ ');',
36	\ ''])
37
38  syntax on
39  set ft=sql
40  syn match SYN /C\k\+\>/
41  hi link SYN ErrorMsg
42  call assert_equal('DLTD_BY', GetSyntaxItem('DLTD'))
43  /\<D\k\+\>/:norm! ygn
44  call assert_equal('DLTD_BY', @0)
45  redir @c
46  syn iskeyword
47  redir END
48  call assert_equal("\nsyntax iskeyword not set", @c)
49
50  syn iskeyword @,48-57,_,192-255
51  redir @c
52  syn iskeyword
53  redir END
54  call assert_equal("\nsyntax iskeyword @,48-57,_,192-255", @c)
55
56  setlocal isk-=_
57  call assert_equal('DLTD_BY', GetSyntaxItem('DLTD'))
58  /\<D\k\+\>/:norm! ygn
59  let b2 = @0
60  call assert_equal('DLTD', @0)
61
62  syn iskeyword clear
63  redir @c
64  syn iskeyword
65  redir END
66  call assert_equal("\nsyntax iskeyword not set", @c)
67
68  quit!
69endfunc
70
71func Test_syntax_after_reload()
72  split Xsomefile
73  call setline(1, ['hello', 'there'])
74  w!
75  only!
76  setl filetype=hello
77  au FileType hello let g:gotit = 1
78  call assert_false(exists('g:gotit'))
79  edit other
80  buf Xsomefile
81  call assert_equal('hello', &filetype)
82  call assert_true(exists('g:gotit'))
83  call delete('Xsomefile')
84endfunc
85
86func Test_syntime()
87  if !has('profile')
88    return
89  endif
90
91  syntax on
92  syntime on
93  let a = execute('syntime report')
94  call assert_equal("\nNo Syntax items defined for this buffer", a)
95
96  view ../memfile_test.c
97  setfiletype cpp
98  redraw
99  let a = execute('syntime report')
100  call assert_match('^  TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a)
101  call assert_match(' \d*\.\d* \+[^0]\d* .* cppRawString ', a)
102  call assert_match(' \d*\.\d* \+[^0]\d* .* cppNumber ', a)
103
104  syntime off
105  syntime clear
106  let a = execute('syntime report')
107  call assert_match('^  TOTAL *COUNT *MATCH *SLOWEST *AVERAGE *NAME *PATTERN', a)
108  call assert_notmatch('.* cppRawString *', a)
109  call assert_notmatch('.* cppNumber*', a)
110  call assert_notmatch('[1-9]', a)
111
112  call assert_fails('syntime abc', 'E475')
113
114  syntax clear
115  let a = execute('syntime report')
116  call assert_equal("\nNo Syntax items defined for this buffer", a)
117
118  bd
119endfunc
120
121func Test_syntime_completion()
122  if !has('profile')
123    return
124  endif
125
126  call feedkeys(":syntime \<C-A>\<C-B>\"\<CR>", 'tx')
127  call assert_equal('"syntime clear off on report', @:)
128endfunc
129
130func Test_syntax_list()
131  syntax on
132  let a = execute('syntax list')
133  call assert_equal("\nNo Syntax items defined for this buffer", a)
134
135  view ../memfile_test.c
136  setfiletype c
137
138  let a = execute('syntax list')
139  call assert_match('cInclude*', a)
140  call assert_match('cDefine', a)
141
142  let a = execute('syntax list cDefine')
143  call assert_notmatch('cInclude*', a)
144  call assert_match('cDefine', a)
145  call assert_match(' links to Macro$', a)
146
147  call assert_fails('syntax list ABCD', 'E28:')
148  call assert_fails('syntax list @ABCD', 'E392:')
149
150  syntax clear
151  let a = execute('syntax list')
152  call assert_equal("\nNo Syntax items defined for this buffer", a)
153
154  bd
155endfunc
156
157func Test_syntax_completion()
158  call feedkeys(":syn \<C-A>\<C-B>\"\<CR>", 'tx')
159  call assert_equal('"syn case clear cluster conceal enable include iskeyword keyword list manual match off on region reset spell sync', @:)
160
161  call feedkeys(":syn case \<C-A>\<C-B>\"\<CR>", 'tx')
162  call assert_equal('"syn case ignore match', @:)
163
164  call feedkeys(":syn spell \<C-A>\<C-B>\"\<CR>", 'tx')
165  call assert_equal('"syn spell default notoplevel toplevel', @:)
166
167  call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx')
168  call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:)
169
170  " Check that clearing "Aap" avoids it showing up before Boolean.
171  hi Aap ctermfg=blue
172  call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
173  call assert_match('^"syn list Aap Boolean Character ', @:)
174  hi clear Aap
175
176  call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
177  call assert_match('^"syn list Boolean Character ', @:)
178
179  call feedkeys(":syn match \<C-A>\<C-B>\"\<CR>", 'tx')
180  call assert_match('^"syn match Boolean Character ', @:)
181endfunc
182
183func Test_echohl_completion()
184  call feedkeys(":echohl no\<C-A>\<C-B>\"\<CR>", 'tx')
185  call assert_equal('"echohl NonText Normal none', @:)
186endfunc
187
188func Test_syntax_arg_skipped()
189  syn clear
190  syntax case ignore
191  if 0
192    syntax case match
193  endif
194  call assert_match('case ignore', execute('syntax case'))
195
196  syn keyword Foo foo
197  call assert_match('Foo', execute('syntax'))
198  syn clear
199  call assert_match('case match', execute('syntax case'))
200  call assert_notmatch('Foo', execute('syntax'))
201
202  if has('conceal')
203    syn clear
204    syntax conceal on
205    if 0
206      syntax conceal off
207    endif
208    call assert_match('conceal on', execute('syntax conceal'))
209    syn clear
210    call assert_match('conceal off', execute('syntax conceal'))
211
212    syntax conceal on
213    syntax conceal off
214    call assert_match('conceal off', execute('syntax conceal'))
215  endif
216
217  syntax region Bar start=/</ end=/>/
218  if 0
219    syntax region NotTest start=/</ end=/>/ contains=@Spell
220  endif
221  call assert_match('Bar', execute('syntax'))
222  call assert_notmatch('NotTest', execute('syntax'))
223  call assert_notmatch('Spell', execute('syntax'))
224
225  hi Foo ctermfg=blue
226  let a = execute('hi Foo')
227  if 0
228    syntax rest
229  endif
230  call assert_equal(a, execute('hi Foo'))
231  hi clear Bar
232  hi clear Foo
233
234  set ft=tags
235  syn off
236  if 0
237    syntax enable
238  endif
239  call assert_match('No Syntax items defined', execute('syntax'))
240  syntax enable
241  call assert_match('tagComment', execute('syntax'))
242  set ft=
243
244  syn clear
245  if 0
246    syntax include @Spell nothing
247  endif
248  call assert_notmatch('Spell', execute('syntax'))
249
250  syn clear
251  syn iskeyword 48-57,$,_
252  call assert_match('48-57,$,_', execute('syntax iskeyword'))
253  if 0
254    syn clear
255    syn iskeyword clear
256  endif
257  call assert_match('48-57,$,_', execute('syntax iskeyword'))
258  syn iskeyword clear
259  call assert_match('not set', execute('syntax iskeyword'))
260  syn iskeyword 48-57,$,_
261  syn clear
262  call assert_match('not set', execute('syntax iskeyword'))
263
264  syn clear
265  syn keyword Foo foo
266  if 0
267    syn keyword NotAdded bar
268  endif
269  call assert_match('Foo', execute('syntax'))
270  call assert_notmatch('NotAdded', execute('highlight'))
271
272  syn clear
273  syn keyword Foo foo
274  call assert_match('Foo', execute('syntax'))
275  call assert_match('Foo', execute('syntax list'))
276  call assert_notmatch('Foo', execute('if 0 | syntax | endif'))
277  call assert_notmatch('Foo', execute('if 0 | syntax list | endif'))
278
279  syn clear
280  syn match Fopi /asdf/
281  if 0
282    syn match Fopx /asdf/
283  endif
284  call assert_match('Fopi', execute('syntax'))
285  call assert_notmatch('Fopx', execute('syntax'))
286
287  syn clear
288  syn spell toplevel
289  call assert_match('spell toplevel', execute('syntax spell'))
290  if 0
291    syn spell notoplevel
292  endif
293  call assert_match('spell toplevel', execute('syntax spell'))
294  syn spell notoplevel
295  call assert_match('spell notoplevel', execute('syntax spell'))
296  syn spell default
297  call assert_match('spell default', execute('syntax spell'))
298
299  syn clear
300  if 0
301    syntax cluster Spell
302  endif
303  call assert_notmatch('Spell', execute('syntax'))
304
305  syn clear
306  syn keyword Foo foo
307  syn sync ccomment
308  syn sync maxlines=5
309  if 0
310    syn sync maxlines=11
311  endif
312  call assert_match('on C-style comments', execute('syntax sync'))
313  call assert_match('maximal 5 lines', execute('syntax sync'))
314  syn sync clear
315  if 0
316    syn sync ccomment
317  endif
318  call assert_notmatch('on C-style comments', execute('syntax sync'))
319
320  syn clear
321endfunc
322
323" Check for an error. Used when multiple errors are thrown and we are checking
324" for an earliest error.
325func AssertFails(cmd, errcode)
326  let save_exception = ''
327  try
328    exe a:cmd
329  catch
330    let save_exception = v:exception
331  endtry
332  call assert_match(a:errcode, save_exception)
333endfunc
334
335func Test_syntax_invalid_arg()
336  call assert_fails('syntax case asdf', 'E390:')
337  if has('conceal')
338    call assert_fails('syntax conceal asdf', 'E390:')
339  endif
340  call assert_fails('syntax spell asdf', 'E390:')
341  call assert_fails('syntax clear @ABCD', 'E391:')
342  call assert_fails('syntax include random_file', 'E484:')
343  call assert_fails('syntax include <afile>', 'E495:')
344  call assert_fails('syntax sync x', 'E404:')
345  call assert_fails('syntax keyword Abc a[', 'E789:')
346  call assert_fails('syntax keyword Abc a[bc]d', 'E890:')
347  call assert_fails('syntax cluster Abc add=A add=', 'E475:')
348
349  " Test for too many \z\( and unmatched \z\(
350  " Not able to use assert_fails() here because both E50:/E879: and E475:
351  " messages are emitted.
352  set regexpengine=1
353  call AssertFails("syntax region MyRegion start='\\z\\(' end='\\*/'", 'E52:')
354
355  let cmd = "syntax region MyRegion start='"
356  let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'"
357  call AssertFails(cmd, 'E50:')
358
359  set regexpengine=2
360  call AssertFails("syntax region MyRegion start='\\z\\(' end='\\*/'", 'E54:')
361
362  let cmd = "syntax region MyRegion start='"
363  let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'"
364  call AssertFails(cmd, 'E879:')
365  set regexpengine&
366
367  call AssertFails('syntax keyword cMyItem grouphere G1', 'E393:')
368  call AssertFails('syntax sync match Abc grouphere MyItem "abc"', 'E394:')
369  call AssertFails('syn keyword Type contains int', 'E395:')
370  call assert_fails('syntax include @Xxx', 'E397:')
371  call AssertFails('syntax region X start', 'E398:')
372  call assert_fails('syntax region X start="{"', 'E399:')
373  call AssertFails('syntax cluster contains=Abc', 'E400:')
374  call AssertFails("syntax match Character /'.'", 'E401:')
375  call AssertFails("syntax match Character /'.'/a", 'E402:')
376  call assert_fails('syntax sync linecont /pat', 'E404:')
377  call assert_fails('syntax sync linecont', 'E404:')
378  call assert_fails('syntax sync linecont /pat1/ linecont /pat2/', 'E403:')
379  call assert_fails('syntax sync minlines=a', 'E404:')
380  call AssertFails('syntax match ABC /x/ contains=', 'E406:')
381  call AssertFails("syntax match Character contains /'.'/", 'E405:')
382  call AssertFails('syntax match ccFoo "Foo" nextgroup=ALLBUT,F', 'E407:')
383  call AssertFails('syntax region Block start="{" contains=F,ALLBUT', 'E408:')
384  call AssertFails("syntax match Characters contains=a.*x /'.'/", 'E409:')
385endfunc
386
387func Test_syn_sync()
388  syntax region HereGroup start=/this/ end=/that/
389  syntax sync match SyncHere grouphere HereGroup "pattern"
390  call assert_match('SyncHere', execute('syntax sync'))
391  syn sync clear
392  call assert_notmatch('SyncHere', execute('syntax sync'))
393  syn clear
394endfunc
395
396func Test_syn_clear()
397  syntax keyword Foo foo
398  syntax keyword Bar tar
399  call assert_match('Foo', execute('syntax'))
400  call assert_match('Bar', execute('syntax'))
401  call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
402  syn clear Foo
403  call assert_notmatch('Foo', execute('syntax'))
404  call assert_match('Bar', execute('syntax'))
405  call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
406  syn clear Foo Bar
407  call assert_notmatch('Foo', execute('syntax'))
408  call assert_notmatch('Bar', execute('syntax'))
409  hi clear Foo
410  call assert_equal('Foo', synIDattr(hlID("Foo"), "name"))
411  hi clear Bar
412  call assert_fails('syntax clear invalid_syngroup', 'E28:')
413endfunc
414
415func Test_invalid_name()
416  syn clear
417  syn keyword Nop yes
418  call assert_fails("syntax keyword Wr\x17ong bar", 'E669:')
419  syntax keyword @Wrong bar
420  call assert_match('W18:', execute('1messages'))
421  syn clear
422  hi clear Nop
423  hi clear @Wrong
424endfunc
425
426func Test_ownsyntax()
427  new Xfoo
428  call setline(1, '#define FOO')
429  syntax on
430  set filetype=c
431  ownsyntax perl
432  call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name'))
433  call assert_equal('c',    b:current_syntax)
434  call assert_equal('perl', w:current_syntax)
435
436  " A new split window should have the original syntax.
437  split
438  call assert_equal('cDefine', synIDattr(synID(line('.'), col('.'), 1), 'name'))
439  call assert_equal('c', b:current_syntax)
440  call assert_equal(0, exists('w:current_syntax'))
441
442  wincmd x
443  call assert_equal('perlComment', synIDattr(synID(line("."), col("."), 1), "name"))
444
445  syntax off
446  set filetype&
447  %bw!
448endfunc
449
450func Test_ownsyntax_completion()
451  call feedkeys(":ownsyntax java\<C-A>\<C-B>\"\<CR>", 'tx')
452  call assert_equal('"ownsyntax java javacc javascript javascriptreact', @:)
453endfunc
454
455func Test_highlight_invalid_arg()
456  if has('gui_running')
457    call assert_fails('hi XXX guifg=xxx', 'E254:')
458  endif
459  call assert_fails('hi DoesNotExist', 'E411:')
460  call assert_fails('hi link', 'E412:')
461  call assert_fails('hi link a', 'E412:')
462  call assert_fails('hi link a b c', 'E413:')
463  call assert_fails('hi XXX =', 'E415:')
464  call assert_fails('hi XXX cterm', 'E416:')
465  call assert_fails('hi XXX cterm=', 'E417:')
466  call assert_fails('hi XXX cterm=DoesNotExist', 'E418:')
467  call assert_fails('hi XXX ctermfg=DoesNotExist', 'E421:')
468  call assert_fails('hi XXX xxx=White', 'E423:')
469endfunc
470
471func Test_bg_detection()
472  CheckNotGui
473
474  " auto-detection of &bg, make sure sure it isn't set anywhere before
475  " this test
476  hi Normal ctermbg=0
477  call assert_equal('dark', &bg)
478  hi Normal ctermbg=4
479  call assert_equal('dark', &bg)
480  hi Normal ctermbg=12
481  call assert_equal('light', &bg)
482  hi Normal ctermbg=15
483  call assert_equal('light', &bg)
484
485  " manually-set &bg takes precedence over auto-detection
486  set bg=light
487  hi Normal ctermbg=4
488  call assert_equal('light', &bg)
489  set bg=dark
490  hi Normal ctermbg=12
491  call assert_equal('dark', &bg)
492
493  hi Normal ctermbg=NONE
494endfunc
495
496func Test_syntax_hangs()
497  if !has('reltime') || !has('float') || !has('syntax')
498    return
499  endif
500
501  " This pattern takes a long time to match, it should timeout.
502  new
503  call setline(1, ['aaa', repeat('abc ', 1000), 'ccc'])
504  let start = reltime()
505  set nolazyredraw redrawtime=101
506  syn match Error /\%#=1a*.*X\@<=b*/
507  redraw
508  let elapsed = reltimefloat(reltime(start))
509  call assert_true(elapsed > 0.1)
510  call assert_true(elapsed < 1.0)
511
512  " second time syntax HL is disabled
513  let start = reltime()
514  redraw
515  let elapsed = reltimefloat(reltime(start))
516  call assert_true(elapsed < 0.1)
517
518  " after CTRL-L the timeout flag is reset
519  let start = reltime()
520  exe "normal \<C-L>"
521  redraw
522  let elapsed = reltimefloat(reltime(start))
523  call assert_true(elapsed > 0.1)
524  call assert_true(elapsed < 1.0)
525
526  set redrawtime&
527  bwipe!
528endfunc
529
530func Test_conceal()
531  if !has('conceal')
532    return
533  endif
534
535  new
536  call setline(1, ['', '123456'])
537  syn match test23 "23" conceal cchar=X
538  syn match test45 "45" conceal
539
540  set conceallevel=0
541  call assert_equal('123456 ', ScreenLines(2, 7)[0])
542  call assert_equal([[0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
543
544  set conceallevel=1
545  call assert_equal('1X 6   ', ScreenLines(2, 7)[0])
546  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)'))
547
548  set conceallevel=1
549  set listchars=conceal:Y
550  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)'))
551  call assert_equal('1XY6   ', ScreenLines(2, 7)[0])
552
553  set conceallevel=2
554  call assert_match('1X6    ', ScreenLines(2, 7)[0])
555  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)'))
556
557  set conceallevel=3
558  call assert_match('16     ', ScreenLines(2, 7)[0])
559  call assert_equal([[0, '', 0], [1, '', 1], [1, '', 1], [1, '', 2], [1, '', 2], [0, '', 0]], map(range(1, 6), 'synconcealed(2, v:val)'))
560
561  call AssertFails("syntax match Entity '&amp;' conceal cchar=\<Tab>", 'E844:')
562
563  syn clear
564  set conceallevel&
565  bw!
566endfunc
567
568func Test_synstack_synIDtrans()
569  new
570  setfiletype c
571  syntax on
572  call setline(1, ' /* A comment with a TODO */')
573
574  call assert_equal([], synstack(1, 1))
575
576  norm f/
577  eval synstack(line("."), col("."))->map('synIDattr(v:val, "name")')->assert_equal(['cComment', 'cCommentStart'])
578  eval synstack(line("."), col("."))->map('synIDattr(synIDtrans(v:val), "name")')->assert_equal(['Comment', 'Comment'])
579
580  norm fA
581  call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
582  call assert_equal(['Comment'],  map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
583
584  norm fT
585  call assert_equal(['cComment', 'cTodo'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
586  call assert_equal(['Comment', 'Todo'],   map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
587
588  call assert_fails("let n=synIDtrans([])", 'E745:')
589
590  syn clear
591  bw!
592endfunc
593
594" Check highlighting for a small piece of C code with a screen dump.
595func Test_syntax_c()
596  if !CanRunVimInTerminal()
597    throw 'Skipped: cannot make screendumps'
598  endif
599  call writefile([
600	\ '/* comment line at the top */',
601	\ 'int main(int argc, char **argv) { // another comment',
602	\ '#if 0',
603	\ '   int   not_used;',
604	\ '#else',
605	\ '   int   used;',
606	\ '#endif',
607	\ '   printf("Just an example piece of C code\n");',
608	\ '   return 0x0ff;',
609	\ '}',
610	\ "\t\t ",
611	\ '   static void',
612	\ 'myFunction(const double count, struct nothing, long there) {',
613	\ "\t// 123: nothing to endif here",
614	\ "\tfor (int i = 0; i < count; ++i) {",
615	\ "\t   break;",
616	\ "\t}",
617	\ "\tNote: asdf",
618	\ '}',
619	\ ], 'Xtest.c')
620
621  " This makes the default for 'background' use "dark", check that the
622  " response to t_RB corrects it to "light".
623  let $COLORFGBG = '15;0'
624
625  let buf = RunVimInTerminal('Xtest.c', {})
626  call term_sendkeys(buf, ":syn keyword Search Note\r")
627  call term_sendkeys(buf, ":syn match Error /^\\s\\+$/\r")
628  call term_sendkeys(buf, ":set hlsearch\r")
629  call term_sendkeys(buf, "/endif\r")
630  call term_sendkeys(buf, "vjfC")
631  call VerifyScreenDump(buf, 'Test_syntax_c_01', {})
632
633  call term_sendkeys(buf, "\<Esc>")
634  call StopVimInTerminal(buf)
635
636  let $COLORFGBG = ''
637  call delete('Xtest.c')
638endfun
639
640" Using \z() in a region with NFA failing should not crash.
641func Test_syn_wrong_z_one()
642  new
643  call setline(1, ['just some text', 'with foo and bar to match with'])
644  syn region FooBar start="foo\z(.*\)bar" end="\z1"
645  call test_override("nfa_fail", 1)
646  redraw!
647  redraw!
648  call test_override("ALL", 0)
649  bwipe!
650endfunc
651
652func Test_syntax_after_bufdo()
653  call writefile(['/* aaa comment */'], 'Xaaa.c')
654  call writefile(['/* bbb comment */'], 'Xbbb.c')
655  call writefile(['/* ccc comment */'], 'Xccc.c')
656  call writefile(['/* ddd comment */'], 'Xddd.c')
657
658  let bnr = bufnr('%')
659  new Xaaa.c
660  badd Xbbb.c
661  badd Xccc.c
662  badd Xddd.c
663  exe "bwipe " . bnr
664  let l = []
665  bufdo call add(l, bufnr('%'))
666  call assert_equal(4, len(l))
667
668  syntax on
669
670  " This used to only enable syntax HL in the last buffer.
671  bufdo tab split
672  tabrewind
673  for tab in range(1, 4)
674    norm fm
675    call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
676    tabnext
677  endfor
678
679  bwipe! Xaaa.c
680  bwipe! Xbbb.c
681  bwipe! Xccc.c
682  bwipe! Xddd.c
683  syntax off
684  call delete('Xaaa.c')
685  call delete('Xbbb.c')
686  call delete('Xccc.c')
687  call delete('Xddd.c')
688endfunc
689
690" vim: shiftwidth=2 sts=2 expandtab
691