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