1300af82eSBram Moolenaar" Test 'statusline'
2300af82eSBram Moolenaar"
3300af82eSBram Moolenaar" Not tested yet:
4300af82eSBram Moolenaar"   %N
5300af82eSBram Moolenaar
6300af82eSBram Moolenaarsource view_util.vim
75a4c3082SBram Moolenaarsource check.vim
8dbe5d361SBram Moolenaarsource screendump.vim
9300af82eSBram Moolenaar
10300af82eSBram Moolenaarfunc s:get_statusline()
11300af82eSBram Moolenaar  return ScreenLines(&lines - 1, &columns)[0]
12300af82eSBram Moolenaarendfunc
13300af82eSBram Moolenaar
14300af82eSBram Moolenaarfunc StatuslineWithCaughtError()
15a742e084SBram Moolenaar  let s:func_in_statusline_called = 1
16a742e084SBram Moolenaar  try
17a742e084SBram Moolenaar    call eval('unknown expression')
18a742e084SBram Moolenaar  catch
19a742e084SBram Moolenaar  endtry
20a742e084SBram Moolenaar  return ''
21300af82eSBram Moolenaarendfunc
22a742e084SBram Moolenaar
23300af82eSBram Moolenaarfunc StatuslineWithError()
24a742e084SBram Moolenaar  let s:func_in_statusline_called = 1
25a742e084SBram Moolenaar  call eval('unknown expression')
26a742e084SBram Moolenaar  return ''
27300af82eSBram Moolenaarendfunc
28a742e084SBram Moolenaar
29300af82eSBram Moolenaar" Function used to display syntax group.
30300af82eSBram Moolenaarfunc SyntaxItem()
311c6fd1e1SBram Moolenaar  call assert_equal(s:expected_curbuf, g:actual_curbuf)
321c6fd1e1SBram Moolenaar  call assert_equal(s:expected_curwin, g:actual_curwin)
33300af82eSBram Moolenaar  return synIDattr(synID(line("."), col("."),1), "name")
34300af82eSBram Moolenaarendfunc
35300af82eSBram Moolenaar
36300af82eSBram Moolenaarfunc Test_caught_error_in_statusline()
37a742e084SBram Moolenaar  let s:func_in_statusline_called = 0
38a742e084SBram Moolenaar  set laststatus=2
39a742e084SBram Moolenaar  let statusline = '%{StatuslineWithCaughtError()}'
40a742e084SBram Moolenaar  let &statusline = statusline
41a742e084SBram Moolenaar  redrawstatus
42a742e084SBram Moolenaar  call assert_true(s:func_in_statusline_called)
43a742e084SBram Moolenaar  call assert_equal(statusline, &statusline)
44a742e084SBram Moolenaar  set statusline=
45300af82eSBram Moolenaarendfunc
46a742e084SBram Moolenaar
47300af82eSBram Moolenaarfunc Test_statusline_will_be_disabled_with_error()
48a742e084SBram Moolenaar  let s:func_in_statusline_called = 0
49a742e084SBram Moolenaar  set laststatus=2
50a742e084SBram Moolenaar  let statusline = '%{StatuslineWithError()}'
51a742e084SBram Moolenaar  try
52a742e084SBram Moolenaar    let &statusline = statusline
53a742e084SBram Moolenaar    redrawstatus
54a742e084SBram Moolenaar  catch
55a742e084SBram Moolenaar  endtry
56a742e084SBram Moolenaar  call assert_true(s:func_in_statusline_called)
57a742e084SBram Moolenaar  call assert_equal('', &statusline)
58a742e084SBram Moolenaar  set statusline=
59300af82eSBram Moolenaarendfunc
60300af82eSBram Moolenaar
61300af82eSBram Moolenaarfunc Test_statusline()
625a4c3082SBram Moolenaar  CheckFeature quickfix
635a4c3082SBram Moolenaar
644014e2ceSBram Moolenaar  " %a: Argument list ({current} of {max})
654014e2ceSBram Moolenaar  set statusline=%a
664014e2ceSBram Moolenaar  call assert_match('^\s*$', s:get_statusline())
674014e2ceSBram Moolenaar  arglocal a1 a2
684014e2ceSBram Moolenaar  rewind
694014e2ceSBram Moolenaar  call assert_match('^ (1 of 2)\s*$', s:get_statusline())
704014e2ceSBram Moolenaar  next
714014e2ceSBram Moolenaar  call assert_match('^ (2 of 2)\s*$', s:get_statusline())
724014e2ceSBram Moolenaar  e Xstatusline
734014e2ceSBram Moolenaar  call assert_match('^ ((2) of 2)\s*$', s:get_statusline())
744014e2ceSBram Moolenaar
75300af82eSBram Moolenaar  only
76300af82eSBram Moolenaar  set laststatus=2
77300af82eSBram Moolenaar  set splitbelow
78316c1679SBram Moolenaar  call setline(1, range(1, 10000))
79300af82eSBram Moolenaar
80300af82eSBram Moolenaar  " %b: Value of character under cursor.
81300af82eSBram Moolenaar  " %B: As above, in hexadecimal.
82316c1679SBram Moolenaar  call cursor(9000, 1)
83300af82eSBram Moolenaar  set statusline=%b,%B
84316c1679SBram Moolenaar  call assert_match('^57,39\s*$', s:get_statusline())
85300af82eSBram Moolenaar
86300af82eSBram Moolenaar  " %o: Byte number in file of byte under cursor, first byte is 1.
87300af82eSBram Moolenaar  " %O: As above, in hexadecimal.
88300af82eSBram Moolenaar  set statusline=%o,%O
89300af82eSBram Moolenaar  set fileformat=dos
90316c1679SBram Moolenaar  call assert_match('^52888,CE98\s*$', s:get_statusline())
91300af82eSBram Moolenaar  set fileformat=mac
92316c1679SBram Moolenaar  call assert_match('^43889,AB71\s*$', s:get_statusline())
93300af82eSBram Moolenaar  set fileformat=unix
94316c1679SBram Moolenaar  call assert_match('^43889,AB71\s*$', s:get_statusline())
95300af82eSBram Moolenaar  set fileformat&
96300af82eSBram Moolenaar
97300af82eSBram Moolenaar  " %f: Path to the file in the buffer, as typed or relative to current dir.
98300af82eSBram Moolenaar  set statusline=%f
99300af82eSBram Moolenaar  call assert_match('^Xstatusline\s*$', s:get_statusline())
100300af82eSBram Moolenaar
101300af82eSBram Moolenaar  " %F: Full path to the file in the buffer.
102300af82eSBram Moolenaar  set statusline=%F
103300af82eSBram Moolenaar  call assert_match('/testdir/Xstatusline\s*$', s:get_statusline())
104300af82eSBram Moolenaar
105832adf9bSBram Moolenaar  " Test for min and max width with %(. For some reason, if this test is moved
106832adf9bSBram Moolenaar  " after the below test for the help buffer flag, then the code to truncate
107832adf9bSBram Moolenaar  " the string is not executed.
108832adf9bSBram Moolenaar  set statusline=%015(%f%)
109832adf9bSBram Moolenaar  call assert_match('^    Xstatusline\s*$', s:get_statusline())
110832adf9bSBram Moolenaar  set statusline=%.6(%f%)
111832adf9bSBram Moolenaar  call assert_match('^<sline\s*$', s:get_statusline())
112832adf9bSBram Moolenaar  set statusline=%14f
113832adf9bSBram Moolenaar  call assert_match('^   Xstatusline\s*$', s:get_statusline())
114832adf9bSBram Moolenaar  set statusline=%.4L
115832adf9bSBram Moolenaar  call assert_match('^10>3\s*$', s:get_statusline())
116832adf9bSBram Moolenaar
117300af82eSBram Moolenaar  " %h: Help buffer flag, text is "[help]".
118300af82eSBram Moolenaar  " %H: Help buffer flag, text is ",HLP".
119300af82eSBram Moolenaar  set statusline=%h,%H
120300af82eSBram Moolenaar  call assert_match('^,\s*$', s:get_statusline())
121300af82eSBram Moolenaar  help
122300af82eSBram Moolenaar  call assert_match('^\[Help\],HLP\s*$', s:get_statusline())
123300af82eSBram Moolenaar  helpclose
124300af82eSBram Moolenaar
125300af82eSBram Moolenaar  " %k: Value of "b:keymap_name" or 'keymap'
126300af82eSBram Moolenaar  "     when :lmap mappings are being used: <keymap>"
127300af82eSBram Moolenaar  set statusline=%k
128300af82eSBram Moolenaar  if has('keymap')
129300af82eSBram Moolenaar    set keymap=esperanto
130300af82eSBram Moolenaar    call assert_match('^<Eo>\s*$', s:get_statusline())
131300af82eSBram Moolenaar    set keymap&
132300af82eSBram Moolenaar  else
133300af82eSBram Moolenaar    call assert_match('^\s*$', s:get_statusline())
134300af82eSBram Moolenaar  endif
135300af82eSBram Moolenaar
136300af82eSBram Moolenaar  " %l: Line number.
137300af82eSBram Moolenaar  " %L: Number of line in buffer.
138300af82eSBram Moolenaar  " %c: Column number.
139300af82eSBram Moolenaar  set statusline=%l/%L,%c
140316c1679SBram Moolenaar  call assert_match('^9000/10000,1\s*$', s:get_statusline())
141300af82eSBram Moolenaar
142300af82eSBram Moolenaar  " %m: Modified flag, text is "[+]", "[-]" if 'modifiable' is off.
143300af82eSBram Moolenaar  " %M: Modified flag, text is ",+" or ",-".
144300af82eSBram Moolenaar  set statusline=%m%M
145300af82eSBram Moolenaar  call assert_match('^\[+\],+\s*$', s:get_statusline())
146300af82eSBram Moolenaar  set nomodifiable
147300af82eSBram Moolenaar  call assert_match('^\[+-\],+-\s*$', s:get_statusline())
148300af82eSBram Moolenaar  write
149300af82eSBram Moolenaar  call assert_match('^\[-\],-\s*$', s:get_statusline())
150300af82eSBram Moolenaar  set modifiable&
151300af82eSBram Moolenaar  call assert_match('^\s*$', s:get_statusline())
152300af82eSBram Moolenaar
153300af82eSBram Moolenaar  " %n: Buffer number.
154300af82eSBram Moolenaar  set statusline=%n
155300af82eSBram Moolenaar  call assert_match('^'.bufnr('%').'\s*$', s:get_statusline())
156300af82eSBram Moolenaar
157300af82eSBram Moolenaar  " %p: Percentage through file in lines as in CTRL-G.
158300af82eSBram Moolenaar  " %P: Percentage through file of displayed window.
159300af82eSBram Moolenaar  set statusline=%p,%P
160300af82eSBram Moolenaar  0
161300af82eSBram Moolenaar  call assert_match('^0,Top\s*$', s:get_statusline())
162300af82eSBram Moolenaar  norm G
163300af82eSBram Moolenaar  call assert_match('^100,Bot\s*$', s:get_statusline())
164316c1679SBram Moolenaar  9000
165300af82eSBram Moolenaar  " Don't check the exact percentage as it depends on the window size
166300af82eSBram Moolenaar  call assert_match('^90,\(Top\|Bot\|\d\+%\)\s*$', s:get_statusline())
167300af82eSBram Moolenaar
168300af82eSBram Moolenaar  " %q: "[Quickfix List]", "[Location List]" or empty.
169300af82eSBram Moolenaar  set statusline=%q
170300af82eSBram Moolenaar  call assert_match('^\s*$', s:get_statusline())
171300af82eSBram Moolenaar  copen
172300af82eSBram Moolenaar  call assert_match('^\[Quickfix List\]\s*$', s:get_statusline())
173300af82eSBram Moolenaar  cclose
174300af82eSBram Moolenaar  lexpr getline(1, 2)
175300af82eSBram Moolenaar  lopen
176300af82eSBram Moolenaar  call assert_match('^\[Location List\]\s*$', s:get_statusline())
177300af82eSBram Moolenaar  lclose
178300af82eSBram Moolenaar
179300af82eSBram Moolenaar  " %r: Readonly flag, text is "[RO]".
180300af82eSBram Moolenaar  " %R: Readonly flag, text is ",RO".
181300af82eSBram Moolenaar  set statusline=%r,%R
182300af82eSBram Moolenaar  call assert_match('^,\s*$', s:get_statusline())
183300af82eSBram Moolenaar  help
184300af82eSBram Moolenaar  call assert_match('^\[RO\],RO\s*$', s:get_statusline())
185300af82eSBram Moolenaar  helpclose
186300af82eSBram Moolenaar
187300af82eSBram Moolenaar  " %t: File name (tail) of file in the buffer.
188300af82eSBram Moolenaar  set statusline=%t
189300af82eSBram Moolenaar  call assert_match('^Xstatusline\s*$', s:get_statusline())
190300af82eSBram Moolenaar
191300af82eSBram Moolenaar  " %v: Virtual column number.
192300af82eSBram Moolenaar  " %V: Virtual column number as -{num}. Not displayed if equal to 'c'.
193316c1679SBram Moolenaar  call cursor(9000, 2)
194300af82eSBram Moolenaar  set statusline=%v,%V
195300af82eSBram Moolenaar  call assert_match('^2,\s*$', s:get_statusline())
196300af82eSBram Moolenaar  set virtualedit=all
197300af82eSBram Moolenaar  norm 10|
198300af82eSBram Moolenaar  call assert_match('^10,-10\s*$', s:get_statusline())
199300af82eSBram Moolenaar  set virtualedit&
200300af82eSBram Moolenaar
201300af82eSBram Moolenaar  " %w: Preview window flag, text is "[Preview]".
202300af82eSBram Moolenaar  " %W: Preview window flag, text is ",PRV".
203300af82eSBram Moolenaar  set statusline=%w%W
204300af82eSBram Moolenaar  call assert_match('^\s*$', s:get_statusline())
205300af82eSBram Moolenaar  pedit
206300af82eSBram Moolenaar  wincmd j
207300af82eSBram Moolenaar  call assert_match('^\[Preview\],PRV\s*$', s:get_statusline())
208300af82eSBram Moolenaar  pclose
209300af82eSBram Moolenaar
210300af82eSBram Moolenaar  " %y: Type of file in the buffer, e.g., "[vim]". See 'filetype'.
211300af82eSBram Moolenaar  " %Y: Type of file in the buffer, e.g., ",VIM". See 'filetype'.
212300af82eSBram Moolenaar  set statusline=%y\ %Y
213300af82eSBram Moolenaar  call assert_match('^\s*$', s:get_statusline())
214300af82eSBram Moolenaar  setfiletype vim
215300af82eSBram Moolenaar  call assert_match('^\[vim\] VIM\s*$', s:get_statusline())
216300af82eSBram Moolenaar
217300af82eSBram Moolenaar  " %=: Separation point between left and right aligned items.
218300af82eSBram Moolenaar  set statusline=foo%=bar
219300af82eSBram Moolenaar  call assert_match('^foo\s\+bar\s*$', s:get_statusline())
220300af82eSBram Moolenaar
221300af82eSBram Moolenaar  " Test min/max width, leading zeroes, left/right justify.
222300af82eSBram Moolenaar  set statusline=%04B
223316c1679SBram Moolenaar  call cursor(9000, 1)
224316c1679SBram Moolenaar  call assert_match('^0039\s*$', s:get_statusline())
225300af82eSBram Moolenaar  set statusline=#%4B#
226316c1679SBram Moolenaar  call assert_match('^#  39#\s*$', s:get_statusline())
227300af82eSBram Moolenaar  set statusline=#%-4B#
228316c1679SBram Moolenaar  call assert_match('^#39  #\s*$', s:get_statusline())
229300af82eSBram Moolenaar  set statusline=%.6f
230300af82eSBram Moolenaar  call assert_match('^<sline\s*$', s:get_statusline())
231300af82eSBram Moolenaar
232300af82eSBram Moolenaar  " %<: Where to truncate.
233316c1679SBram Moolenaar  " First check with when %< should not truncate with many columns
234316c1679SBram Moolenaar  exe 'set statusline=a%<b' . repeat('c', &columns - 3) . 'd'
235316c1679SBram Moolenaar  call assert_match('^abc\+d$', s:get_statusline())
236316c1679SBram Moolenaar  exe 'set statusline=a' . repeat('b', &columns - 2) . '%<c'
237316c1679SBram Moolenaar  call assert_match('^ab\+c$', s:get_statusline())
238316c1679SBram Moolenaar  " Then check when %< should truncate when there with too few columns.
239316c1679SBram Moolenaar  exe 'set statusline=a%<b' . repeat('c', &columns - 2) . 'd'
240316c1679SBram Moolenaar  call assert_match('^a<c\+d$', s:get_statusline())
241316c1679SBram Moolenaar  exe 'set statusline=a' . repeat('b', &columns - 1) . '%<c'
242316c1679SBram Moolenaar  call assert_match('^ab\+>$', s:get_statusline())
243300af82eSBram Moolenaar
244300af82eSBram Moolenaar  "%{: Evaluate expression between '%{' and '}' and substitute result.
245300af82eSBram Moolenaar  syntax on
2461c6fd1e1SBram Moolenaar  let s:expected_curbuf = string(bufnr(''))
2471c6fd1e1SBram Moolenaar  let s:expected_curwin = string(win_getid())
248300af82eSBram Moolenaar  set statusline=%{SyntaxItem()}
249300af82eSBram Moolenaar  call assert_match('^vimNumber\s*$', s:get_statusline())
250300af82eSBram Moolenaar  s/^/"/
251300af82eSBram Moolenaar  call assert_match('^vimLineComment\s*$', s:get_statusline())
252300af82eSBram Moolenaar  syntax off
253300af82eSBram Moolenaar
25430e3de21Sshadmansaleh  "%{%expr%}: evaluates enxpressions present in result of expr
25530e3de21Sshadmansaleh  func! Inner_eval()
25630e3de21Sshadmansaleh    return '%n some other text'
25730e3de21Sshadmansaleh  endfunc
25830e3de21Sshadmansaleh  func! Outer_eval()
25930e3de21Sshadmansaleh    return 'some text %{%Inner_eval()%}'
26030e3de21Sshadmansaleh  endfunc
26130e3de21Sshadmansaleh  set statusline=%{%Outer_eval()%}
26230e3de21Sshadmansaleh  call assert_match('^some text ' . bufnr() . ' some other text\s*$', s:get_statusline())
26330e3de21Sshadmansaleh  delfunc Inner_eval
26430e3de21Sshadmansaleh  delfunc Outer_eval
26530e3de21Sshadmansaleh
26630e3de21Sshadmansaleh  "%{%expr%}: Doesn't get stuck in recursion
26730e3de21Sshadmansaleh  func! Recurse_eval()
26830e3de21Sshadmansaleh    return '%{%Recurse_eval()%}'
26930e3de21Sshadmansaleh  endfunc
27030e3de21Sshadmansaleh  set statusline=%{%Recurse_eval()%}
27130e3de21Sshadmansaleh  call assert_match('^%{%Recurse_eval()%}\s*$', s:get_statusline())
27230e3de21Sshadmansaleh  delfunc Recurse_eval
27330e3de21Sshadmansaleh
274300af82eSBram Moolenaar  "%(: Start of item group.
275300af82eSBram Moolenaar  set statusline=ab%(cd%q%)de
276300af82eSBram Moolenaar  call assert_match('^abde\s*$', s:get_statusline())
277300af82eSBram Moolenaar  copen
2781ef9bbe2SBram Moolenaar  call assert_match('^abcd\[Quickfix List]de\s*$', s:get_statusline())
279300af82eSBram Moolenaar  cclose
280300af82eSBram Moolenaar
281300af82eSBram Moolenaar  " %#: Set highlight group. The name must follow and then a # again.
282300af82eSBram Moolenaar  set statusline=ab%#Todo#cd%#Error#ef
283300af82eSBram Moolenaar  call assert_match('^abcdef\s*$', s:get_statusline())
284300af82eSBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
285300af82eSBram Moolenaar  let sa2=screenattr(&lines - 1, 3)
286300af82eSBram Moolenaar  let sa3=screenattr(&lines - 1, 5)
287300af82eSBram Moolenaar  call assert_notequal(sa1, sa2)
288300af82eSBram Moolenaar  call assert_notequal(sa1, sa3)
289300af82eSBram Moolenaar  call assert_notequal(sa2, sa3)
290300af82eSBram Moolenaar  call assert_equal(sa1, screenattr(&lines - 1, 2))
291300af82eSBram Moolenaar  call assert_equal(sa2, screenattr(&lines - 1, 4))
292300af82eSBram Moolenaar  call assert_equal(sa3, screenattr(&lines - 1, 6))
293300af82eSBram Moolenaar  call assert_equal(sa3, screenattr(&lines - 1, 7))
294300af82eSBram Moolenaar
295300af82eSBram Moolenaar  " %*: Set highlight group to User{N}
296300af82eSBram Moolenaar  set statusline=a%1*b%0*c
297300af82eSBram Moolenaar  call assert_match('^abc\s*$', s:get_statusline())
298300af82eSBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
299300af82eSBram Moolenaar  let sa2=screenattr(&lines - 1, 2)
300300af82eSBram Moolenaar  let sa3=screenattr(&lines - 1, 3)
301300af82eSBram Moolenaar  call assert_equal(sa1, sa3)
302300af82eSBram Moolenaar  call assert_notequal(sa1, sa2)
303300af82eSBram Moolenaar
3046b89dbb5SBram Moolenaar  " An empty group that contains highlight changes
3056b89dbb5SBram Moolenaar  let g:a = ''
3066b89dbb5SBram Moolenaar  set statusline=ab%(cd%1*%{g:a}%*%)de
3076b89dbb5SBram Moolenaar  call assert_match('^abde\s*$', s:get_statusline())
3086b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3096b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 4)
3106b89dbb5SBram Moolenaar  call assert_equal(sa1, sa2)
3116b89dbb5SBram Moolenaar  let g:a = 'X'
3126b89dbb5SBram Moolenaar  call assert_match('^abcdXde\s*$', s:get_statusline())
3136b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3146b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 5)
3156b89dbb5SBram Moolenaar  let sa3=screenattr(&lines - 1, 7)
3166b89dbb5SBram Moolenaar  call assert_equal(sa1, sa3)
3176b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3186b89dbb5SBram Moolenaar
3196b89dbb5SBram Moolenaar  let g:a = ''
3206b89dbb5SBram Moolenaar  set statusline=ab%1*%(cd%*%{g:a}%1*%)de
3216b89dbb5SBram Moolenaar  call assert_match('^abde\s*$', s:get_statusline())
3226b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3236b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 4)
3246b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3256b89dbb5SBram Moolenaar  let g:a = 'X'
3266b89dbb5SBram Moolenaar  call assert_match('^abcdXde\s*$', s:get_statusline())
3276b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3286b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 3)
3296b89dbb5SBram Moolenaar  let sa3=screenattr(&lines - 1, 5)
3306b89dbb5SBram Moolenaar  let sa4=screenattr(&lines - 1, 7)
3316b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3326b89dbb5SBram Moolenaar  call assert_equal(sa1, sa3)
3336b89dbb5SBram Moolenaar  call assert_equal(sa2, sa4)
3346b89dbb5SBram Moolenaar
3356b89dbb5SBram Moolenaar  " An empty group that contains highlight changes and doesn't reset them
3366b89dbb5SBram Moolenaar  let g:a = ''
3376b89dbb5SBram Moolenaar  set statusline=ab%(cd%1*%{g:a}%)de
3386b89dbb5SBram Moolenaar  call assert_match('^abcdde\s*$', s:get_statusline())
3396b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3406b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 5)
3416b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3426b89dbb5SBram Moolenaar  let g:a = 'X'
3436b89dbb5SBram Moolenaar  call assert_match('^abcdXde\s*$', s:get_statusline())
3446b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3456b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 5)
3466b89dbb5SBram Moolenaar  let sa3=screenattr(&lines - 1, 7)
3476b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3486b89dbb5SBram Moolenaar  call assert_equal(sa2, sa3)
3496b89dbb5SBram Moolenaar
3506b89dbb5SBram Moolenaar  let g:a = ''
3516b89dbb5SBram Moolenaar  set statusline=ab%1*%(cd%*%{g:a}%)de
3526b89dbb5SBram Moolenaar  call assert_match('^abcdde\s*$', s:get_statusline())
3536b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3546b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 3)
3556b89dbb5SBram Moolenaar  let sa3=screenattr(&lines - 1, 5)
3566b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3576b89dbb5SBram Moolenaar  call assert_equal(sa1, sa3)
3586b89dbb5SBram Moolenaar  let g:a = 'X'
3596b89dbb5SBram Moolenaar  call assert_match('^abcdXde\s*$', s:get_statusline())
3606b89dbb5SBram Moolenaar  let sa1=screenattr(&lines - 1, 1)
3616b89dbb5SBram Moolenaar  let sa2=screenattr(&lines - 1, 3)
3626b89dbb5SBram Moolenaar  let sa3=screenattr(&lines - 1, 5)
3636b89dbb5SBram Moolenaar  let sa4=screenattr(&lines - 1, 7)
3646b89dbb5SBram Moolenaar  call assert_notequal(sa1, sa2)
3656b89dbb5SBram Moolenaar  call assert_equal(sa1, sa3)
3666b89dbb5SBram Moolenaar  call assert_equal(sa1, sa4)
3676b89dbb5SBram Moolenaar
368235dddf1SBram Moolenaar  let g:a = ''
369235dddf1SBram Moolenaar  set statusline=%#Error#{%(\ %{g:a}\ %)}
370235dddf1SBram Moolenaar  call assert_match('^{}\s*$', s:get_statusline())
371235dddf1SBram Moolenaar  let g:a = 'X'
372235dddf1SBram Moolenaar  call assert_match('^{ X }\s*$', s:get_statusline())
373235dddf1SBram Moolenaar
374300af82eSBram Moolenaar  " %%: a percent sign.
375300af82eSBram Moolenaar  set statusline=10%%
376300af82eSBram Moolenaar  call assert_match('^10%\s*$', s:get_statusline())
377300af82eSBram Moolenaar
378300af82eSBram Moolenaar  " %!: evaluated expression is used as the option value
379300af82eSBram Moolenaar  set statusline=%!2*3+1
380300af82eSBram Moolenaar  call assert_match('7\s*$', s:get_statusline())
381300af82eSBram Moolenaar
3821c6fd1e1SBram Moolenaar  func GetNested()
3831c6fd1e1SBram Moolenaar    call assert_equal(string(win_getid()), g:actual_curwin)
3841c6fd1e1SBram Moolenaar    call assert_equal(string(bufnr('')), g:actual_curbuf)
3851c6fd1e1SBram Moolenaar    return 'nested'
3861c6fd1e1SBram Moolenaar  endfunc
3871c6fd1e1SBram Moolenaar  func GetStatusLine()
3881c6fd1e1SBram Moolenaar    call assert_equal(win_getid(), g:statusline_winid)
3891c6fd1e1SBram Moolenaar    return 'the %{GetNested()} line'
3901c6fd1e1SBram Moolenaar  endfunc
3911c6fd1e1SBram Moolenaar  set statusline=%!GetStatusLine()
3921c6fd1e1SBram Moolenaar  call assert_match('the nested line', s:get_statusline())
3931c6fd1e1SBram Moolenaar  call assert_false(exists('g:actual_curwin'))
3941c6fd1e1SBram Moolenaar  call assert_false(exists('g:actual_curbuf'))
3951c6fd1e1SBram Moolenaar  call assert_false(exists('g:statusline_winid'))
3961c6fd1e1SBram Moolenaar  delfunc GetNested
3971c6fd1e1SBram Moolenaar  delfunc GetStatusLine
3981c6fd1e1SBram Moolenaar
3998133cc6bSBram Moolenaar  " Test statusline works with 80+ items
4008133cc6bSBram Moolenaar  function! StatusLabel()
4018133cc6bSBram Moolenaar    redrawstatus
4028133cc6bSBram Moolenaar    return '[label]'
4038133cc6bSBram Moolenaar  endfunc
4048133cc6bSBram Moolenaar  let statusline = '%{StatusLabel()}'
4058133cc6bSBram Moolenaar  for i in range(150)
4068133cc6bSBram Moolenaar    let statusline .= '%#TabLine' . (i % 2 == 0 ? 'Fill' : 'Sel') . '#' . string(i)[0]
4078133cc6bSBram Moolenaar  endfor
4088133cc6bSBram Moolenaar  let &statusline = statusline
4098133cc6bSBram Moolenaar  redrawstatus
4108133cc6bSBram Moolenaar  set statusline&
4118133cc6bSBram Moolenaar  delfunc StatusLabel
4128133cc6bSBram Moolenaar
4138133cc6bSBram Moolenaar
414300af82eSBram Moolenaar  " Check statusline in current and non-current window
415300af82eSBram Moolenaar  " with the 'fillchars' option.
416300af82eSBram Moolenaar  set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
417300af82eSBram Moolenaar  vsplit
418300af82eSBram Moolenaar  set statusline=x%=y
419300af82eSBram Moolenaar  call assert_match('^x^\+y^x=\+y$', s:get_statusline())
420300af82eSBram Moolenaar  set fillchars&
421300af82eSBram Moolenaar  close
422300af82eSBram Moolenaar
423300af82eSBram Moolenaar  %bw!
424300af82eSBram Moolenaar  call delete('Xstatusline')
425300af82eSBram Moolenaar  set statusline&
426300af82eSBram Moolenaar  set laststatus&
427300af82eSBram Moolenaar  set splitbelow&
428300af82eSBram Moolenaarendfunc
429dee50a51SBram Moolenaar
430dee50a51SBram Moolenaarfunc Test_statusline_visual()
431dee50a51SBram Moolenaar  func CallWordcount()
432dee50a51SBram Moolenaar    call wordcount()
433dee50a51SBram Moolenaar  endfunc
434dee50a51SBram Moolenaar  new x1
435dee50a51SBram Moolenaar  setl statusline=count=%{CallWordcount()}
436dee50a51SBram Moolenaar  " buffer must not be empty
437dee50a51SBram Moolenaar  call setline(1, 'hello')
438dee50a51SBram Moolenaar
439dee50a51SBram Moolenaar  " window with more lines than x1
440dee50a51SBram Moolenaar  new x2
441dee50a51SBram Moolenaar  call setline(1, range(10))
442dee50a51SBram Moolenaar  $
443dee50a51SBram Moolenaar  " Visual mode in line below liast line in x1 should not give ml_get error
444dee50a51SBram Moolenaar  call feedkeys("\<C-V>", "xt")
445dee50a51SBram Moolenaar  redraw
446dee50a51SBram Moolenaar
447dee50a51SBram Moolenaar  delfunc CallWordcount
448dee50a51SBram Moolenaar  bwipe! x1
449dee50a51SBram Moolenaar  bwipe! x2
450dee50a51SBram Moolenaarendfunc
451dbe5d361SBram Moolenaar
452dbe5d361SBram Moolenaarfunc Test_statusline_removed_group()
453dbe5d361SBram Moolenaar  CheckScreendump
454dbe5d361SBram Moolenaar
455dbe5d361SBram Moolenaar  let lines =<< trim END
456dbe5d361SBram Moolenaar    scriptencoding utf-8
457dbe5d361SBram Moolenaar    set laststatus=2
458dbe5d361SBram Moolenaar    let &statusline = '%#StatColorHi2#%(✓%#StatColorHi2#%) Q≡'
459dbe5d361SBram Moolenaar  END
460dbe5d361SBram Moolenaar  call writefile(lines, 'XTest_statusline')
461dbe5d361SBram Moolenaar
462dbe5d361SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 10, 'cols': 50})
4636a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
464dbe5d361SBram Moolenaar  call VerifyScreenDump(buf, 'Test_statusline_1', {})
465dbe5d361SBram Moolenaar
466dbe5d361SBram Moolenaar  " clean up
467dbe5d361SBram Moolenaar  call StopVimInTerminal(buf)
468dbe5d361SBram Moolenaar  call delete('XTest_statusline')
469dbe5d361SBram Moolenaarendfunc
470832adf9bSBram Moolenaar
471ce0b7571SBram Moolenaarfunc Test_statusline_using_mode()
472ce0b7571SBram Moolenaar  CheckScreendump
473ce0b7571SBram Moolenaar
474ce0b7571SBram Moolenaar  let lines =<< trim END
475d8db8383SBram Moolenaar    setlocal statusline=-%{mode()}-
476d8db8383SBram Moolenaar    split
477d8db8383SBram Moolenaar    setlocal statusline=+%{mode()}+
478ce0b7571SBram Moolenaar  END
479ce0b7571SBram Moolenaar  call writefile(lines, 'XTest_statusline')
480ce0b7571SBram Moolenaar
481d8db8383SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 7, 'cols': 50})
482ce0b7571SBram Moolenaar  call VerifyScreenDump(buf, 'Test_statusline_mode_1', {})
483ce0b7571SBram Moolenaar
484ce0b7571SBram Moolenaar  call term_sendkeys(buf, ":")
485ce0b7571SBram Moolenaar  call VerifyScreenDump(buf, 'Test_statusline_mode_2', {})
486ce0b7571SBram Moolenaar
487ce0b7571SBram Moolenaar  " clean up
488d8db8383SBram Moolenaar  call term_sendkeys(buf, "close\<CR>")
489ce0b7571SBram Moolenaar  call StopVimInTerminal(buf)
490ce0b7571SBram Moolenaar  call delete('XTest_statusline')
491ce0b7571SBram Moolenaarendfunc
492ce0b7571SBram Moolenaar
493668008beSBram Moolenaarfunc Test_statusline_after_split_vsplit()
494668008beSBram Moolenaar  only
495668008beSBram Moolenaar
496668008beSBram Moolenaar  " Make the status line of each window show the window number.
497668008beSBram Moolenaar  set ls=2 stl=%{winnr()}
498668008beSBram Moolenaar
499668008beSBram Moolenaar  split | redraw
500668008beSBram Moolenaar  vsplit | redraw
501668008beSBram Moolenaar
502668008beSBram Moolenaar  " The status line of the third window should read '3' here.
503668008beSBram Moolenaar  call assert_equal('3', nr2char(screenchar(&lines - 1, 1)))
504668008beSBram Moolenaar
505668008beSBram Moolenaar  only
506668008beSBram Moolenaar  set ls& stl&
507668008beSBram Moolenaarendfunc
508668008beSBram Moolenaar
509008bff96SBram Moolenaar" Test using a multibyte character for 'stl' and 'stlnc' items in 'fillchars'
510008bff96SBram Moolenaar" with a custom 'statusline'
511008bff96SBram Moolenaarfunc Test_statusline_mbyte_fillchar()
512008bff96SBram Moolenaar  only
513008bff96SBram Moolenaar  set laststatus=2
514008bff96SBram Moolenaar  set fillchars=vert:\|,fold:-,stl:━,stlnc:═
515008bff96SBram Moolenaar  set statusline=a%=b
516008bff96SBram Moolenaar  call assert_match('^a\+━\+b$', s:get_statusline())
517008bff96SBram Moolenaar  vnew
518008bff96SBram Moolenaar  call assert_match('^a\+━\+b━a\+═\+b$', s:get_statusline())
519008bff96SBram Moolenaar  wincmd w
520008bff96SBram Moolenaar  call assert_match('^a\+═\+b═a\+━\+b$', s:get_statusline())
521008bff96SBram Moolenaar  set statusline& fillchars& laststatus&
522008bff96SBram Moolenaar  %bw!
523008bff96SBram Moolenaarendfunc
524668008beSBram Moolenaar
525*826bfe4bSBram Moolenaar" Used to write beyond allocated memory.  This assumes MAXPATHL is 4096 bytes.
526*826bfe4bSBram Moolenaarfunc Test_statusline_verylong_filename()
527*826bfe4bSBram Moolenaar  let fname = repeat('x', 4090)
528*826bfe4bSBram Moolenaar  exe "new " .. fname
529*826bfe4bSBram Moolenaar  set buftype=help
530*826bfe4bSBram Moolenaar  set previewwindow
531*826bfe4bSBram Moolenaar  redraw
532*826bfe4bSBram Moolenaar  bwipe!
533*826bfe4bSBram Moolenaarendfunc
534*826bfe4bSBram Moolenaar
535832adf9bSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
536