1" 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
8func 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))
11endfunc
12
13func 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
36endfunc
37
38func Check(a, b, result)
39  call Chk(a:a, a:b, a:result)
40  call Chk(a:b, a:a, -a:result)
41endfunc
42
43func LT(a, b)
44  call Check(a:a, a:b, -1)
45endfunc
46
47func GT(a, b)
48  call Check(a:a, a:b, 1)
49endfunc
50
51func EQ(a, b)
52  call Check(a:a, a:b, 0)
53endfunc
54
55func 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
88endfunc
89
90" test that g~ap changes one paragraph only.
91func Test_gap()
92  new
93  call feedkeys("iabcd\n\ndefggg0g~ap", "tx")
94  call assert_equal(["ABCD", "", "defg"], getline(1,3))
95endfunc
96