blob: 576e86142f4f5189296437232b049380fe598fb3 [file] [log] [blame]
Bram Moolenaar28b23822017-06-27 18:29:17 +02001" Tests for case-insensitive UTF-8 comparisons (utf_strnicmp() in mbyte.c)
2" Also test "g~ap".
3
4if !has("multi_byte")
5 finish
6endif
7
8function! Ch(a, op, b, expected)
9 call assert_equal(eval(printf('"%s" %s "%s"', a:a, a:op, a:b)), a:expected,
10 \ printf('"%s" %s "%s" should return %d', a:a, a:op, a:b, a:expected))
11endfunction
12
13function! Chk(a, b, result)
14 if a:result == 0
15 call Ch(a:a, '==?', a:b, 1)
16 call Ch(a:a, '!=?', a:b, 0)
17 call Ch(a:a, '<=?', a:b, 1)
18 call Ch(a:a, '>=?', a:b, 1)
19 call Ch(a:a, '<?', a:b, 0)
20 call Ch(a:a, '>?', a:b, 0)
21 elseif a:result > 0
22 call Ch(a:a, '==?', a:b, 0)
23 call Ch(a:a, '!=?', a:b, 1)
24 call Ch(a:a, '<=?', a:b, 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 else
29 call Ch(a:a, '==?', a:b, 0)
30 call Ch(a:a, '!=?', a:b, 1)
31 call Ch(a:a, '<=?', a:b, 1)
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 endif
36endfunction
37
38function! Check(a, b, result)
39 call Chk(a:a, a:b, a:result)
40 call Chk(a:b, a:a, -a:result)
41endfunction
42
43function! LT(a, b)
44 call Check(a:a, a:b, -1)
45endfunction
46
47function! GT(a, b)
48 call Check(a:a, a:b, 1)
49endfunction
50
51function! EQ(a, b)
52 call Check(a:a, a:b, 0)
53endfunction
54
55function Test_comparisons()
56 call EQ('', '')
57 call LT('', 'a')
58 call EQ('abc', 'abc')
59 call EQ('Abc', 'abC')
60 call LT('ab', 'abc')
61 call LT('AB', 'abc')
62 call LT('ab', 'aBc')
63 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')
64 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')
65 call EQ('\xe2\x84\xaa', 'k')
66 call LT('\xe2\x84\xaa', 'kkkkkk')
67 call EQ('\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa', 'kkk')
68 call LT('kk', '\xe2\x84\xaa\xe2\x84\xaa\xe2\x84\xaa')
69 call EQ('\xe2\x84\xaa\xe2\x84\xa6k\xe2\x84\xaak\xcf\x89', 'k\xcf\x89\xe2\x84\xaakk\xe2\x84\xa6')
70 call EQ('Abc\x80', 'AbC\x80')
71 call LT('Abc\x80', 'AbC\x81')
72 call LT('Abc', 'AbC\x80')
73 call LT('abc\x80DEF', 'abc\x80def') " case folding stops at the first bad character
74 call LT('\xc3XYZ', '\xc3xyz')
75 call EQ('\xef\xbc\xba', '\xef\xbd\x9a') " FF3A (upper), FF5A (lower)
76 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
77 call LT('\xc3', '\xc3\x83')
78 call EQ('\xc3\xa3xYz', '\xc3\x83XyZ')
79 for n in range(0x60, 0xFF)
80 call LT(printf('xYz\x%.2X', n-1), printf('XyZ\x%.2X', n))
81 endfor
82 for n in range(0x80, 0xBF)
83 call EQ(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
84 endfor
85 for n in range(0xC0, 0xFF)
86 call LT(printf('xYz\xc2\x%.2XUvW', n), printf('XyZ\xc2\x%.2XuVw', n))
87 endfor
88endfunction
89
90" test that g~ap changes one paragraph only.
91function Test_gap()
92 new
93 call feedkeys("iabcd\n\ndefggg0g~ap", "tx")
94 call assert_equal(["ABCD", "", "defg"], getline(1,3))
95endfunction