5 #define elements_in(a) (sizeof(a)/sizeof(a[0]))
8 const cm_unichar_t * left;
9 const cm_normchar_t * right;
12 struct norm_pair normalization_pairs[] = {
13 { L"abcdefghijklmnopq", L"abcdefghijklmnopq" },
14 { L"abcdefghijklmnopqrstuvwxyz1234"
15 L"abcdefghijklmnopqrstuvwxyz1234"
16 L"abcdefghijklmnopqrstuvwxyz1234"
17 L"abcdefghijklmnopqrstuvwxyz1234"
18 L"abcdefghijklmnopqrstuvwxyz1234"
19 L"abcdefghijklmnopqrstuvwxyz1234"
20 L"abcdefghijklmnopqrstuvwxyz1234"
21 L"abcdefghijklmnopqrstuvwxyz1234"
22 L"abcdefghijklmnopqrstuvwxyz1234"
23 L"abcdefghijklmnopqrstuvwxyz1234"
24 L"abcdefghijklmnopqrstuvwxyz1234"
25 L"abcdefghijklmnopqrstuvwxyz1234"
26 L"abcdefghijklmnopqrstuvwxyz1234"
27 L"abcdefghijklmnopqrstuvwxyz1234"
28 L"abcdefghijklmnopqrstuvwxyz1234"
29 L"abcdefghijklmnopqrstuvwxyz1234"
30 L"abcdefghijklmnopqrstuvwxyz1234"
31 L"abcdefghijklmnopqrstuvwxyz1234"
32 L"abcdefghijklmnopqrstuvwxyz1234"
33 L"abcdefghijklmnopqrstuvwxyz1234",
35 L"abcdefghijklmnopqrstuvwxyz1234"
36 L"abcdefghijklmnopqrstuvwxyz1234"
37 L"abcdefghijklmnopqrstuvwxyz1234"
38 L"abcdefghijklmnopqrstuvwxyz1234"
39 L"abcdefghijklmnopqrstuvwxyz1234"
40 L"abcdefghijklmnopqrstuvwxyz1234"
41 L"abcdefghijklmnopqrstuvwxyz1234"
42 L"abcdefghijklmnopqrstuvwxyz1234"
43 L"abcdefghijklmnopqrstuvwxyz1234"
44 L"abcdefghijklmnopqrstuvwxyz1234"
45 L"abcdefghijklmnopqrstuvwxyz1234"
46 L"abcdefghijklmnopqrstuvwxyz1234"
47 L"abcdefghijklmnopqrstuvwxyz1234"
48 L"abcdefghijklmnopqrstuvwxyz1234"
49 L"abcdefghijklmnopqrstuvwxyz1234"
50 L"abcdefghijklmnopqrstuvwxyz1234"
51 L"abcdefghijklmnopqrstuvwxyz1234"
52 L"abcdefghijklmnopqrstuvwxyz1234"
53 L"abcdefghijklmnopqrstuvwxyz1234"
54 L"abcdefghijklmnopqrstuvwxyz1234" },
55 { L"12839481flalfoo_)()(*&#@(*&",
56 L"12839481flalfoo_)()(*&#@(*&" }
59 void dumputf8(const unsigned char * s) {
61 printf("%02X ", (int) *s++);
65 void dumpunicode(const wchar_t * s) {
67 printf("%04X ", (int) *s++);
71 int cm_NormalizeStringAllocTest(void)
75 for (i=0; i < elements_in(normalization_pairs); i++) {
79 printf ("Test #%d:", i);
81 nstr = cm_NormalizeStringAlloc(normalization_pairs[i].left, -1, &cchdest);
84 printf ("FAILED! returned a NULL\n");
88 if (wcscmp(nstr, normalization_pairs[i].right)) {
89 printf ("FAILED: Expected [");
90 dumpunicode(normalization_pairs[i].right);
91 printf ("] Received [");
97 if (wcslen(nstr) != cchdest - 1) {
98 printf ("FAILED: Length is wrong\n");
110 typedef struct norm_test_entry {
114 const wchar_t * nfkc;
115 const wchar_t * nfkd;
118 extern norm_test_entry norm_tests[];
119 extern int n_norm_tests;
121 int cm_NormalizeStringTest(void)
126 for (i=0; i < n_norm_tests; i++) {
129 nfc = cm_NormalizeStringAlloc(norm_tests[i].nfd, -1, NULL);
131 printf ("FAILED: returned a NULL\n");
135 if (wcscmp(nfc, norm_tests[i].nfc)) {
136 printf ("FAILED: Expected [");
137 dumpunicode(norm_tests[i].nfc);
138 printf ("] Received [");
148 printf ("Number of failed tests: %d\n", n_failed);
153 typedef struct conv_test_entry {
154 const cm_utf8char_t * str;
155 const cm_unichar_t * wstr;
158 #define CTEST(a) { a, L ## a }
160 conv_test_entry conv_tests[] = {
163 CTEST("abcdefghijkl"),
164 CTEST("osidfja*(2312835"),
165 {"\xee\x80\x80", L"\xe000"},
166 {"\xef\xbf\xbd", L"\xfffd"},
167 {"\xf0\x9f\xbf\xbf", L"\xd83f\xdfff"}, /* Surrogates */
168 {"\xF1\x9F\xBF\xBE", L"\xD93F\xDFFE"},
169 {"\xf0\x90\x80\x80", L"\xd800\xdc00"},
172 int cm_Utf16ToUtf8AllocTest(void)
176 for (i=0; i < sizeof(conv_tests)/sizeof(conv_tests[0]); i++) {
180 printf ("Test #%d:", i);
182 c = cm_Utf16ToUtf8Alloc(conv_tests[i].wstr, -1, &len);
185 printf ("FAILED: returned NULL\n");
189 if (strlen(c) + 1 != len) {
190 printf ("FAILED: Returned wrong length [%d]. Actual length [%d]\n", len,
195 if (strcmp(c, conv_tests[i].str)) {
196 printf ("FAILED: Expected [");
197 dumputf8(conv_tests[i].str);
198 printf ("]. Returned [");
212 int cm_Utf16ToUtf8Test(void)
215 cm_utf8char_t c[1024];
217 for (i=0; i < sizeof(conv_tests)/sizeof(conv_tests[0]); i++) {
220 printf ("Test #%d:", i);
222 len = cm_Utf16ToUtf8(conv_tests[i].wstr, -1, c, sizeof(c)/sizeof(c[0]));
225 printf ("FAILED: returned 0\n");
229 if (strlen(c) + 1 != len) {
230 printf ("FAILED: Returned wrong length [%d]. Actual length [%d]\n", len,
235 if (strcmp(c, conv_tests[i].str)) {
236 printf ("FAILED: Expected [%s]. Returned [%s]\n", conv_tests[i].str, c);
246 int cm_Utf8ToUtf16AllocTest(void)
250 for (i=0; i < sizeof(conv_tests)/sizeof(conv_tests[0]); i++) {
254 printf ("Test #%d:", i);
256 c = cm_Utf8ToUtf16Alloc(conv_tests[i].str, -1, &len);
259 printf ("FAILED: returned NULL\n");
263 if (wcslen(c) + 1 != len) {
264 printf ("FAILED: Returned wrong length [%d]. Actual length [%d]\n", len,
269 if (wcscmp(c, conv_tests[i].wstr)) {
270 printf ("FAILED: Expected [");
271 dumpunicode(conv_tests[i].wstr);
272 printf ("]. Returned [");
286 int cm_Utf8ToUtf16Test(void)
289 cm_unichar_t c[1024];
291 for (i=0; i < sizeof(conv_tests)/sizeof(conv_tests[0]); i++) {
294 printf ("Test #%d:", i);
296 len = cm_Utf8ToUtf16(conv_tests[i].str, -1, c, sizeof(c)/sizeof(c[0]));
299 printf ("FAILED: returned 0\n");
303 if (wcslen(c) + 1 != len) {
304 printf ("FAILED: Returned wrong length [%d]. Actual length [%d]\n", len,
309 if (wcscmp(c, conv_tests[i].wstr)) {
310 printf ("FAILED: Expected [");
311 dumpunicode(conv_tests[i].wstr);
312 printf ("]. Returned [");
324 int main(int argc, char ** argv)
328 cm_InitNormalization();
330 #define RUNTEST(f) printf("Begin " #f "\n"); trv = f(); printf ("End " #f "\n\n"); if (trv != 0) return trv
332 RUNTEST(cm_NormalizeStringAllocTest);
333 RUNTEST(cm_NormalizeStringTest);
334 RUNTEST(cm_Utf16ToUtf8AllocTest);
335 RUNTEST(cm_Utf16ToUtf8Test);
336 RUNTEST(cm_Utf8ToUtf16AllocTest);
337 RUNTEST(cm_Utf8ToUtf16Test);