1" Test for cursorline and cursorlineopt
2"
3source view_util.vim
4source check.vim
5
6function! s:screen_attr(lnum) abort
7  return map(range(1, 8), 'screenattr(a:lnum, v:val)')
8endfunction
9
10function! s:test_windows(h, w) abort
11  call NewWindow(a:h, a:w)
12endfunction
13
14function! s:close_windows() abort
15  call CloseWindow()
16endfunction
17
18function! s:new_hi() abort
19  redir => save_hi
20  silent! hi CursorLineNr
21  redir END
22  let save_hi = join(split(substitute(save_hi, '\s*xxx\s*', ' ', ''), "\n"), '')
23  exe 'hi' save_hi 'ctermbg=0 guibg=Black'
24  return save_hi
25endfunction
26
27func Test_cursorline_highlight1()
28  let save_hi = s:new_hi()
29  try
30    call s:test_windows(10, 20)
31    call setline(1, repeat(['aaaa'], 10))
32    redraw
33    let attr01 = s:screen_attr(1)
34    call assert_equal(repeat([attr01[0]], 8), attr01)
35
36    setl number numberwidth=4
37    redraw
38    let attr11 = s:screen_attr(1)
39    call assert_equal(repeat([attr11[0]], 4), attr11[0:3])
40    call assert_equal(repeat([attr11[4]], 4), attr11[4:7])
41    call assert_notequal(attr11[0], attr11[4])
42
43    setl cursorline
44    redraw
45    let attr21 = s:screen_attr(1)
46    let attr22 = s:screen_attr(2)
47    call assert_equal(repeat([attr21[0]], 4), attr21[0:3])
48    call assert_equal(repeat([attr21[4]], 4), attr21[4:7])
49    call assert_equal(attr11, attr22)
50    call assert_notequal(attr22, attr21)
51
52    setl nocursorline relativenumber
53    redraw
54    let attr31 = s:screen_attr(1)
55    call assert_equal(attr21[0:3], attr31[0:3])
56    call assert_equal(attr11[4:7], attr31[4:7])
57
58    call s:close_windows()
59  finally
60    exe 'hi' save_hi
61  endtry
62endfunc
63
64func Test_cursorline_highlight2()
65  CheckOption cursorlineopt
66
67  let save_hi = s:new_hi()
68  try
69    call s:test_windows(10, 20)
70    call setline(1, repeat(['aaaa'], 10))
71    redraw
72    let attr0 = s:screen_attr(1)
73    call assert_equal(repeat([attr0[0]], 8), attr0)
74
75    setl number
76    redraw
77    let attr1 = s:screen_attr(1)
78    call assert_notequal(attr0[0:3], attr1[0:3])
79    call assert_equal(attr0[0:3], attr1[4:7])
80
81    setl cursorline cursorlineopt=both
82    redraw
83    let attr2 = s:screen_attr(1)
84    call assert_notequal(attr1[0:3], attr2[0:3])
85    call assert_notequal(attr1[4:7], attr2[4:7])
86
87    setl cursorlineopt=line
88    redraw
89    let attr3 = s:screen_attr(1)
90    call assert_equal(attr1[0:3], attr3[0:3])
91    call assert_equal(attr2[4:7], attr3[4:7])
92
93    setl cursorlineopt=number
94    redraw
95    let attr4 = s:screen_attr(1)
96    call assert_equal(attr2[0:3], attr4[0:3])
97    call assert_equal(attr1[4:7], attr4[4:7])
98
99    setl nonumber
100    redraw
101    let attr5 = s:screen_attr(1)
102    call assert_equal(attr0, attr5)
103
104    call s:close_windows()
105  finally
106    exe 'hi' save_hi
107  endtry
108endfunc
109