view src/testdir/test_number.vim @ 34336:d2ad8733db75 v9.1.0101

patch 9.1.0101: upper-case of German sharp s should be U+1E9E Commit: https://github.com/vim/vim/commit/bd1232a1faf56b614a1e74c4ce51bc6e0650ae00 Author: glepnir <glephunter@gmail.com> Date: Mon Feb 12 22:14:53 2024 +0100 patch 9.1.0101: upper-case of German sharp s should be U+1E9E Problem: upper-case of ? should be U+1E9E (CAPITAL LETTER SHARP S) (fenuks) Solution: Make gU, ~ and g~ convert the U+00DF LATIN SMALL LETTER SHARP S (?) to U+1E9E LATIN CAPITAL LETTER SHARP S (?), update tests (glepnir) This is part of Unicode 5.1.0 from April 2008, so should be fairly safe to use now and since 2017 is part of the German standard orthography, according to Wikipedia: https://en.wikipedia.org/wiki/Capital_%E1%BA%9E#cite_note-auto-12 There is however one exception: UnicodeData.txt for U+00DF LATIN SMALL LETTER SHARP S does NOT define U+1E9E LATIN CAPITAL LETTER SHARP S as its upper case version. Therefore, toupper() won't be able to convert from lower sharp s to upper case sharp s (the other way around however works, since U+00DF is considered the lower case character of U+1E9E and therefore tolower() works correctly for the upper case version). fixes: #5573 closes: #14018 Signed-off-by: glepnir <glephunter@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Mon, 12 Feb 2024 22:45:02 +0100
parents 0690fd6f9d48
children
line wrap: on
line source

" Test for 'number' and 'relativenumber'

source check.vim
source view_util.vim

source screendump.vim

func s:screen_lines(start, end) abort
  return ScreenLines([a:start, a:end], 8)
endfunc

func s:compare_lines(expect, actual)
  call assert_equal(a:expect, a:actual)
endfunc

func s:test_windows(h, w) abort
  call NewWindow(a:h, a:w)
endfunc

func s:close_windows() abort
  call CloseWindow()
endfunc

func s:validate_cursor() abort
  " update skipcol.
  " wincol():
  "   f_wincol
  "     -> validate_cursor
  "          -> curs_columns
  call wincol()
endfunc

func Test_set_options()
  set nu rnu
  call assert_equal(1, &nu)
  call assert_equal(1, &rnu)

  call s:test_windows(10, 20)
  call assert_equal(1, &nu)
  call assert_equal(1, &rnu)
  call s:close_windows()

  set nu& rnu&
endfunc

func Test_set_global_and_local()
  " setlocal must NOT reset the other global value
  set nonu nornu
  setglobal nu
  setlocal rnu
  call assert_equal(1, &g:nu)

  set nonu nornu
  setglobal rnu
  setlocal nu
  call assert_equal(1, &g:rnu)

  " setglobal MUST reset the other global value
  set nonu nornu
  setglobal nu
  setglobal rnu
  call assert_equal(1, &g:nu)

  set nonu nornu
  setglobal rnu
  setglobal nu
  call assert_equal(1, &g:rnu)

  " set MUST reset the other global value
  set nonu nornu
  set nu
  set rnu
  call assert_equal(1, &g:nu)

  set nonu nornu
  set rnu
  set nu
  call assert_equal(1, &g:rnu)

  set nu& rnu&
endfunc

func Test_number()
  call s:test_windows(10, 20)
  call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
  setl number
  let lines = s:screen_lines(1, 4)
  let expect = [
\ "  1 abcd",
\ "  2 klmn",
\ "  3 uvwx",
\ "  4 EFGH",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_relativenumber()
  call s:test_windows(10, 20)
  call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
  3
  setl relativenumber
  let lines = s:screen_lines(1, 6)
  let expect = [
\ "  2 abcd",
\ "  1 klmn",
\ "  0 uvwx",
\ "  1 EFGH",
\ "  2 OPQR",
\ "  3 YZ  ",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_number_with_relativenumber()
  call s:test_windows(10, 20)
  call setline(1, ["abcdefghij", "klmnopqrst", "uvwxyzABCD", "EFGHIJKLMN", "OPQRSTUVWX", "YZ"])
  4
  setl number relativenumber
  let lines = s:screen_lines(1, 6)
  let expect = [
\ "  3 abcd",
\ "  2 klmn",
\ "  1 uvwx",
\ "4   EFGH",
\ "  1 OPQR",
\ "  2 YZ  ",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_number_with_linewrap1()
  call s:test_windows(3, 20)
  normal! 61ia
  setl number wrap
  call s:validate_cursor()
  let lines = s:screen_lines(1, 3)
  let expect = [
\ "<<< aaaa",
\ "    aaaa",
\ "    aaaa",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_number_with_linewrap2()
  call s:test_windows(3, 20)
  normal! 61ia
  setl number wrap
  call s:validate_cursor()
  0
  call s:validate_cursor()
  let lines = s:screen_lines(1, 3)
  let expect = [
\ "  1 aaaa",
\ "    aaaa",
\ "    aaaa",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_number_with_linewrap3()
  call s:test_windows(4, 20)
  normal! 81ia
  setl number wrap
  call s:validate_cursor()
  setl nonumber
  call s:validate_cursor()
  let lines = s:screen_lines(1, 4)
  let expect = [
\ "<<<aaaaa",
\ "aaaaaaaa",
\ "aaaaaaaa",
\ "a       ",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_numberwidth()
  call s:test_windows(10, 20)
  call setline(1, repeat(['aaaa'], 10))
  setl number numberwidth=6
  let lines = s:screen_lines(1, 3)
  let expect = [
\ "    1 aa",
\ "    2 aa",
\ "    3 aa",
\ ]
  call s:compare_lines(expect, lines)

  set relativenumber
  let lines = s:screen_lines(1, 3)
  let expect = [
\ "1     aa",
\ "    1 aa",
\ "    2 aa",
\ ]
  call s:compare_lines(expect, lines)

  set nonumber
  let lines = s:screen_lines(1, 3)
  let expect = [
\ "    0 aa",
\ "    1 aa",
\ "    2 aa",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

func Test_numberwidth_adjusted()
  call s:test_windows(10, 20)
  call setline(1, repeat(['aaaa'], 10000))
  setl number numberwidth=4
  let lines = s:screen_lines(1, 3)
  let expect = [
\ "    1 aa",
\ "    2 aa",
\ "    3 aa",
\ ]
  call s:compare_lines(expect, lines)

  $
  let lines = s:screen_lines(8, 10)
  let expect = [
\ " 9998 aa",
\ " 9999 aa",
\ "10000 aa",
\ ]
  call s:compare_lines(expect, lines)

  setl relativenumber
  let lines = s:screen_lines(8, 10)
  let expect = [
\ "    2 aa",
\ "    1 aa",
\ "10000 aa",
\ ]
  call s:compare_lines(expect, lines)

  setl nonumber
  let lines = s:screen_lines(8, 10)
  let expect = [
\ "  2 aaaa",
\ "  1 aaaa",
\ "  0 aaaa",
\ ]
  call s:compare_lines(expect, lines)
  call s:close_windows()
endfunc

" This was causing a memcheck error
func Test_relativenumber_uninitialised()
  new
  set rnu
  call setline(1, ["a", "b"])
  redraw
  call feedkeys("j", 'xt')
  redraw
  bwipe!
endfunc

func Test_relativenumber_colors()
  CheckScreendump

  let lines =<< trim [CODE]
    call setline(1, range(200))
    111
    set number relativenumber
    hi LineNr ctermfg=red
  [CODE]
  call writefile(lines, 'XTest_relnr', 'D')

  let buf = RunVimInTerminal('-S XTest_relnr', {'rows': 10, 'cols': 50})
  " Default colors
  call VerifyScreenDump(buf, 'Test_relnr_colors_1', {})

  call term_sendkeys(buf, ":hi LineNrAbove ctermfg=blue\<CR>:\<CR>")
  call VerifyScreenDump(buf, 'Test_relnr_colors_2', {})

  call term_sendkeys(buf, ":hi LineNrBelow ctermfg=green\<CR>:\<CR>")
  call VerifyScreenDump(buf, 'Test_relnr_colors_3', {})

  call term_sendkeys(buf, ":hi clear LineNrAbove\<CR>")
  call VerifyScreenDump(buf, 'Test_relnr_colors_4', {})

  " clean up
  call StopVimInTerminal(buf)
endfunc

func Test_relativenumber_colors_wrapped()
  CheckScreendump

  let lines =<< trim [CODE]
    set display=lastline scrolloff=0
    call setline(1, range(200)->map('v:val->string()->repeat(40)'))
    111
    set number relativenumber
    hi LineNr ctermbg=red ctermfg=black
    hi LineNrAbove ctermbg=blue ctermfg=black
    hi LineNrBelow ctermbg=green ctermfg=black
  [CODE]
  call writefile(lines, 'XTest_relnr_wrap', 'D')

  let buf = RunVimInTerminal('-S XTest_relnr_wrap', {'rows': 20, 'cols': 50})

  call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_1', {})
  call term_sendkeys(buf, "k")
  call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_2', {})
  call term_sendkeys(buf, "2j")
  call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_3', {})
  call term_sendkeys(buf, "2j")
  call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_4', {})
  call term_sendkeys(buf, "k")
  call VerifyScreenDump(buf, 'Test_relnr_colors_wrapped_5', {})

  " clean up
  call StopVimInTerminal(buf)
endfunc

func Test_relativenumber_callback()
  CheckScreendump
  CheckFeature timers

  let lines =<< trim END
      call setline(1, ['aaaaa', 'bbbbb', 'ccccc', 'ddddd'])
      set relativenumber
      call cursor(4, 1)

      func Func(timer)
        call cursor(1, 1)
      endfunc

      call timer_start(300, 'Func')
  END
  call writefile(lines, 'Xrnu_timer', 'D')

  let buf = RunVimInTerminal('-S Xrnu_timer', #{rows: 8})
  call TermWait(buf, 310)
  call VerifyScreenDump(buf, 'Test_relativenumber_callback_1', {})

  call StopVimInTerminal(buf)
endfunc

" Test that line numbers below inserted/deleted lines are updated.
func Test_number_insert_delete_lines()
  CheckScreendump

  let lines =<< trim END
      call setline(1, range(1, 7))
      set number
      call cursor(2, 1)
  END
  call writefile(lines, 'Xnumber_insert_delete_lines', 'D')

  let buf = RunVimInTerminal('-S Xnumber_insert_delete_lines', #{rows: 8})
  call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
  call term_sendkeys(buf, "dd")
  call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_2', {})
  call term_sendkeys(buf, "P")
  call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})
  call term_sendkeys(buf, "2dd")
  call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_3', {})
  call term_sendkeys(buf, "P")
  call VerifyScreenDump(buf, 'Test_number_insert_delete_lines_1', {})

  call StopVimInTerminal(buf)
endfunc

" Test for displaying line numbers with 'rightleft'
func Test_number_rightleft()
  CheckFeature rightleft
  new
  setlocal number
  setlocal rightleft
  call setline(1, range(1, 1000))
  normal! 9Gzt
  redraw!
  call assert_match('^\s\+9 9$', Screenline(1))
  normal! 10Gzt
  redraw!
  call assert_match('^\s\+01 10$', Screenline(1))
  normal! 100Gzt
  redraw!
  call assert_match('^\s\+001 100$', Screenline(1))
  normal! 1000Gzt
  redraw!
  call assert_match('^\s\+0001 1000$', Screenline(1))
  bw!
endfunc

" This used to cause a divide by zero
func Test_number_no_text_virtual_edit()
  vnew
  call setline(1, ['line one', 'line two'])
  set number virtualedit=all
  normal w
  4wincmd |
  normal j
  bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab