neovim

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

082_string_comparison_spec.lua (3987B)


      1 -- Tests for case-insensitive UTF-8 comparisons (utf_strnicmp() in mbyte.c)
      2 -- Also test "g~ap".
      3 
      4 local n = require('test.functional.testnvim')()
      5 
      6 local feed, source = n.feed, n.source
      7 local clear, feed_command, expect = n.clear, n.feed_command, n.expect
      8 
      9 describe('case-insensitive string comparison in UTF-8', function()
     10  setup(clear)
     11 
     12  it('is working', function()
     13    feed('ggdG<cr>')
     14    source([[
     15      function! Ch(a, op, b, expected)
     16        if eval(printf('"%s" %s "%s"', a:a, a:op, a:b)) != a:expected
     17          call append(line('$'), printf('"%s" %s "%s" should return %d', a:a, a:op, a:b, a:expected))
     18        else
     19          let b:passed += 1
     20        endif
     21      endfunction
     22 
     23      function! Chk(a, b, result)
     24        if a:result == 0
     25          call Ch(a:a, '==?', a:b, 1)
     26          call Ch(a:a, '!=?', a:b, 0)
     27          call Ch(a:a, '<=?', a:b, 1)
     28          call Ch(a:a, '>=?', a:b, 1)
     29          call Ch(a:a, '<?', a:b, 0)
     30          call Ch(a:a, '>?', a:b, 0)
     31        elseif a:result > 0
     32          call Ch(a:a, '==?', a:b, 0)
     33          call Ch(a:a, '!=?', a:b, 1)
     34          call Ch(a:a, '<=?', a:b, 0)
     35          call Ch(a:a, '>=?', a:b, 1)
     36          call Ch(a:a, '<?', a:b, 0)
     37          call Ch(a:a, '>?', a:b, 1)
     38        else
     39          call Ch(a:a, '==?', a:b, 0)
     40          call Ch(a:a, '!=?', a:b, 1)
     41          call Ch(a:a, '<=?', a:b, 1)
     42          call Ch(a:a, '>=?', a:b, 0)
     43          call Ch(a:a, '<?', a:b, 1)
     44          call Ch(a:a, '>?', a:b, 0)
     45        endif
     46      endfunction
     47 
     48      function! Check(a, b, result)
     49        call Chk(a:a, a:b, a:result)
     50        call Chk(a:b, a:a, -a:result)
     51      endfunction
     52 
     53      function! LT(a, b)
     54        call Check(a:a, a:b, -1)
     55      endfunction
     56 
     57      function! GT(a, b)
     58        call Check(a:a, a:b, 1)
     59      endfunction
     60 
     61      function! EQ(a, b)
     62        call Check(a:a, a:b, 0)
     63      endfunction
     64 
     65      let b:passed=0
     66      call EQ('', '')
     67      call LT('', 'a')
     68      call EQ('abc', 'abc')
     69      call EQ('Abc', 'abC')
     70      call LT('ab', 'abc')
     71      call LT('AB', 'abc')
     72      call LT('ab', 'aBc')
     73      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')
     74      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')
     75      call EQ('\xe2\x84\xaa', 'k')
     76      call LT('\xe2\x84\xaa', 'kkkkkk')
     77      call EQ('\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa', 'kkk')
     78      call LT('kk', '\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa')
     79      call EQ('\xe2\x84\xaa\xe2\x84\xa6k\xe2\x84\xaak\xcf\x89', 'k\xcf\x89\xe2\x84\xaakk\xe2\x84\xa6')
     80      call EQ('Abc\x80', 'AbC\x80')
     81      call LT('Abc\x80', 'AbC\x81')
     82      call LT('Abc', 'AbC\x80')
     83 
     84      " Case folding stops at the first bad character.
     85      call LT('abc\x80DEF', 'abc\x80def')
     86      call LT('\xc3XYZ', '\xc3xyz')
     87 
     88      " FF3A (upper), FF5A (lower).
     89      call EQ('\xef\xbc\xba', '\xef\xbd\x9a')
     90 
     91      " First string is ok and equals \xef\xbd\x9a after folding, second
     92      " string is illegal and was left unchanged, then the strings were
     93      " bytewise compared.
     94      call GT('\xef\xbc\xba', '\xef\xbc\xff')
     95      call LT('\xc3', '\xc3\x83')
     96      call EQ('\xc3\xa3xYz', '\xc3\x83XyZ')
     97      for n in range(0x60, 0xFF)
     98        call LT(printf('xYz\x%.2X', n-1), printf('XyZ\x%.2X', n))
     99      endfor
    100      for n in range(0x80, 0xBF)
    101        call EQ(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
    102      endfor
    103      for n in range(0xC0, 0xFF)
    104        call LT(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
    105      endfor
    106      call append(0, printf('%d checks passed', b:passed))
    107    ]])
    108 
    109    -- Test that g~ap changes one paragraph only.
    110    feed_command('new')
    111    feed('iabcd<cr><cr>defg<esc>gg0g~ap')
    112    feed_command('let lns = getline(1,3)')
    113    feed_command('q!')
    114    feed_command([[call append(line('$'), lns)]])
    115 
    116    -- Assert buffer contents.
    117    expect([=[
    118      3732 checks passed
    119 
    120      ABCD
    121 
    122      defg]=])
    123  end)
    124 end)