blob: a22cbb2f4e98a507e2fd16523383a5ad8410fef0 [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
Bram Moolenaar1e115362019-01-09 23:01:02 +01008func Ch(a, op, b, expected)
Bram Moolenaar28b23822017-06-27 18:29:17 +02009 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))
Bram Moolenaar1e115362019-01-09 23:01:02 +010011endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020012
Bram Moolenaar1e115362019-01-09 23:01:02 +010013func Chk(a, b, result)
Bram Moolenaar28b23822017-06-27 18:29:17 +020014 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
Bram Moolenaar1e115362019-01-09 23:01:02 +010036endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020037
Bram Moolenaar1e115362019-01-09 23:01:02 +010038func Check(a, b, result)
Bram Moolenaar28b23822017-06-27 18:29:17 +020039 call Chk(a:a, a:b, a:result)
40 call Chk(a:b, a:a, -a:result)
Bram Moolenaar1e115362019-01-09 23:01:02 +010041endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020042
Bram Moolenaar1e115362019-01-09 23:01:02 +010043func LT(a, b)
Bram Moolenaar28b23822017-06-27 18:29:17 +020044 call Check(a:a, a:b, -1)
Bram Moolenaar1e115362019-01-09 23:01:02 +010045endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020046
Bram Moolenaar1e115362019-01-09 23:01:02 +010047func GT(a, b)
Bram Moolenaar28b23822017-06-27 18:29:17 +020048 call Check(a:a, a:b, 1)
Bram Moolenaar1e115362019-01-09 23:01:02 +010049endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020050
Bram Moolenaar1e115362019-01-09 23:01:02 +010051func EQ(a, b)
Bram Moolenaar28b23822017-06-27 18:29:17 +020052 call Check(a:a, a:b, 0)
Bram Moolenaar1e115362019-01-09 23:01:02 +010053endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020054
Bram Moolenaar1e115362019-01-09 23:01:02 +010055func Test_comparisons()
Bram Moolenaar28b23822017-06-27 18:29:17 +020056 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
Bram Moolenaar1e115362019-01-09 23:01:02 +010088endfunc
Bram Moolenaar28b23822017-06-27 18:29:17 +020089
90" test that g~ap changes one paragraph only.
Bram Moolenaar1e115362019-01-09 23:01:02 +010091func Test_gap()
Bram Moolenaar28b23822017-06-27 18:29:17 +020092 new
93 call feedkeys("iabcd\n\ndefggg0g~ap", "tx")
94 call assert_equal(["ABCD", "", "defg"], getline(1,3))
Bram Moolenaar1e115362019-01-09 23:01:02 +010095endfunc