neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_number.vim (9104B)


      1 " Test for 'number' and 'relativenumber'
      2 
      3 source check.vim
      4 source view_util.vim
      5 
      6 source screendump.vim
      7 
      8 func s:screen_lines(start, end) abort
      9  return ScreenLines([a:start, a:end], 8)
     10 endfunc
     11 
     12 func s:compare_lines(expect, actual)
     13  call assert_equal(a:expect, a:actual)
     14 endfunc
     15 
     16 func s:test_windows(h, w) abort
     17  call NewWindow(a:h, a:w)
     18 endfunc
     19 
     20 func s:close_windows() abort
     21  call CloseWindow()
     22 endfunc
     23 
     24 func s:validate_cursor() abort
     25  " update skipcol.
     26  " wincol():
     27  "   f_wincol
     28  "     -> validate_cursor
     29  "          -> curs_columns
     30  call wincol()
     31 endfunc
     32 
     33 func 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&
     44 endfunc
     45 
     46 func 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&
     81 endfunc
     82 
     83 func 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()
     96 endfunc
     97 
     98 func 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()
    114 endfunc
    115 
    116 func 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()
    132 endfunc
    133 
    134 func 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 = [
    141 \ "<<< aaaa",
    142 \ "    aaaa",
    143 \ "    aaaa",
    144 \ ]
    145  call s:compare_lines(expect, lines)
    146  call s:close_windows()
    147 endfunc
    148 
    149 func Test_number_with_linewrap2()
    150  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()
    164 endfunc
    165 
    166 func Test_number_with_linewrap3()
    167  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 = [
    175 \ "<<<aaaaa",
    176 \ "aaaaaaaa",
    177 \ "aaaaaaaa",
    178 \ "a       ",
    179 \ ]
    180  call s:compare_lines(expect, lines)
    181  call s:close_windows()
    182 endfunc
    183 
    184 func 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()
    214 endfunc
    215 
    216 func 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()
    255 endfunc
    256 
    257 " This was causing a memcheck error
    258 func 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!
    266 endfunc
    267 
    268 func 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]
    277  call writefile(lines, 'XTest_relnr', 'D')
    278 
    279  let buf = RunVimInTerminal('-S XTest_relnr', {'rows': 10, 'cols': 50})
    280  " Default colors
    281  call VerifyScreenDump(buf, 'Test_relnr_colors_1', {})
    282 
    283  call term_sendkeys(buf, ":hi LineNrAbove ctermfg=blue\<CR>:\<CR>")
    284  call VerifyScreenDump(buf, 'Test_relnr_colors_2', {})
    285 
    286  call term_sendkeys(buf, ":hi LineNrBelow ctermfg=green\<CR>:\<CR>")
    287  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)
    294 endfunc
    295 
    296 func 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)
    324 endfunc
    325 
    326 func 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
    341  call writefile(lines, 'Xrnu_timer', 'D')
    342 
    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)
    348 endfunc
    349 
    350 " Test that line numbers below inserted/deleted lines are updated.
    351 func 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)
    373 endfunc
    374 
    375 " Test for displaying line numbers with 'rightleft'
    376 func 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!
    395 endfunc
    396 
    397 " This used to cause a divide by zero
    398 func 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!
    406 endfunc
    407 
    408 " vim: shiftwidth=2 sts=2 expandtab