1" Tests for ":highlight" and highlighting.
2
3source view_util.vim
4source screendump.vim
5source check.vim
6
7func Test_highlight()
8  " basic test if ":highlight" doesn't crash
9  highlight
10  hi Search
11
12  " test setting colors.
13  " test clearing one color and all doesn't generate error or warning
14  silent! hi NewGroup term=bold cterm=italic ctermfg=DarkBlue ctermbg=Grey gui= guifg=#00ff00 guibg=Cyan
15  silent! hi Group2 term= cterm=
16  hi Group3 term=underline cterm=bold
17
18  let res = split(execute("hi NewGroup"), "\n")[0]
19  " filter ctermfg and ctermbg, the numbers depend on the terminal
20  let res = substitute(res, 'ctermfg=\d*', 'ctermfg=2', '')
21  let res = substitute(res, 'ctermbg=\d*', 'ctermbg=3', '')
22  call assert_equal("NewGroup       xxx term=bold cterm=italic ctermfg=2 ctermbg=3",
23				\ res)
24  call assert_equal("Group2         xxx cleared",
25				\ split(execute("hi Group2"), "\n")[0])
26  call assert_equal("Group3         xxx term=underline cterm=bold",
27				\ split(execute("hi Group3"), "\n")[0])
28
29  hi clear NewGroup
30  call assert_equal("NewGroup       xxx cleared",
31				\ split(execute("hi NewGroup"), "\n")[0])
32  call assert_equal("Group2         xxx cleared",
33				\ split(execute("hi Group2"), "\n")[0])
34  hi Group2 NONE
35  call assert_equal("Group2         xxx cleared",
36				\ split(execute("hi Group2"), "\n")[0])
37  hi clear
38  call assert_equal("Group3         xxx cleared",
39				\ split(execute("hi Group3"), "\n")[0])
40  call assert_fails("hi Crash term='asdf", "E475:")
41endfunc
42
43func HighlightArgs(name)
44  return 'hi ' . substitute(split(execute('hi ' . a:name), '\n')[0], '\<xxx\>', '', '')
45endfunc
46
47func IsColorable()
48  return has('gui_running') || str2nr(&t_Co) >= 8
49endfunc
50
51func HiCursorLine()
52  let hiCursorLine = HighlightArgs('CursorLine')
53  if has('gui_running')
54    let guibg = matchstr(hiCursorLine, 'guibg=\w\+')
55    let hi_ul = 'hi CursorLine gui=underline guibg=NONE'
56    let hi_bg = 'hi CursorLine gui=NONE ' . guibg
57  else
58    let hi_ul = 'hi CursorLine cterm=underline ctermbg=NONE'
59    let hi_bg = 'hi CursorLine cterm=NONE ctermbg=Gray'
60  endif
61  return [hiCursorLine, hi_ul, hi_bg]
62endfunc
63
64func Check_lcs_eol_attrs(attrs, row, col)
65  let save_lcs = &lcs
66  set list
67
68  call assert_equal(a:attrs, ScreenAttrs(a:row, a:col)[0])
69
70  set nolist
71  let &lcs = save_lcs
72endfunc
73
74func Test_highlight_eol_with_cursorline()
75  let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
76
77  call NewWindow('topleft 5', 20)
78  call setline(1, 'abcd')
79  call matchadd('Search', '\n')
80
81  " expected:
82  " 'abcd      '
83  "  ^^^^ ^^^^^   no highlight
84  "      ^        'Search' highlight
85  let attrs0 = ScreenAttrs(1, 10)[0]
86  call assert_equal(repeat([attrs0[0]], 4), attrs0[0:3])
87  call assert_equal(repeat([attrs0[0]], 5), attrs0[5:9])
88  call assert_notequal(attrs0[0], attrs0[4])
89
90  setlocal cursorline
91
92  " underline
93  exe hi_ul
94
95  " expected:
96  " 'abcd      '
97  "  ^^^^         underline
98  "      ^        'Search' highlight with underline
99  "       ^^^^^   underline
100  let attrs = ScreenAttrs(1, 10)[0]
101  call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
102  call assert_equal([attrs[4]] + repeat([attrs[5]], 5), attrs[4:9])
103  call assert_notequal(attrs[0], attrs[4])
104  call assert_notequal(attrs[4], attrs[5])
105  call assert_notequal(attrs0[0], attrs[0])
106  call assert_notequal(attrs0[4], attrs[4])
107  call Check_lcs_eol_attrs(attrs, 1, 10)
108
109  if IsColorable()
110    " bg-color
111    exe hi_bg
112
113    " expected:
114    " 'abcd      '
115    "  ^^^^         bg-color of 'CursorLine'
116    "      ^        'Search' highlight
117    "       ^^^^^   bg-color of 'CursorLine'
118    let attrs = ScreenAttrs(1, 10)[0]
119    call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
120    call assert_equal(repeat([attrs[5]], 5), attrs[5:9])
121    call assert_equal(attrs0[4], attrs[4])
122    call assert_notequal(attrs[0], attrs[4])
123    call assert_notequal(attrs[4], attrs[5])
124    call assert_notequal(attrs0[0], attrs[0])
125    call assert_notequal(attrs0[5], attrs[5])
126    call Check_lcs_eol_attrs(attrs, 1, 10)
127  endif
128
129  call CloseWindow()
130  exe hiCursorLine
131endfunc
132
133func Test_highlight_eol_with_cursorline_vertsplit()
134  let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
135
136  call NewWindow('topleft 5', 5)
137  call setline(1, 'abcd')
138  call matchadd('Search', '\n')
139
140  let expected = "abcd |abcd     "
141  let actual = ScreenLines(1, 15)[0]
142  call assert_equal(expected, actual)
143
144  " expected:
145  " 'abcd |abcd     '
146  "  ^^^^  ^^^^^^^^^   no highlight
147  "      ^             'Search' highlight
148  "       ^            'VertSplit' highlight
149  let attrs0 = ScreenAttrs(1, 15)[0]
150  call assert_equal(repeat([attrs0[0]], 4), attrs0[0:3])
151  call assert_equal(repeat([attrs0[0]], 9), attrs0[6:14])
152  call assert_notequal(attrs0[0], attrs0[4])
153  call assert_notequal(attrs0[0], attrs0[5])
154  call assert_notequal(attrs0[4], attrs0[5])
155
156  setlocal cursorline
157
158  " expected:
159  " 'abcd |abcd     '
160  "  ^^^^              underline
161  "      ^             'Search' highlight with underline
162  "       ^            'VertSplit' highlight
163  "        ^^^^^^^^^   no highlight
164
165  " underline
166  exe hi_ul
167
168  let actual = ScreenLines(1, 15)[0]
169  call assert_equal(expected, actual)
170
171  let attrs = ScreenAttrs(1, 15)[0]
172  call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
173  call assert_equal(repeat([attrs[6]], 9), attrs[6:14])
174  call assert_equal(attrs0[5:14], attrs[5:14])
175  call assert_notequal(attrs[0], attrs[4])
176  call assert_notequal(attrs[0], attrs[5])
177  call assert_notequal(attrs[0], attrs[6])
178  call assert_notequal(attrs[4], attrs[5])
179  call assert_notequal(attrs[5], attrs[6])
180  call assert_notequal(attrs0[0], attrs[0])
181  call assert_notequal(attrs0[4], attrs[4])
182  call Check_lcs_eol_attrs(attrs, 1, 15)
183
184  if IsColorable()
185    " bg-color
186    exe hi_bg
187
188    let actual = ScreenLines(1, 15)[0]
189    call assert_equal(expected, actual)
190
191    let attrs = ScreenAttrs(1, 15)[0]
192    call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
193    call assert_equal(repeat([attrs[6]], 9), attrs[6:14])
194    call assert_equal(attrs0[5:14], attrs[5:14])
195    call assert_notequal(attrs[0], attrs[4])
196    call assert_notequal(attrs[0], attrs[5])
197    call assert_notequal(attrs[0], attrs[6])
198    call assert_notequal(attrs[4], attrs[5])
199    call assert_notequal(attrs[5], attrs[6])
200    call assert_notequal(attrs0[0], attrs[0])
201    call assert_equal(attrs0[4], attrs[4])
202    call Check_lcs_eol_attrs(attrs, 1, 15)
203  endif
204
205  call CloseWindow()
206  exe hiCursorLine
207endfunc
208
209func Test_highlight_eol_with_cursorline_rightleft()
210  if !has('rightleft')
211    return
212  endif
213
214  let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
215
216  call NewWindow('topleft 5', 10)
217  setlocal rightleft
218  call setline(1, 'abcd')
219  call matchadd('Search', '\n')
220  let attrs0 = ScreenAttrs(1, 10)[0]
221
222  setlocal cursorline
223
224  " underline
225  exe hi_ul
226
227  " expected:
228  " '      dcba'
229  "        ^^^^   underline
230  "       ^       'Search' highlight with underline
231  "  ^^^^^        underline
232  let attrs = ScreenAttrs(1, 10)[0]
233  call assert_equal(repeat([attrs[9]], 4), attrs[6:9])
234  call assert_equal(repeat([attrs[4]], 5) + [attrs[5]], attrs[0:5])
235  call assert_notequal(attrs[9], attrs[5])
236  call assert_notequal(attrs[4], attrs[5])
237  call assert_notequal(attrs0[9], attrs[9])
238  call assert_notequal(attrs0[5], attrs[5])
239  call Check_lcs_eol_attrs(attrs, 1, 10)
240
241  if IsColorable()
242    " bg-color
243    exe hi_bg
244
245    " expected:
246    " '      dcba'
247    "        ^^^^   bg-color of 'CursorLine'
248    "       ^       'Search' highlight
249    "  ^^^^^        bg-color of 'CursorLine'
250    let attrs = ScreenAttrs(1, 10)[0]
251    call assert_equal(repeat([attrs[9]], 4), attrs[6:9])
252    call assert_equal(repeat([attrs[4]], 5), attrs[0:4])
253    call assert_equal(attrs0[5], attrs[5])
254    call assert_notequal(attrs[9], attrs[5])
255    call assert_notequal(attrs[5], attrs[4])
256    call assert_notequal(attrs0[9], attrs[9])
257    call assert_notequal(attrs0[4], attrs[4])
258    call Check_lcs_eol_attrs(attrs, 1, 10)
259  endif
260
261  call CloseWindow()
262  exe hiCursorLine
263endfunc
264
265func Test_highlight_eol_with_cursorline_linewrap()
266  let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
267
268  call NewWindow('topleft 5', 10)
269  call setline(1, [repeat('a', 51) . 'bcd', ''])
270  call matchadd('Search', '\n')
271
272  setlocal wrap
273  normal! gg$
274  let attrs0 = ScreenAttrs(5, 10)[0]
275  setlocal cursorline
276
277  " underline
278  exe hi_ul
279
280  " expected:
281  " 'abcd      '
282  "  ^^^^         underline
283  "      ^        'Search' highlight with underline
284  "       ^^^^^   underline
285  let attrs = ScreenAttrs(5, 10)[0]
286  call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
287  call assert_equal([attrs[4]] + repeat([attrs[5]], 5), attrs[4:9])
288  call assert_notequal(attrs[0], attrs[4])
289  call assert_notequal(attrs[4], attrs[5])
290  call assert_notequal(attrs0[0], attrs[0])
291  call assert_notequal(attrs0[4], attrs[4])
292  call Check_lcs_eol_attrs(attrs, 5, 10)
293
294  if IsColorable()
295    " bg-color
296    exe hi_bg
297
298    " expected:
299    " 'abcd      '
300    "  ^^^^         bg-color of 'CursorLine'
301    "      ^        'Search' highlight
302    "       ^^^^^   bg-color of 'CursorLine'
303    let attrs = ScreenAttrs(5, 10)[0]
304    call assert_equal(repeat([attrs[0]], 4), attrs[0:3])
305    call assert_equal(repeat([attrs[5]], 5), attrs[5:9])
306    call assert_equal(attrs0[4], attrs[4])
307    call assert_notequal(attrs[0], attrs[4])
308    call assert_notequal(attrs[4], attrs[5])
309    call assert_notequal(attrs0[0], attrs[0])
310    call assert_notequal(attrs0[5], attrs[5])
311    call Check_lcs_eol_attrs(attrs, 5, 10)
312  endif
313
314  setlocal nocursorline nowrap
315  normal! gg$
316  let attrs0 = ScreenAttrs(1, 10)[0]
317  setlocal cursorline
318
319  " underline
320  exe hi_ul
321
322  " expected:
323  " 'aaabcd    '
324  "  ^^^^^^       underline
325  "        ^      'Search' highlight with underline
326  "         ^^^   underline
327  let attrs = ScreenAttrs(1, 10)[0]
328  call assert_equal(repeat([attrs[0]], 6), attrs[0:5])
329  call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9])
330  call assert_notequal(attrs[0], attrs[6])
331  call assert_notequal(attrs[6], attrs[7])
332  call assert_notequal(attrs0[0], attrs[0])
333  call assert_notequal(attrs0[6], attrs[6])
334  call Check_lcs_eol_attrs(attrs, 1, 10)
335
336  if IsColorable()
337    " bg-color
338    exe hi_bg
339
340    " expected:
341    " 'aaabcd    '
342    "  ^^^^^^       bg-color of 'CursorLine'
343    "        ^      'Search' highlight
344    "         ^^^   bg-color of 'CursorLine'
345    let attrs = ScreenAttrs(1, 10)[0]
346    call assert_equal(repeat([attrs[0]], 6), attrs[0:5])
347    call assert_equal(repeat([attrs[7]], 3), attrs[7:9])
348    call assert_equal(attrs0[6], attrs[6])
349    call assert_notequal(attrs[0], attrs[6])
350    call assert_notequal(attrs[6], attrs[7])
351    call assert_notequal(attrs0[0], attrs[0])
352    call assert_notequal(attrs0[7], attrs[7])
353    call Check_lcs_eol_attrs(attrs, 1, 10)
354  endif
355
356  call CloseWindow()
357  exe hiCursorLine
358endfunc
359
360func Test_highlight_eol_with_cursorline_sign()
361  if !has('signs')
362    return
363  endif
364
365  let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
366
367  call NewWindow('topleft 5', 10)
368  call setline(1, 'abcd')
369  call matchadd('Search', '\n')
370
371  sign define Sign text=>>
372  exe 'sign place 1 line=1 name=Sign buffer=' . bufnr('')
373  let attrs0 = ScreenAttrs(1, 10)[0]
374  setlocal cursorline
375
376  " underline
377  exe hi_ul
378
379  " expected:
380  " '>>abcd    '
381  "  ^^           sign
382  "    ^^^^       underline
383  "        ^      'Search' highlight with underline
384  "         ^^^   underline
385  let attrs = ScreenAttrs(1, 10)[0]
386  call assert_equal(repeat([attrs[2]], 4), attrs[2:5])
387  call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9])
388  call assert_notequal(attrs[2], attrs[6])
389  call assert_notequal(attrs[6], attrs[7])
390  call assert_notequal(attrs0[2], attrs[2])
391  call assert_notequal(attrs0[6], attrs[6])
392  call Check_lcs_eol_attrs(attrs, 1, 10)
393
394  if IsColorable()
395    " bg-color
396    exe hi_bg
397
398    " expected:
399    " '>>abcd    '
400    "  ^^           sign
401    "    ^^^^       bg-color of 'CursorLine'
402    "        ^      'Search' highlight
403    "         ^^^   bg-color of 'CursorLine'
404    let attrs = ScreenAttrs(1, 10)[0]
405    call assert_equal(repeat([attrs[2]], 4), attrs[2:5])
406    call assert_equal(repeat([attrs[7]], 3), attrs[7:9])
407    call assert_equal(attrs0[6], attrs[6])
408    call assert_notequal(attrs[2], attrs[6])
409    call assert_notequal(attrs[6], attrs[7])
410    call assert_notequal(attrs0[2], attrs[2])
411    call assert_notequal(attrs0[7], attrs[7])
412    call Check_lcs_eol_attrs(attrs, 1, 10)
413  endif
414
415  sign unplace 1
416  call CloseWindow()
417  exe hiCursorLine
418endfunc
419
420func Test_highlight_eol_with_cursorline_breakindent()
421  if !has('linebreak')
422    return
423  endif
424
425  let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
426
427  call NewWindow('topleft 5', 10)
428  set showbreak=xxx
429  setlocal breakindent breakindentopt=min:0,shift:1 showbreak=>
430  call setline(1, ' ' . repeat('a', 9) . 'bcd')
431  call matchadd('Search', '\n')
432  let attrs0 = ScreenAttrs(2, 10)[0]
433  setlocal cursorline
434
435  " underline
436  exe hi_ul
437
438  " expected:
439  " '  >bcd    '
440  "  ^^^          breakindent and showbreak
441  "     ^^^       underline
442  "        ^      'Search' highlight with underline
443  "         ^^^   underline
444  let attrs = ScreenAttrs(2, 10)[0]
445  call assert_equal(repeat([attrs[0]], 2), attrs[0:1])
446  call assert_equal(repeat([attrs[3]], 3), attrs[3:5])
447  call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9])
448  call assert_equal(attrs0[0], attrs[0])
449  call assert_notequal(attrs[0], attrs[2])
450  call assert_notequal(attrs[2], attrs[3])
451  call assert_notequal(attrs[3], attrs[6])
452  call assert_notequal(attrs[6], attrs[7])
453  call assert_notequal(attrs0[2], attrs[2])
454  call assert_notequal(attrs0[3], attrs[3])
455  call assert_notequal(attrs0[6], attrs[6])
456  call Check_lcs_eol_attrs(attrs, 2, 10)
457
458  if IsColorable()
459    " bg-color
460    exe hi_bg
461
462    " expected:
463    " '  >bcd    '
464    "  ^^^          breakindent and showbreak
465    "     ^^^       bg-color of 'CursorLine'
466    "        ^      'Search' highlight
467    "         ^^^   bg-color of 'CursorLine'
468    let attrs = ScreenAttrs(2, 10)[0]
469    call assert_equal(repeat([attrs[0]], 2), attrs[0:1])
470    call assert_equal(repeat([attrs[3]], 3), attrs[3:5])
471    call assert_equal(repeat([attrs[7]], 3), attrs[7:9])
472    call assert_equal(attrs0[0], attrs[0])
473    call assert_equal(attrs0[6], attrs[6])
474    call assert_notequal(attrs[0], attrs[2])
475    call assert_notequal(attrs[2], attrs[3])
476    call assert_notequal(attrs[3], attrs[6])
477    call assert_notequal(attrs[6], attrs[7])
478    call assert_notequal(attrs0[2], attrs[2])
479    call assert_notequal(attrs0[3], attrs[3])
480    call assert_notequal(attrs0[7], attrs[7])
481    call Check_lcs_eol_attrs(attrs, 2, 10)
482  endif
483
484  call CloseWindow()
485  set showbreak=
486  setlocal showbreak=
487  exe hiCursorLine
488endfunc
489
490func Test_highlight_eol_on_diff()
491  call setline(1, ['abcd', ''])
492  call matchadd('Search', '\n')
493  let attrs0 = ScreenAttrs(1, 10)[0]
494
495  diffthis
496  botright new
497  diffthis
498
499  " expected:
500  " '  abcd    '
501  "  ^^           sign
502  "    ^^^^ ^^^   'DiffAdd' highlight
503  "        ^      'Search' highlight
504  let attrs = ScreenAttrs(1, 10)[0]
505  call assert_equal(repeat([attrs[0]], 2), attrs[0:1])
506  call assert_equal(repeat([attrs[2]], 4), attrs[2:5])
507  call assert_equal(repeat([attrs[2]], 3), attrs[7:9])
508  call assert_equal(attrs0[4], attrs[6])
509  call assert_notequal(attrs[0], attrs[2])
510  call assert_notequal(attrs[0], attrs[6])
511  call assert_notequal(attrs[2], attrs[6])
512  call Check_lcs_eol_attrs(attrs, 1, 10)
513
514  bwipe!
515  diffoff
516endfunc
517
518func Test_termguicolors()
519  if !exists('+termguicolors')
520    return
521  endif
522  if has('vtp') && !has('vcon') && !has('gui_running')
523    " Win32: 'guicolors' doesn't work without virtual console.
524    call assert_fails('set termguicolors', 'E954:')
525    return
526  endif
527
528  " Basic test that setting 'termguicolors' works with one color.
529  set termguicolors
530  redraw
531  set t_Co=1
532  redraw
533  set t_Co=0
534  redraw
535endfunc
536
537func Test_cursorline_after_yank()
538  CheckScreendump
539
540  call writefile([
541	\ 'set cul rnu',
542	\ 'call setline(1, ["","1","2","3",""])',
543	\ ], 'Xtest_cursorline_yank')
544  let buf = RunVimInTerminal('-S Xtest_cursorline_yank', {'rows': 8})
545  call TermWait(buf)
546  call term_sendkeys(buf, "Gy3k")
547  call TermWait(buf)
548  call term_sendkeys(buf, "jj")
549
550  call VerifyScreenDump(buf, 'Test_cursorline_yank_01', {})
551
552  " clean up
553  call StopVimInTerminal(buf)
554  call delete('Xtest_cursorline_yank')
555endfunc
556
557" test for issue #4862
558func Test_put_before_cursorline()
559  new
560  only!
561  call setline(1, 'A')
562  redraw
563  let std_attr = screenattr(1, 1)
564  set cursorline
565  redraw
566  let cul_attr = screenattr(1, 1)
567  normal yyP
568  redraw
569  " Line 1 has cursor so it should be highlighted with CursorLine.
570  call assert_equal(cul_attr, screenattr(1, 1))
571  " And CursorLine highlighting from the second line should be gone.
572  call assert_equal(std_attr, screenattr(2, 1))
573  set nocursorline
574  bwipe!
575endfunc
576
577func Test_cursorline_with_visualmode()
578  CheckScreendump
579
580  call writefile([
581	\ 'set cul',
582	\ 'call setline(1, repeat(["abc"], 50))',
583	\ ], 'Xtest_cursorline_with_visualmode')
584  let buf = RunVimInTerminal('-S Xtest_cursorline_with_visualmode', {'rows': 12})
585  call TermWait(buf)
586  call term_sendkeys(buf, "V\<C-f>kkkjk")
587
588  call VerifyScreenDump(buf, 'Test_cursorline_with_visualmode_01', {})
589
590  " clean up
591  call StopVimInTerminal(buf)
592  call delete('Xtest_cursorline_with_visualmode')
593endfunc
594
595func Test_wincolor()
596  CheckScreendump
597  " make sure the width is enough for the test
598  set columns=80
599
600  let lines =<< trim END
601	set cursorline cursorcolumn rnu
602	call setline(1, ["","1111111111","22222222222","3 here 3","","the cat is out of the bag"])
603	set wincolor=Pmenu
604	hi CatLine guifg=green ctermfg=green
605	hi Reverse gui=reverse cterm=reverse
606	syn match CatLine /^the.*/
607	call prop_type_add("foo", {"highlight": "Reverse", "combine": 1})
608	call prop_add(6, 12, {"type": "foo", "end_col": 15})
609	/here
610  END
611  call writefile(lines, 'Xtest_wincolor')
612  let buf = RunVimInTerminal('-S Xtest_wincolor', {'rows': 8})
613  call TermWait(buf)
614  call term_sendkeys(buf, "2G5lvj")
615  call TermWait(buf)
616
617  call VerifyScreenDump(buf, 'Test_wincolor_01', {})
618
619  " clean up
620  call term_sendkeys(buf, "\<Esc>")
621  call StopVimInTerminal(buf)
622  call delete('Xtest_wincolor')
623endfunc
624
625func Test_wincolor_listchars()
626  CheckScreendump
627  CheckFeature conceal
628
629  let lines =<< trim END
630	call setline(1, ["one","\t\tsome random text enough long to show 'extends' and 'precedes' includingnbsps, preceding tabs and trailing spaces    ","three"])
631	set wincolor=Todo
632	set nowrap cole=1 cocu+=n
633	set list lcs=eol:$,tab:>-,space:.,trail:_,extends:>,precedes:<,conceal:*,nbsp:#
634	call matchadd('Conceal', 'text')
635	normal 2G5zl
636  END
637  call writefile(lines, 'Xtest_wincolorlcs')
638  let buf = RunVimInTerminal('-S Xtest_wincolorlcs', {'rows': 8})
639
640  call VerifyScreenDump(buf, 'Test_wincolor_lcs', {})
641
642  " clean up
643  call term_sendkeys(buf, "\<Esc>")
644  call StopVimInTerminal(buf)
645  call delete('Xtest_wincolorlcs')
646endfunc
647
648func Test_colorcolumn()
649  CheckScreendump
650
651  " check that setting 'colorcolumn' when entering a buffer works
652  let lines =<< trim END
653	split
654	edit X
655	call setline(1, ["1111111111","22222222222","3333333333"])
656	set nomodified
657	set colorcolumn=3,9
658	set number cursorline cursorlineopt=number
659	wincmd w
660	buf X
661  END
662  call writefile(lines, 'Xtest_colorcolumn')
663  let buf = RunVimInTerminal('-S Xtest_colorcolumn', {'rows': 10})
664  call term_sendkeys(buf, ":\<CR>")
665  call TermWait(buf)
666  call VerifyScreenDump(buf, 'Test_colorcolumn_1', {})
667
668  " clean up
669  call StopVimInTerminal(buf)
670  call delete('Xtest_colorcolumn')
671endfunc
672
673" This test must come before the Test_cursorline test, as it appears this
674" defines the Normal highlighting group anyway.
675func Test_1_highlight_Normalgroup_exists()
676  let hlNormal = HighlightArgs('Normal')
677  if !has('gui_running')
678    call assert_match('hi Normal\s*clear', hlNormal)
679  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
680    " expect is DEFAULT_FONT of gui_gtk_x11.c
681    call assert_match('hi Normal\s*font=Monospace 10', hlNormal)
682  elseif has('gui_motif') || has('gui_athena')
683    " expect is DEFAULT_FONT of gui_x11.c
684    call assert_match('hi Normal\s*font=7x13', hlNormal)
685  elseif has('win32')
686    " expect any font
687    call assert_match('hi Normal\s*font=.*', hlNormal)
688  endif
689endfunc
690
691" Do this test last, sometimes restoring the columns doesn't work
692func Test_z_no_space_before_xxx()
693  let l:org_columns = &columns
694  set columns=17
695  let l:hi_StatusLineTermNC = join(split(execute('hi StatusLineTermNC')))
696  call assert_match('StatusLineTermNC xxx', l:hi_StatusLineTermNC)
697  let &columns = l:org_columns
698endfunc
699
700" Test for :highlight command errors
701func Test_highlight_cmd_errors()
702  if has('gui_running')
703    " This test doesn't fail in the MS-Windows console version.
704    call assert_fails('hi Xcomment ctermbg=fg', 'E419:')
705    call assert_fails('hi Xcomment ctermfg=bg', 'E420:')
706    call assert_fails('hi Xcomment ctermfg=ul', 'E453:')
707  endif
708
709  " Try using a very long terminal code. Define a dummy terminal code for this
710  " test.
711  let &t_fo = "\<Esc>1;"
712  let c = repeat("t_fo,", 100) . "t_fo"
713  call assert_fails('exe "hi Xgroup1 start=" . c', 'E422:')
714  let &t_fo = ""
715endfunc
716
717" Test for 'highlight' option
718func Test_highlight_opt()
719  let save_hl = &highlight
720  call assert_fails('set highlight=j:b', 'E474:')
721  set highlight=f\ r
722  call assert_equal('f r', &highlight)
723  set highlight=fb
724  call assert_equal('fb', &highlight)
725  set highlight=fi
726  call assert_equal('fi', &highlight)
727  set highlight=f-
728  call assert_equal('f-', &highlight)
729  set highlight=fr
730  call assert_equal('fr', &highlight)
731  set highlight=fs
732  call assert_equal('fs', &highlight)
733  set highlight=fu
734  call assert_equal('fu', &highlight)
735  set highlight=fc
736  call assert_equal('fc', &highlight)
737  set highlight=ft
738  call assert_equal('ft', &highlight)
739  call assert_fails('set highlight=fr:Search', 'E474:')
740  set highlight=f:$#
741  call assert_match('W18:', v:statusmsg)
742  let &highlight = save_hl
743endfunc
744
745" Test for User group highlighting used in the statusline
746func Test_highlight_User()
747  CheckNotGui
748  hi User1 ctermfg=12
749  redraw!
750  call assert_equal('12', synIDattr(synIDtrans(hlID('User1')), 'fg'))
751  hi clear
752endfunc
753
754" Test for using RGB color values in a highlight group
755func Test_highlight_RGB_color()
756  CheckGui
757  hi MySearch guifg=#110000 guibg=#001100 guisp=#000011
758  call assert_equal('#110000', synIDattr(synIDtrans(hlID('MySearch')), 'fg#'))
759  call assert_equal('#001100', synIDattr(synIDtrans(hlID('MySearch')), 'bg#'))
760  call assert_equal('#000011', synIDattr(synIDtrans(hlID('MySearch')), 'sp#'))
761  hi clear
762endfunc
763
764" Test for using default highlighting group
765func Test_highlight_default()
766  highlight MySearch ctermfg=7
767  highlight default MySearch ctermfg=5
768  let hlSearch = HighlightArgs('MySearch')
769  call assert_match('ctermfg=7', hlSearch)
770
771  highlight default QFName ctermfg=3
772  call assert_match('ctermfg=3', HighlightArgs('QFName'))
773  hi clear
774endfunc
775
776" Test for 'ctermul in a highlight group
777func Test_highlight_ctermul()
778  CheckNotGui
779  call assert_notmatch('ctermul=', HighlightArgs('Normal'))
780  highlight Normal ctermul=3
781  call assert_match('ctermul=3', HighlightArgs('Normal'))
782  highlight Normal ctermul=NONE
783endfunc
784
785" Test for specifying 'start' and 'stop' in a highlight group
786func Test_highlight_start_stop()
787  hi HlGrp1 start=<Esc>[27h;<Esc>[<Space>r;
788  call assert_match("start=^[[27h;^[[ r;", HighlightArgs('HlGrp1'))
789  hi HlGrp1 start=NONE
790  call assert_notmatch("start=", HighlightArgs('HlGrp1'))
791  hi HlGrp2 stop=<Esc>[27h;<Esc>[<Space>r;
792  call assert_match("stop=^[[27h;^[[ r;", HighlightArgs('HlGrp2'))
793  hi HlGrp2 stop=NONE
794  call assert_notmatch("stop=", HighlightArgs('HlGrp2'))
795  hi clear
796endfunc
797
798" Test for setting various 'term' attributes
799func Test_highlight_term_attr()
800  hi HlGrp3 term=bold,underline,undercurl,strikethrough,reverse,italic,standout
801  call assert_equal('hi HlGrp3          term=bold,standout,underline,undercurl,italic,reverse,strikethrough', HighlightArgs('HlGrp3'))
802  hi HlGrp3 term=NONE
803  call assert_equal('hi HlGrp3          cleared', HighlightArgs('HlGrp3'))
804  hi clear
805endfunc
806
807" vim: shiftwidth=2 sts=2 expandtab
808