1" Tests for case-insensitive UTF-8 comparisons (utf_strnicmp() in mbyte.c)
2" Also test "g~ap".
3
4func 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))
7endfunc
8
9func 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
32endfunc
33
34func Check(a, b, result)
35  call Chk(a:a, a:b, a:result)
36  call Chk(a:b, a:a, -a:result)
37endfunc
38
39func LT(a, b)
40  call Check(a:a, a:b, -1)
41endfunc
42
43func GT(a, b)
44  call Check(a:a, a:b, 1)
45endfunc
46
47func EQ(a, b)
48  call Check(a:a, a:b, 0)
49endfunc
50
51func 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
84endfunc
85
86" test that g~ap changes one paragraph only.
87func 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))
94endfunc
95
96" vim: shiftwidth=2 sts=2 expandtab
97