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)