1" Tests for ":highlight" and highlighting. 2 3source view_util.vim 4 5func Test_highlight() 6 " basic test if ":highlight" doesn't crash 7 highlight 8 hi Search 9 10 " test setting colors. 11 " test clearing one color and all doesn't generate error or warning 12 silent! hi NewGroup term=bold cterm=italic ctermfg=DarkBlue ctermbg=Grey gui= guifg=#00ff00 guibg=Cyan 13 silent! hi Group2 term= cterm= 14 hi Group3 term=underline cterm=bold 15 16 let res = split(execute("hi NewGroup"), "\n")[0] 17 " filter ctermfg and ctermbg, the numbers depend on the terminal 18 let res = substitute(res, 'ctermfg=\d*', 'ctermfg=2', '') 19 let res = substitute(res, 'ctermbg=\d*', 'ctermbg=3', '') 20 call assert_equal("NewGroup xxx term=bold cterm=italic ctermfg=2 ctermbg=3", 21 \ res) 22 call assert_equal("Group2 xxx cleared", 23 \ split(execute("hi Group2"), "\n")[0]) 24 call assert_equal("Group3 xxx term=underline cterm=bold", 25 \ split(execute("hi Group3"), "\n")[0]) 26 27 hi clear NewGroup 28 call assert_equal("NewGroup xxx cleared", 29 \ split(execute("hi NewGroup"), "\n")[0]) 30 call assert_equal("Group2 xxx cleared", 31 \ split(execute("hi Group2"), "\n")[0]) 32 hi Group2 NONE 33 call assert_equal("Group2 xxx cleared", 34 \ split(execute("hi Group2"), "\n")[0]) 35 hi clear 36 call assert_equal("Group3 xxx cleared", 37 \ split(execute("hi Group3"), "\n")[0]) 38 call assert_fails("hi Crash term='asdf", "E475:") 39endfunc 40 41function! HighlightArgs(name) 42 return 'hi ' . substitute(split(execute('hi ' . a:name), '\n')[0], '\<xxx\>', '', '') 43endfunction 44 45function! IsColorable() 46 return has('gui_running') || str2nr(&t_Co) >= 8 47endfunction 48 49function! HiCursorLine() 50 let hiCursorLine = HighlightArgs('CursorLine') 51 if has('gui_running') 52 let guibg = matchstr(hiCursorLine, 'guibg=\w\+') 53 let hi_ul = 'hi CursorLine gui=underline guibg=NONE' 54 let hi_bg = 'hi CursorLine gui=NONE ' . guibg 55 else 56 let hi_ul = 'hi CursorLine cterm=underline ctermbg=NONE' 57 let hi_bg = 'hi CursorLine cterm=NONE ctermbg=Gray' 58 endif 59 return [hiCursorLine, hi_ul, hi_bg] 60endfunction 61 62function! Check_lcs_eol_attrs(attrs, row, col) 63 let save_lcs = &lcs 64 set list 65 66 call assert_equal(a:attrs, ScreenAttrs(a:row, a:col)[0]) 67 68 set nolist 69 let &lcs = save_lcs 70endfunction 71 72func Test_highlight_eol_with_cursorline() 73 let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine() 74 75 call NewWindow('topleft 5', 20) 76 call setline(1, 'abcd') 77 call matchadd('Search', '\n') 78 79 " expected: 80 " 'abcd ' 81 " ^^^^ ^^^^^ no highlight 82 " ^ 'Search' highlight 83 let attrs0 = ScreenAttrs(1, 10)[0] 84 call assert_equal(repeat([attrs0[0]], 4), attrs0[0:3]) 85 call assert_equal(repeat([attrs0[0]], 5), attrs0[5:9]) 86 call assert_notequal(attrs0[0], attrs0[4]) 87 88 setlocal cursorline 89 90 " underline 91 exe hi_ul 92 93 " expected: 94 " 'abcd ' 95 " ^^^^ underline 96 " ^ 'Search' highlight with underline 97 " ^^^^^ underline 98 let attrs = ScreenAttrs(1, 10)[0] 99 call assert_equal(repeat([attrs[0]], 4), attrs[0:3]) 100 call assert_equal([attrs[4]] + repeat([attrs[5]], 5), attrs[4:9]) 101 call assert_notequal(attrs[0], attrs[4]) 102 call assert_notequal(attrs[4], attrs[5]) 103 call assert_notequal(attrs0[0], attrs[0]) 104 call assert_notequal(attrs0[4], attrs[4]) 105 call Check_lcs_eol_attrs(attrs, 1, 10) 106 107 if IsColorable() 108 " bg-color 109 exe hi_bg 110 111 " expected: 112 " 'abcd ' 113 " ^^^^ bg-color of 'CursorLine' 114 " ^ 'Search' highlight 115 " ^^^^^ bg-color of 'CursorLine' 116 let attrs = ScreenAttrs(1, 10)[0] 117 call assert_equal(repeat([attrs[0]], 4), attrs[0:3]) 118 call assert_equal(repeat([attrs[5]], 5), attrs[5:9]) 119 call assert_equal(attrs0[4], attrs[4]) 120 call assert_notequal(attrs[0], attrs[4]) 121 call assert_notequal(attrs[4], attrs[5]) 122 call assert_notequal(attrs0[0], attrs[0]) 123 call assert_notequal(attrs0[5], attrs[5]) 124 call Check_lcs_eol_attrs(attrs, 1, 10) 125 endif 126 127 call CloseWindow() 128 exe hiCursorLine 129endfunc 130 131func Test_highlight_eol_with_cursorline_vertsplit() 132 if !has('vertsplit') 133 return 134 endif 135 136 let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine() 137 138 call NewWindow('topleft 5', 5) 139 call setline(1, 'abcd') 140 call matchadd('Search', '\n') 141 142 let expected = "abcd |abcd " 143 let actual = ScreenLines(1, 15)[0] 144 call assert_equal(expected, actual) 145 146 " expected: 147 " 'abcd |abcd ' 148 " ^^^^ ^^^^^^^^^ no highlight 149 " ^ 'Search' highlight 150 " ^ 'VertSplit' highlight 151 let attrs0 = ScreenAttrs(1, 15)[0] 152 call assert_equal(repeat([attrs0[0]], 4), attrs0[0:3]) 153 call assert_equal(repeat([attrs0[0]], 9), attrs0[6:14]) 154 call assert_notequal(attrs0[0], attrs0[4]) 155 call assert_notequal(attrs0[0], attrs0[5]) 156 call assert_notequal(attrs0[4], attrs0[5]) 157 158 setlocal cursorline 159 160 " expected: 161 " 'abcd |abcd ' 162 " ^^^^ underline 163 " ^ 'Search' highlight with underline 164 " ^ 'VertSplit' highlight 165 " ^^^^^^^^^ no highlight 166 167 " underline 168 exe hi_ul 169 170 let actual = ScreenLines(1, 15)[0] 171 call assert_equal(expected, actual) 172 173 let attrs = ScreenAttrs(1, 15)[0] 174 call assert_equal(repeat([attrs[0]], 4), attrs[0:3]) 175 call assert_equal(repeat([attrs[6]], 9), attrs[6:14]) 176 call assert_equal(attrs0[5:14], attrs[5:14]) 177 call assert_notequal(attrs[0], attrs[4]) 178 call assert_notequal(attrs[0], attrs[5]) 179 call assert_notequal(attrs[0], attrs[6]) 180 call assert_notequal(attrs[4], attrs[5]) 181 call assert_notequal(attrs[5], attrs[6]) 182 call assert_notequal(attrs0[0], attrs[0]) 183 call assert_notequal(attrs0[4], attrs[4]) 184 call Check_lcs_eol_attrs(attrs, 1, 15) 185 186 if IsColorable() 187 " bg-color 188 exe hi_bg 189 190 let actual = ScreenLines(1, 15)[0] 191 call assert_equal(expected, actual) 192 193 let attrs = ScreenAttrs(1, 15)[0] 194 call assert_equal(repeat([attrs[0]], 4), attrs[0:3]) 195 call assert_equal(repeat([attrs[6]], 9), attrs[6:14]) 196 call assert_equal(attrs0[5:14], attrs[5:14]) 197 call assert_notequal(attrs[0], attrs[4]) 198 call assert_notequal(attrs[0], attrs[5]) 199 call assert_notequal(attrs[0], attrs[6]) 200 call assert_notequal(attrs[4], attrs[5]) 201 call assert_notequal(attrs[5], attrs[6]) 202 call assert_notequal(attrs0[0], attrs[0]) 203 call assert_equal(attrs0[4], attrs[4]) 204 call Check_lcs_eol_attrs(attrs, 1, 15) 205 endif 206 207 call CloseWindow() 208 exe hiCursorLine 209endfunc 210 211func Test_highlight_eol_with_cursorline_rightleft() 212 if !has('rightleft') 213 return 214 endif 215 216 let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine() 217 218 call NewWindow('topleft 5', 10) 219 setlocal rightleft 220 call setline(1, 'abcd') 221 call matchadd('Search', '\n') 222 let attrs0 = ScreenAttrs(1, 10)[0] 223 224 setlocal cursorline 225 226 " underline 227 exe hi_ul 228 229 " expected: 230 " ' dcba' 231 " ^^^^ underline 232 " ^ 'Search' highlight with underline 233 " ^^^^^ underline 234 let attrs = ScreenAttrs(1, 10)[0] 235 call assert_equal(repeat([attrs[9]], 4), attrs[6:9]) 236 call assert_equal(repeat([attrs[4]], 5) + [attrs[5]], attrs[0:5]) 237 call assert_notequal(attrs[9], attrs[5]) 238 call assert_notequal(attrs[4], attrs[5]) 239 call assert_notequal(attrs0[9], attrs[9]) 240 call assert_notequal(attrs0[5], attrs[5]) 241 call Check_lcs_eol_attrs(attrs, 1, 10) 242 243 if IsColorable() 244 " bg-color 245 exe hi_bg 246 247 " expected: 248 " ' dcba' 249 " ^^^^ bg-color of 'CursorLine' 250 " ^ 'Search' highlight 251 " ^^^^^ bg-color of 'CursorLine' 252 let attrs = ScreenAttrs(1, 10)[0] 253 call assert_equal(repeat([attrs[9]], 4), attrs[6:9]) 254 call assert_equal(repeat([attrs[4]], 5), attrs[0:4]) 255 call assert_equal(attrs0[5], attrs[5]) 256 call assert_notequal(attrs[9], attrs[5]) 257 call assert_notequal(attrs[5], attrs[4]) 258 call assert_notequal(attrs0[9], attrs[9]) 259 call assert_notequal(attrs0[4], attrs[4]) 260 call Check_lcs_eol_attrs(attrs, 1, 10) 261 endif 262 263 call CloseWindow() 264 exe hiCursorLine 265endfunc 266 267func Test_highlight_eol_with_cursorline_linewrap() 268 let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine() 269 270 call NewWindow('topleft 5', 10) 271 call setline(1, [repeat('a', 51) . 'bcd', '']) 272 call matchadd('Search', '\n') 273 274 setlocal wrap 275 normal! gg$ 276 let attrs0 = ScreenAttrs(5, 10)[0] 277 setlocal cursorline 278 279 " underline 280 exe hi_ul 281 282 " expected: 283 " 'abcd ' 284 " ^^^^ underline 285 " ^ 'Search' highlight with underline 286 " ^^^^^ underline 287 let attrs = ScreenAttrs(5, 10)[0] 288 call assert_equal(repeat([attrs[0]], 4), attrs[0:3]) 289 call assert_equal([attrs[4]] + repeat([attrs[5]], 5), attrs[4:9]) 290 call assert_notequal(attrs[0], attrs[4]) 291 call assert_notequal(attrs[4], attrs[5]) 292 call assert_notequal(attrs0[0], attrs[0]) 293 call assert_notequal(attrs0[4], attrs[4]) 294 call Check_lcs_eol_attrs(attrs, 5, 10) 295 296 if IsColorable() 297 " bg-color 298 exe hi_bg 299 300 " expected: 301 " 'abcd ' 302 " ^^^^ bg-color of 'CursorLine' 303 " ^ 'Search' highlight 304 " ^^^^^ bg-color of 'CursorLine' 305 let attrs = ScreenAttrs(5, 10)[0] 306 call assert_equal(repeat([attrs[0]], 4), attrs[0:3]) 307 call assert_equal(repeat([attrs[5]], 5), attrs[5:9]) 308 call assert_equal(attrs0[4], attrs[4]) 309 call assert_notequal(attrs[0], attrs[4]) 310 call assert_notequal(attrs[4], attrs[5]) 311 call assert_notequal(attrs0[0], attrs[0]) 312 call assert_notequal(attrs0[5], attrs[5]) 313 call Check_lcs_eol_attrs(attrs, 5, 10) 314 endif 315 316 setlocal nocursorline nowrap 317 normal! gg$ 318 let attrs0 = ScreenAttrs(1, 10)[0] 319 setlocal cursorline 320 321 " underline 322 exe hi_ul 323 324 " expected: 325 " 'aaabcd ' 326 " ^^^^^^ underline 327 " ^ 'Search' highlight with underline 328 " ^^^ underline 329 let attrs = ScreenAttrs(1, 10)[0] 330 call assert_equal(repeat([attrs[0]], 6), attrs[0:5]) 331 call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9]) 332 call assert_notequal(attrs[0], attrs[6]) 333 call assert_notequal(attrs[6], attrs[7]) 334 call assert_notequal(attrs0[0], attrs[0]) 335 call assert_notequal(attrs0[6], attrs[6]) 336 call Check_lcs_eol_attrs(attrs, 1, 10) 337 338 if IsColorable() 339 " bg-color 340 exe hi_bg 341 342 " expected: 343 " 'aaabcd ' 344 " ^^^^^^ bg-color of 'CursorLine' 345 " ^ 'Search' highlight 346 " ^^^ bg-color of 'CursorLine' 347 let attrs = ScreenAttrs(1, 10)[0] 348 call assert_equal(repeat([attrs[0]], 6), attrs[0:5]) 349 call assert_equal(repeat([attrs[7]], 3), attrs[7:9]) 350 call assert_equal(attrs0[6], attrs[6]) 351 call assert_notequal(attrs[0], attrs[6]) 352 call assert_notequal(attrs[6], attrs[7]) 353 call assert_notequal(attrs0[0], attrs[0]) 354 call assert_notequal(attrs0[7], attrs[7]) 355 call Check_lcs_eol_attrs(attrs, 1, 10) 356 endif 357 358 call CloseWindow() 359 exe hiCursorLine 360endfunc 361 362func Test_highlight_eol_with_cursorline_sign() 363 if !has('signs') 364 return 365 endif 366 367 let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine() 368 369 call NewWindow('topleft 5', 10) 370 call setline(1, 'abcd') 371 call matchadd('Search', '\n') 372 373 sign define Sign text=>> 374 exe 'sign place 1 line=1 name=Sign buffer=' . bufnr('') 375 let attrs0 = ScreenAttrs(1, 10)[0] 376 setlocal cursorline 377 378 " underline 379 exe hi_ul 380 381 " expected: 382 " '>>abcd ' 383 " ^^ sign 384 " ^^^^ underline 385 " ^ 'Search' highlight with underline 386 " ^^^ underline 387 let attrs = ScreenAttrs(1, 10)[0] 388 call assert_equal(repeat([attrs[2]], 4), attrs[2:5]) 389 call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9]) 390 call assert_notequal(attrs[2], attrs[6]) 391 call assert_notequal(attrs[6], attrs[7]) 392 call assert_notequal(attrs0[2], attrs[2]) 393 call assert_notequal(attrs0[6], attrs[6]) 394 call Check_lcs_eol_attrs(attrs, 1, 10) 395 396 if IsColorable() 397 " bg-color 398 exe hi_bg 399 400 " expected: 401 " '>>abcd ' 402 " ^^ sign 403 " ^^^^ bg-color of 'CursorLine' 404 " ^ 'Search' highlight 405 " ^^^ bg-color of 'CursorLine' 406 let attrs = ScreenAttrs(1, 10)[0] 407 call assert_equal(repeat([attrs[2]], 4), attrs[2:5]) 408 call assert_equal(repeat([attrs[7]], 3), attrs[7:9]) 409 call assert_equal(attrs0[6], attrs[6]) 410 call assert_notequal(attrs[2], attrs[6]) 411 call assert_notequal(attrs[6], attrs[7]) 412 call assert_notequal(attrs0[2], attrs[2]) 413 call assert_notequal(attrs0[7], attrs[7]) 414 call Check_lcs_eol_attrs(attrs, 1, 10) 415 endif 416 417 sign unplace 1 418 call CloseWindow() 419 exe hiCursorLine 420endfunc 421 422func Test_highlight_eol_with_cursorline_breakindent() 423 if !has('linebreak') 424 return 425 endif 426 427 let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine() 428 429 call NewWindow('topleft 5', 10) 430 setlocal breakindent breakindentopt=min:0,shift:1 showbreak=> 431 call setline(1, ' ' . repeat('a', 9) . 'bcd') 432 call matchadd('Search', '\n') 433 let attrs0 = ScreenAttrs(2, 10)[0] 434 setlocal cursorline 435 436 " underline 437 exe hi_ul 438 439 " expected: 440 " ' >bcd ' 441 " ^^^ breakindent and showbreak 442 " ^^^ underline 443 " ^ 'Search' highlight with underline 444 " ^^^ underline 445 let attrs = ScreenAttrs(2, 10)[0] 446 call assert_equal(repeat([attrs[0]], 2), attrs[0:1]) 447 call assert_equal(repeat([attrs[3]], 3), attrs[3:5]) 448 call assert_equal([attrs[6]] + repeat([attrs[7]], 3), attrs[6:9]) 449 call assert_equal(attrs0[0], attrs[0]) 450 call assert_notequal(attrs[0], attrs[2]) 451 call assert_notequal(attrs[2], attrs[3]) 452 call assert_notequal(attrs[3], attrs[6]) 453 call assert_notequal(attrs[6], attrs[7]) 454 call assert_notequal(attrs0[2], attrs[2]) 455 call assert_notequal(attrs0[3], attrs[3]) 456 call assert_notequal(attrs0[6], attrs[6]) 457 call Check_lcs_eol_attrs(attrs, 2, 10) 458 459 if IsColorable() 460 " bg-color 461 exe hi_bg 462 463 " expected: 464 " ' >bcd ' 465 " ^^^ breakindent and showbreak 466 " ^^^ bg-color of 'CursorLine' 467 " ^ 'Search' highlight 468 " ^^^ bg-color of 'CursorLine' 469 let attrs = ScreenAttrs(2, 10)[0] 470 call assert_equal(repeat([attrs[0]], 2), attrs[0:1]) 471 call assert_equal(repeat([attrs[3]], 3), attrs[3:5]) 472 call assert_equal(repeat([attrs[7]], 3), attrs[7:9]) 473 call assert_equal(attrs0[0], attrs[0]) 474 call assert_equal(attrs0[6], attrs[6]) 475 call assert_notequal(attrs[0], attrs[2]) 476 call assert_notequal(attrs[2], attrs[3]) 477 call assert_notequal(attrs[3], attrs[6]) 478 call assert_notequal(attrs[6], attrs[7]) 479 call assert_notequal(attrs0[2], attrs[2]) 480 call assert_notequal(attrs0[3], attrs[3]) 481 call assert_notequal(attrs0[7], attrs[7]) 482 call Check_lcs_eol_attrs(attrs, 2, 10) 483 endif 484 485 call CloseWindow() 486 set 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') 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