1" Test 'statusline'
2"
3" Not tested yet:
4"   %a
5"   %N
6"   %T
7"   %X
8"   %*
9
10source view_util.vim
11
12func s:get_statusline()
13  return ScreenLines(&lines - 1, &columns)[0]
14endfunc
15
16func StatuslineWithCaughtError()
17  let s:func_in_statusline_called = 1
18  try
19    call eval('unknown expression')
20  catch
21  endtry
22  return ''
23endfunc
24
25func StatuslineWithError()
26  let s:func_in_statusline_called = 1
27  call eval('unknown expression')
28  return ''
29endfunc
30
31" Function used to display syntax group.
32func SyntaxItem()
33  return synIDattr(synID(line("."),col("."),1),"name")
34endfunc
35
36func Test_caught_error_in_statusline()
37  let s:func_in_statusline_called = 0
38  set laststatus=2
39  let statusline = '%{StatuslineWithCaughtError()}'
40  let &statusline = statusline
41  redrawstatus
42  call assert_true(s:func_in_statusline_called)
43  call assert_equal(statusline, &statusline)
44  set statusline=
45endfunc
46
47func Test_statusline_will_be_disabled_with_error()
48  let s:func_in_statusline_called = 0
49  set laststatus=2
50  let statusline = '%{StatuslineWithError()}'
51  try
52    let &statusline = statusline
53    redrawstatus
54  catch
55  endtry
56  call assert_true(s:func_in_statusline_called)
57  call assert_equal('', &statusline)
58  set statusline=
59endfunc
60
61func Test_statusline()
62  new Xstatusline
63  only
64  set laststatus=2
65  set splitbelow
66  call setline(1, range(1, 200))
67
68  " %b: Value of character under cursor.
69  " %B: As above, in hexadecimal.
70  call cursor(180, 2)
71  set statusline=%b,%B
72  call assert_match('^56,38\s*$', s:get_statusline())
73
74  " %o: Byte number in file of byte under cursor, first byte is 1.
75  " %O: As above, in hexadecimal.
76  set statusline=%o,%O
77  set fileformat=dos
78  call assert_match('^789,315\s*$', s:get_statusline())
79  set fileformat=mac
80  call assert_match('^610,262\s*$', s:get_statusline())
81  set fileformat=unix
82  call assert_match('^610,262\s*$', s:get_statusline())
83  set fileformat&
84
85  " %f: Path to the file in the buffer, as typed or relative to current dir.
86  set statusline=%f
87  call assert_match('^Xstatusline\s*$', s:get_statusline())
88
89  " %F: Full path to the file in the buffer.
90  set statusline=%F
91  call assert_match('/testdir/Xstatusline\s*$', s:get_statusline())
92
93  " %h: Help buffer flag, text is "[help]".
94  " %H: Help buffer flag, text is ",HLP".
95  set statusline=%h,%H
96  call assert_match('^,\s*$', s:get_statusline())
97  help
98  call assert_match('^\[Help\],HLP\s*$', s:get_statusline())
99  helpclose
100
101  " %k: Value of "b:keymap_name" or 'keymap'
102  "     when :lmap mappings are being used: <keymap>"
103  set statusline=%k
104  if has('keymap')
105    set keymap=esperanto
106    call assert_match('^<Eo>\s*$', s:get_statusline())
107    set keymap&
108  else
109    call assert_match('^\s*$', s:get_statusline())
110  endif
111
112  " %l: Line number.
113  " %L: Number of line in buffer.
114  " %c: Column number.
115  set statusline=%l/%L,%c
116  call assert_match('^180/200,2\s*$', s:get_statusline())
117
118  " %m: Modified flag, text is "[+]", "[-]" if 'modifiable' is off.
119  " %M: Modified flag, text is ",+" or ",-".
120  set statusline=%m%M
121  call assert_match('^\[+\],+\s*$', s:get_statusline())
122  set nomodifiable
123  call assert_match('^\[+-\],+-\s*$', s:get_statusline())
124  write
125  call assert_match('^\[-\],-\s*$', s:get_statusline())
126  set modifiable&
127  call assert_match('^\s*$', s:get_statusline())
128
129  " %n: Buffer number.
130  set statusline=%n
131  call assert_match('^'.bufnr('%').'\s*$', s:get_statusline())
132
133  " %p: Percentage through file in lines as in CTRL-G.
134  " %P: Percentage through file of displayed window.
135  set statusline=%p,%P
136  0
137  call assert_match('^0,Top\s*$', s:get_statusline())
138  norm G
139  call assert_match('^100,Bot\s*$', s:get_statusline())
140  180
141  " Don't check the exact percentage as it depends on the window size
142  call assert_match('^90,\(Top\|Bot\|\d\+%\)\s*$', s:get_statusline())
143
144  " %q: "[Quickfix List]", "[Location List]" or empty.
145  set statusline=%q
146  call assert_match('^\s*$', s:get_statusline())
147  copen
148  call assert_match('^\[Quickfix List\]\s*$', s:get_statusline())
149  cclose
150  lexpr getline(1, 2)
151  lopen
152  call assert_match('^\[Location List\]\s*$', s:get_statusline())
153  lclose
154
155  " %r: Readonly flag, text is "[RO]".
156  " %R: Readonly flag, text is ",RO".
157  set statusline=%r,%R
158  call assert_match('^,\s*$', s:get_statusline())
159  help
160  call assert_match('^\[RO\],RO\s*$', s:get_statusline())
161  helpclose
162
163  " %t: File name (tail) of file in the buffer.
164  set statusline=%t
165  call assert_match('^Xstatusline\s*$', s:get_statusline())
166
167  " %v: Virtual column number.
168  " %V: Virtual column number as -{num}. Not displayed if equal to 'c'.
169  call cursor(180, 2)
170  set statusline=%v,%V
171  call assert_match('^2,\s*$', s:get_statusline())
172  set virtualedit=all
173  norm 10|
174  call assert_match('^10,-10\s*$', s:get_statusline())
175  set virtualedit&
176
177  " %w: Preview window flag, text is "[Preview]".
178  " %W: Preview window flag, text is ",PRV".
179  set statusline=%w%W
180  call assert_match('^\s*$', s:get_statusline())
181  pedit
182  wincmd j
183  call assert_match('^\[Preview\],PRV\s*$', s:get_statusline())
184  pclose
185
186  " %y: Type of file in the buffer, e.g., "[vim]". See 'filetype'.
187  " %Y: Type of file in the buffer, e.g., ",VIM". See 'filetype'.
188  set statusline=%y\ %Y
189  call assert_match('^\s*$', s:get_statusline())
190  setfiletype vim
191  call assert_match('^\[vim\] VIM\s*$', s:get_statusline())
192
193  " %=: Separation point between left and right aligned items.
194  set statusline=foo%=bar
195  call assert_match('^foo\s\+bar\s*$', s:get_statusline())
196
197  " Test min/max width, leading zeroes, left/right justify.
198  set statusline=%04B
199  call cursor(180, 2)
200  call assert_match('^0038\s*$', s:get_statusline())
201  set statusline=#%4B#
202  call assert_match('^#  38#\s*$', s:get_statusline())
203  set statusline=#%-4B#
204  call assert_match('^#38  #\s*$', s:get_statusline())
205  set statusline=%.6f
206  call assert_match('^<sline\s*$', s:get_statusline())
207
208  " %<: Where to truncate.
209  exe 'set statusline=a%<b' . repeat('c', 1000) . 'd'
210  call assert_match('^a<c*d$', s:get_statusline())
211  exe 'set statusline=a' . repeat('b', 1000) . '%<c'
212  call assert_match('^ab*>$', s:get_statusline())
213
214  "%{: Evaluate expression between '%{' and '}' and substitute result.
215  syntax on
216  set statusline=%{SyntaxItem()}
217  call assert_match('^vimNumber\s*$', s:get_statusline())
218  s/^/"/
219  call assert_match('^vimLineComment\s*$', s:get_statusline())
220  syntax off
221
222  "%(: Start of item group.
223  set statusline=ab%(cd%q%)de
224  call assert_match('^abde\s*$', s:get_statusline())
225  copen
226  call assert_match('^abcd\[Quickfix List]de\s*$', s:get_statusline())
227  cclose
228
229  " %#: Set highlight group. The name must follow and then a # again.
230  set statusline=ab%#Todo#cd%#Error#ef
231  call assert_match('^abcdef\s*$', s:get_statusline())
232  let sa1=screenattr(&lines - 1, 1)
233  let sa2=screenattr(&lines - 1, 3)
234  let sa3=screenattr(&lines - 1, 5)
235  call assert_notequal(sa1, sa2)
236  call assert_notequal(sa1, sa3)
237  call assert_notequal(sa2, sa3)
238  call assert_equal(sa1, screenattr(&lines - 1, 2))
239  call assert_equal(sa2, screenattr(&lines - 1, 4))
240  call assert_equal(sa3, screenattr(&lines - 1, 6))
241  call assert_equal(sa3, screenattr(&lines - 1, 7))
242
243  " %*: Set highlight group to User{N}
244  set statusline=a%1*b%0*c
245  call assert_match('^abc\s*$', s:get_statusline())
246  let sa1=screenattr(&lines - 1, 1)
247  let sa2=screenattr(&lines - 1, 2)
248  let sa3=screenattr(&lines - 1, 3)
249  call assert_equal(sa1, sa3)
250  call assert_notequal(sa1, sa2)
251
252  " %%: a percent sign.
253  set statusline=10%%
254  call assert_match('^10%\s*$', s:get_statusline())
255
256  " %!: evaluated expression is used as the option value
257  set statusline=%!2*3+1
258  call assert_match('7\s*$', s:get_statusline())
259
260  " Check statusline in current and non-current window
261  " with the 'fillchars' option.
262  set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
263  vsplit
264  set statusline=x%=y
265  call assert_match('^x^\+y^x=\+y$', s:get_statusline())
266  set fillchars&
267  close
268
269  %bw!
270  call delete('Xstatusline')
271  set statusline&
272  set laststatus&
273  set splitbelow&
274endfunc
275