blob: b57c1ed2c56e97c0e73eab8fb99dd38695a84520 [file] [log] [blame]
Bram Moolenaardc9a0812017-02-23 18:46:50 +01001" Test for 'number' and 'relativenumber'
2
Bram Moolenaarefae76a2019-10-27 22:54:58 +01003source check.vim
Bram Moolenaardc9a0812017-02-23 18:46:50 +01004source view_util.vim
5
Bram Moolenaarefae76a2019-10-27 22:54:58 +01006source screendump.vim
7
Bram Moolenaar1e115362019-01-09 23:01:02 +01008func s:screen_lines(start, end) abort
Bram Moolenaardc9a0812017-02-23 18:46:50 +01009 return ScreenLines([a:start, a:end], 8)
10endfunc
11
Bram Moolenaar1e115362019-01-09 23:01:02 +010012func s:compare_lines(expect, actual)
Bram Moolenaardc9a0812017-02-23 18:46:50 +010013 call assert_equal(a:expect, a:actual)
14endfunc
15
Bram Moolenaar1e115362019-01-09 23:01:02 +010016func s:test_windows(h, w) abort
Bram Moolenaardc9a0812017-02-23 18:46:50 +010017 call NewWindow(a:h, a:w)
18endfunc
19
Bram Moolenaar1e115362019-01-09 23:01:02 +010020func s:close_windows() abort
Bram Moolenaardc9a0812017-02-23 18:46:50 +010021 call CloseWindow()
22endfunc
23
Bram Moolenaar1e115362019-01-09 23:01:02 +010024func s:validate_cursor() abort
Bram Moolenaardc9a0812017-02-23 18:46:50 +010025 " update skipcol.
26 " wincol():
27 " f_wincol
28 " -> validate_cursor
29 " -> curs_columns
30 call wincol()
31endfunc
32
33func Test_set_options()
34 set nu rnu
35 call assert_equal(1, &nu)
36 call assert_equal(1, &rnu)
37
38 call s:test_windows(10, 20)
39 call assert_equal(1, &nu)
40 call assert_equal(1, &rnu)
41 call s:close_windows()
42
43 set nu& rnu&
44endfunc
45
46func Test_set_global_and_local()
47 " setlocal must NOT reset the other global value
48 set nonu nornu
49 setglobal nu
50 setlocal rnu
51 call assert_equal(1, &g:nu)
52
53 set nonu nornu
54 setglobal rnu
55 setlocal nu
56 call assert_equal(1, &g:rnu)
57
58 " setglobal MUST reset the other global value
59 set nonu nornu
60 setglobal nu
61 setglobal rnu
62 call assert_equal(1, &g:nu)
63
64 set nonu nornu
65 setglobal rnu
66 setglobal nu
67 call assert_equal(1, &g:rnu)
68
69 " set MUST reset the other global value
70 set nonu nornu
71 set nu
72 set rnu
73 call assert_equal(1, &g:nu)
74
75 set nonu nornu
76 set rnu
77 set nu
78 call assert_equal(1, &g:rnu)
79
80 set nu& rnu&
81endfunc
82
83func Test_number()
84 call s:test_windows(10, 20)
85 call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
86 setl number
87 let lines = s:screen_lines(1, 4)
88 let expect = [
89\ " 1 abcd",
90\ " 2 klmn",
91\ " 3 uvwx",
92\ " 4 EFGH",
93\ ]
94 call s:compare_lines(expect, lines)
95 call s:close_windows()
96endfunc
97
98func Test_relativenumber()
99 call s:test_windows(10, 20)
100 call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
101 3
102 setl relativenumber
103 let lines = s:screen_lines(1, 6)
104 let expect = [
105\ " 2 abcd",
106\ " 1 klmn",
107\ " 0 uvwx",
108\ " 1 EFGH",
109\ " 2 OPQR",
110\ " 3 YZ ",
111\ ]
112 call s:compare_lines(expect, lines)
113 call s:close_windows()
114endfunc
115
116func Test_number_with_relativenumber()
117 call s:test_windows(10, 20)
118 call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
119 4
120 setl number relativenumber
121 let lines = s:screen_lines(1, 6)
122 let expect = [
123\ " 3 abcd",
124\ " 2 klmn",
125\ " 1 uvwx",
126\ "4 EFGH",
127\ " 1 OPQR",
128\ " 2 YZ ",
129\ ]
130 call s:compare_lines(expect, lines)
131 call s:close_windows()
132endfunc
133
134func Test_number_with_linewrap1()
135 call s:test_windows(3, 20)
136 normal! 61ia
137 setl number wrap
138 call s:validate_cursor()
139 let lines = s:screen_lines(1, 3)
140 let expect = [
Bram Moolenaar0466d392022-10-03 17:07:34 +0100141\ "<<< aaaa",
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100142\ " aaaa",
143\ " aaaa",
144\ ]
145 call s:compare_lines(expect, lines)
146 call s:close_windows()
147endfunc
148
zeertzjqae07ebc2024-02-08 11:37:40 +0100149func Test_number_with_linewrap2()
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100150 call s:test_windows(3, 20)
151 normal! 61ia
152 setl number wrap
153 call s:validate_cursor()
154 0
155 call s:validate_cursor()
156 let lines = s:screen_lines(1, 3)
157 let expect = [
158\ " 1 aaaa",
159\ " aaaa",
160\ " aaaa",
161\ ]
162 call s:compare_lines(expect, lines)
163 call s:close_windows()
164endfunc
165
zeertzjqae07ebc2024-02-08 11:37:40 +0100166func Test_number_with_linewrap3()
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100167 call s:test_windows(4, 20)
168 normal! 81ia
169 setl number wrap
170 call s:validate_cursor()
171 setl nonumber
172 call s:validate_cursor()
173 let lines = s:screen_lines(1, 4)
174 let expect = [
zeertzjqae07ebc2024-02-08 11:37:40 +0100175\ "<<<aaaaa",
Bram Moolenaardc9a0812017-02-23 18:46:50 +0100176\ "aaaaaaaa",
177\ "aaaaaaaa",
178\ "a ",
179\ ]
180 call s:compare_lines(expect, lines)
181 call s:close_windows()
182endfunc
183
184func Test_numberwidth()
185 call s:test_windows(10, 20)
186 call setline(1, repeat(['aaaa'], 10))
187 setl number numberwidth=6
188 let lines = s:screen_lines(1, 3)
189 let expect = [
190\ " 1 aa",
191\ " 2 aa",
192\ " 3 aa",
193\ ]
194 call s:compare_lines(expect, lines)
195
196 set relativenumber
197 let lines = s:screen_lines(1, 3)
198 let expect = [
199\ "1 aa",
200\ " 1 aa",
201\ " 2 aa",
202\ ]
203 call s:compare_lines(expect, lines)
204
205 set nonumber
206 let lines = s:screen_lines(1, 3)
207 let expect = [
208\ " 0 aa",
209\ " 1 aa",
210\ " 2 aa",
211\ ]
212 call s:compare_lines(expect, lines)
213 call s:close_windows()
214endfunc
215
216func Test_numberwidth_adjusted()
217 call s:test_windows(10, 20)
218 call setline(1, repeat(['aaaa'], 10000))
219 setl number numberwidth=4
220 let lines = s:screen_lines(1, 3)
221 let expect = [
222\ " 1 aa",
223\ " 2 aa",
224\ " 3 aa",
225\ ]
226 call s:compare_lines(expect, lines)
227
228 $
229 let lines = s:screen_lines(8, 10)
230 let expect = [
231\ " 9998 aa",
232\ " 9999 aa",
233\ "10000 aa",
234\ ]
235 call s:compare_lines(expect, lines)
236
237 setl relativenumber
238 let lines = s:screen_lines(8, 10)
239 let expect = [
240\ " 2 aa",
241\ " 1 aa",
242\ "10000 aa",
243\ ]
244 call s:compare_lines(expect, lines)
245
246 setl nonumber
247 let lines = s:screen_lines(8, 10)
248 let expect = [
249\ " 2 aaaa",
250\ " 1 aaaa",
251\ " 0 aaaa",
252\ ]
253 call s:compare_lines(expect, lines)
254 call s:close_windows()
255endfunc
Bram Moolenaarec572ad2019-07-07 14:26:59 +0200256
257" This was causing a memcheck error
258func Test_relativenumber_uninitialised()
259 new
260 set rnu
261 call setline(1, ["a", "b"])
262 redraw
263 call feedkeys("j", 'xt')
264 redraw
265 bwipe!
266endfunc
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100267
268func Test_relativenumber_colors()
269 CheckScreendump
270
271 let lines =<< trim [CODE]
272 call setline(1, range(200))
273 111
274 set number relativenumber
275 hi LineNr ctermfg=red
276 [CODE]
Bram Moolenaarb152b6a2022-09-29 21:37:33 +0100277 call writefile(lines, 'XTest_relnr', 'D')
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100278
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100279 let buf = RunVimInTerminal('-S XTest_relnr', {'rows': 10, 'cols': 50})
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100280 " Default colors
281 call VerifyScreenDump(buf, 'Test_relnr_colors_1', {})
282
Bram Moolenaar8040a712020-02-23 13:38:08 +0100283 call term_sendkeys(buf, ":hi LineNrAbove ctermfg=blue\<CR>:\<CR>")
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100284 call VerifyScreenDump(buf, 'Test_relnr_colors_2', {})
285
Bram Moolenaar8040a712020-02-23 13:38:08 +0100286 call term_sendkeys(buf, ":hi LineNrBelow ctermfg=green\<CR>:\<CR>")
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100287 call VerifyScreenDump(buf, 'Test_relnr_colors_3', {})
288
289 call term_sendkeys(buf, ":hi clear LineNrAbove\<CR>")
290 call VerifyScreenDump(buf, 'Test_relnr_colors_4', {})
291
292 " clean up
293 call StopVimInTerminal(buf)
Bram Moolenaarefae76a2019-10-27 22:54:58 +0100294endfunc
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200295
zeertzjqebfd8562024-02-06 10:59:03 +0100296func Test_relativenumber_colors_wrapped()
297 CheckScreendump
298
299 let lines =<< trim [CODE]
300 set display=lastline scrolloff=0
301 call setline(1, range(200)->map('v:val->string()->repeat(40)'))
302 111
303 set number relativenumber
304 hi LineNr ctermbg=red ctermfg=black
305 hi LineNrAbove ctermbg=blue ctermfg=black
306 hi LineNrBelow ctermbg=green ctermfg=black
307 [CODE]
308 call writefile(lines, 'XTest_relnr_wrap', 'D')
309
310 let buf = RunVimInTerminal('-S XTest_relnr_wrap', {'rows': 20, 'cols': 50})
311
312 call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_1', {})
313 call term_sendkeys(buf, "k")
314 call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_2', {})
315 call term_sendkeys(buf, "2j")
316 call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_3', {})
317 call term_sendkeys(buf, "2j")
318 call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_4', {})
319 call term_sendkeys(buf, "k")
320 call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_5', {})
321
322 " clean up
323 call StopVimInTerminal(buf)
324endfunc
325
zeertzjq3e559cd2022-03-27 19:26:55 +0100326func Test_relativenumber_callback()
327 CheckScreendump
328 CheckFeature timers
329
330 let lines =<< trim END
331 call setline(1, ['aaaaa', 'bbbbb', 'ccccc', 'ddddd'])
332 set relativenumber
333 call cursor(4, 1)
334
335 func Func(timer)
336 call cursor(1, 1)
337 endfunc
338
339 call timer_start(300, 'Func')
340 END
Bram Moolenaarb152b6a2022-09-29 21:37:33 +0100341 call writefile(lines, 'Xrnu_timer', 'D')
zeertzjq3e559cd2022-03-27 19:26:55 +0100342
343 let buf = RunVimInTerminal('-S Xrnu_timer', #{rows: 8})
344 call TermWait(buf, 310)
345 call VerifyScreenDump(buf, 'Test_relativenumber_callback_1', {})
346
347 call StopVimInTerminal(buf)
zeertzjq3e559cd2022-03-27 19:26:55 +0100348endfunc
349
zeertzjqae07ebc2024-02-08 11:37:40 +0100350" Test that line numbers below inserted/deleted lines are updated.
351func Test_number_insert_delete_lines()
352 CheckScreendump
353
354 let lines =<< trim END
355 call setline(1, range(1, 7))
356 set number
357 call cursor(2, 1)
358 END
359 call writefile(lines, 'Xnumber_insert_delete_lines', 'D')
360
361 let buf = RunVimInTerminal('-S Xnumber_insert_delete_lines', #{rows: 8})
362 call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
363 call term_sendkeys(buf, "dd")
364 call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_2', {})
365 call term_sendkeys(buf, "P")
366 call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
367 call term_sendkeys(buf, "2dd")
368 call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_3', {})
369 call term_sendkeys(buf, "P")
370 call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
371
372 call StopVimInTerminal(buf)
373endfunc
374
Christian Brabandt29f0dc32021-06-16 19:28:34 +0200375" Test for displaying line numbers with 'rightleft'
376func Test_number_rightleft()
377 CheckFeature rightleft
378 new
379 setlocal number
380 setlocal rightleft
381 call setline(1, range(1, 1000))
382 normal! 9Gzt
383 redraw!
384 call assert_match('^\s\+9 9$', Screenline(1))
385 normal! 10Gzt
386 redraw!
387 call assert_match('^\s\+01 10$', Screenline(1))
388 normal! 100Gzt
389 redraw!
390 call assert_match('^\s\+001 100$', Screenline(1))
391 normal! 1000Gzt
392 redraw!
393 call assert_match('^\s\+0001 1000$', Screenline(1))
394 bw!
395endfunc
396
Bram Moolenaar02f86942021-08-17 22:14:29 +0200397" This used to cause a divide by zero
398func Test_number_no_text_virtual_edit()
399 vnew
400 call setline(1, ['line one', 'line two'])
401 set number virtualedit=all
402 normal w
403 4wincmd |
404 normal j
405 bwipe!
406endfunc
407
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200408" vim: shiftwidth=2 sts=2 expandtab