Imported Upstream version 0.9.3
[platform/upstream/libunistring.git] / tests / uninorm / test-u8-normcmp.c
1 /* Test of normalization insensitive comparison of UTF-8 strings.
2    Copyright (C) 2009, 2010 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* Written by Bruno Haible <bruno@clisp.org>, 2009.  */
18
19 #include <config.h>
20
21 #include "uninorm.h"
22
23 #include "macros.h"
24
25 #include "test-u8-normcmp.h"
26
27 static void
28 test_nonascii (int (*my_normcmp) (const uint8_t *, size_t, const uint8_t *, size_t, uninorm_t, int *))
29 {
30   /* Normalization effects.  */
31   {
32     static const uint8_t input1[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e' };
33     static const uint8_t input2[] = { 'H', 'o', 0xCC, 0x88, 'h', 'l', 'e' };
34     static const uint8_t input3[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e', 'n' };
35     static const uint8_t input4[] = { 'H', 'o', 0xCC, 0x88, 'h', 'l', 'e', 'n' };
36     static const uint8_t input5[] = { 'H', 'u', 'r', 'z' };
37     int cmp;
38
39     ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
40     ASSERT (cmp == 0);
41
42     ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), UNINORM_NFD, &cmp) == 0);
43     ASSERT (cmp == 0);
44
45     ASSERT (my_normcmp (input3, SIZEOF (input3), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
46     ASSERT (cmp == 0);
47
48     ASSERT (my_normcmp (input4, SIZEOF (input4), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
49     ASSERT (cmp == 0);
50
51     ASSERT (my_normcmp (input2, SIZEOF (input2), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
52     ASSERT (cmp == -1);
53
54     ASSERT (my_normcmp (input1, SIZEOF (input1), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0);
55     ASSERT (cmp == -1);
56
57     ASSERT (my_normcmp (input1, SIZEOF (input1), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
58     ASSERT (cmp == -1);
59
60     ASSERT (my_normcmp (input2, SIZEOF (input2), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0);
61     ASSERT (cmp == -1);
62   }
63   { /* LATIN CAPITAL LETTER A WITH DIAERESIS */
64     static const uint8_t input1[] = { 0xC3, 0x84 };
65     static const uint8_t input2[] = { 0x41, 0xCC, 0x88 };
66     int cmp;
67
68     ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
69     ASSERT (cmp == 0);
70   }
71   { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
72     static const uint8_t input1[] = { 0xC7, 0x9E };
73     static const uint8_t input2[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 };
74     int cmp;
75
76     ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
77     ASSERT (cmp == 0);
78   }
79   { /* GREEK DIALYTIKA AND PERISPOMENI */
80     static const uint8_t input1[] = { 0xE1, 0xBF, 0x81 };
81     static const uint8_t input2[] = { 0xC2, 0xA8, 0xCD, 0x82 };
82     int cmp;
83
84     ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
85     ASSERT (cmp == 0);
86   }
87   { /* HANGUL SYLLABLE GEUL */
88     static const uint8_t input1[] = { 0xEA, 0xB8, 0x80 };
89     static const uint8_t input2[] = { 0xEA, 0xB7, 0xB8, 0xE1, 0x86, 0xAF };
90     static const uint8_t input3[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF };
91     int cmp;
92
93     ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
94     ASSERT (cmp == 0);
95
96     ASSERT (my_normcmp (input1, SIZEOF (input1), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0);
97     ASSERT (cmp == 0);
98   }
99   { /* HANGUL SYLLABLE GEU */
100     static const uint8_t input1[] = { 0xEA, 0xB7, 0xB8 };
101     static const uint8_t input2[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 };
102     int cmp;
103
104     ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0);
105     ASSERT (cmp == 0);
106   }
107 }
108
109 int
110 main ()
111 {
112   test_ascii (u8_normcmp, UNINORM_NFD);
113   test_nonascii (u8_normcmp);
114
115   return 0;
116 }