neovim

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

test_utf8_comparisons.vim (3848B)


      1 " Tests for case-insensitive UTF-8 comparisons (utf_strnicmp() in mbyte.c)
      2 " Also test "g~ap".
      3 
      4 func Ch(a, op, b, expected)
      5  call assert_equal(eval(printf('"%s" %s "%s"', a:a, a:op, a:b)), a:expected,
      6        \ printf('"%s" %s "%s" should return %d', a:a, a:op, a:b, a:expected))
      7 endfunc
      8 
      9 func Chk(a, b, result)
     10  if a:result == 0
     11    call Ch(a:a, '==?', a:b, 1)
     12    call Ch(a:a, '!=?', a:b, 0)
     13    call Ch(a:a, '<=?', a:b, 1)
     14    call Ch(a:a, '>=?', a:b, 1)
     15    call Ch(a:a, '<?', a:b, 0)
     16    call Ch(a:a, '>?', a:b, 0)
     17  elseif a:result > 0
     18    call Ch(a:a, '==?', a:b, 0)
     19    call Ch(a:a, '!=?', a:b, 1)
     20    call Ch(a:a, '<=?', a:b, 0)
     21    call Ch(a:a, '>=?', a:b, 1)
     22    call Ch(a:a, '<?', a:b, 0)
     23    call Ch(a:a, '>?', a:b, 1)
     24  else
     25    call Ch(a:a, '==?', a:b, 0)
     26    call Ch(a:a, '!=?', a:b, 1)
     27    call Ch(a:a, '<=?', a:b, 1)
     28    call Ch(a:a, '>=?', a:b, 0)
     29    call Ch(a:a, '<?', a:b, 1)
     30    call Ch(a:a, '>?', a:b, 0)
     31  endif
     32 endfunc
     33 
     34 func Check(a, b, result)
     35  call Chk(a:a, a:b, a:result)
     36  call Chk(a:b, a:a, -a:result)
     37 endfunc
     38 
     39 func LT(a, b)
     40  call Check(a:a, a:b, -1)
     41 endfunc
     42 
     43 func GT(a, b)
     44  call Check(a:a, a:b, 1)
     45 endfunc
     46 
     47 func EQ(a, b)
     48  call Check(a:a, a:b, 0)
     49 endfunc
     50 
     51 func Test_comparisons()
     52  call EQ('', '')
     53  call LT('', 'a')
     54  call EQ('abc', 'abc')
     55  call EQ('Abc', 'abC')
     56  call LT('ab', 'abc')
     57  call LT('AB', 'abc')
     58  call LT('ab', 'aBc')
     59  call EQ('\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd', '\xd0\xb9\xd0\xa6\xd0\xa3\xd0\xba\xd0\x95\xd0\xbd')
     60  call LT('\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd', '\xd0\xaf\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd')
     61  call EQ('\xe2\x84\xaa', 'k')
     62  call LT('\xe2\x84\xaa', 'kkkkkk')
     63  call EQ('\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa', 'kkk')
     64  call LT('kk', '\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa')
     65  call EQ('\xe2\x84\xaa\xe2\x84\xa6k\xe2\x84\xaak\xcf\x89', 'k\xcf\x89\xe2\x84\xaakk\xe2\x84\xa6')
     66  call EQ('Abc\x80', 'AbC\x80')
     67  call LT('Abc\x80', 'AbC\x81')
     68  call LT('Abc', 'AbC\x80')
     69  call LT('abc\x80DEF', 'abc\x80def')  " case folding stops at the first bad character
     70  call LT('\xc3XYZ', '\xc3xyz')
     71  call EQ('\xef\xbc\xba', '\xef\xbd\x9a')  " FF3A (upper), FF5A (lower)
     72  call GT('\xef\xbc\xba', '\xef\xbc\xff')  " first string is ok and equals \xef\xbd\x9a after folding, second string is illegal and was left unchanged, then the strings were bytewise compared
     73  call LT('\xc3', '\xc3\x83')
     74  call EQ('\xc3\xa3xYz', '\xc3\x83XyZ')
     75  for n in range(0x60, 0xFF)
     76    call LT(printf('xYz\x%.2X', n-1), printf('XyZ\x%.2X', n))
     77  endfor
     78  for n in range(0x80, 0xBF)
     79    call EQ(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
     80  endfor
     81  for n in range(0xC0, 0xFF)
     82    call LT(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
     83  endfor
     84 endfunc
     85 
     86 " test that g~ap changes one paragraph only.
     87 func Test_gap()
     88  new
     89  " setup text
     90  call feedkeys("iabcd\<cr>\<cr>defg", "tx")
     91  " modify only first line
     92  call feedkeys("gg0g~ap", "tx")
     93  call assert_equal(["ABCD", "", "defg"], getline(1,3))
     94 endfunc
     95 
     96 " test that g~, ~ and gU correctly upper-cases ß
     97 func Test_uppercase_sharp_ss()
     98  new
     99  call setline(1, repeat(['ß'], 4))
    100 
    101  call cursor(1, 1)
    102  norm! ~
    103  call assert_equal('ẞ', getline(line('.')))
    104  norm! ~
    105  call assert_equal('ß', getline(line('.')))
    106 
    107  call cursor(2, 1)
    108  norm! g~l
    109  call assert_equal('ẞ', getline(line('.')))
    110  norm! g~l
    111  call assert_equal('ß', getline(line('.')))
    112 
    113  call cursor(3, 1)
    114  norm! gUl
    115  call assert_equal('ẞ', getline(line('.')))
    116  norm! vgU
    117  call assert_equal('ẞ', getline(line('.')))
    118  norm! vgu
    119  call assert_equal('ß', getline(line('.')))
    120  norm! gul
    121  call assert_equal('ß', getline(line('.')))
    122 
    123  call cursor(4, 1)
    124  norm! vgU
    125  call assert_equal('ẞ', getline(line('.')))
    126  norm! vgu
    127  call assert_equal('ß', getline(line('.')))
    128  bw!
    129 endfunc
    130 
    131 " vim: shiftwidth=2 sts=2 expandtab