1 /* Test of lowercase mapping for UTF-16 strings.
2 Copyright (C) 2009 Free Software Foundation, Inc.
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.
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.
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/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2009. */
29 #define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
30 #define ASSERT(expr) \
35 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
43 check (const uint16_t *input, size_t input_length,
44 const char *iso639_language, uninorm_t nf,
45 const uint16_t *expected, size_t expected_length)
50 /* Test return conventions with resultbuf == NULL. */
51 result = u16_tolower (input, input_length, iso639_language, nf, NULL, &length);
52 if (!(result != NULL))
54 if (!(length == expected_length))
56 if (!(u16_cmp (result, expected, expected_length) == 0))
60 /* Test return conventions with resultbuf too small. */
61 if (expected_length > 0)
63 uint16_t *preallocated;
65 length = expected_length - 1;
66 preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
67 result = u16_tolower (input, input_length, iso639_language, nf, preallocated, &length);
68 if (!(result != NULL))
70 if (!(result != preallocated))
72 if (!(length == expected_length))
74 if (!(u16_cmp (result, expected, expected_length) == 0))
80 /* Test return conventions with resultbuf large enough. */
82 uint16_t *preallocated;
84 length = expected_length;
85 preallocated = (uint16_t *) malloc (length * sizeof (uint16_t));
86 result = u16_tolower (input, input_length, iso639_language, nf, preallocated, &length);
87 if (!(result != NULL))
89 if (!(result == preallocated))
91 if (!(length == expected_length))
93 if (!(u16_cmp (result, expected, expected_length) == 0))
104 { /* Empty string. */
105 ASSERT (check (NULL, 0, NULL, NULL, NULL, 0) == 0);
106 ASSERT (check (NULL, 0, NULL, UNINORM_NFC, NULL, 0) == 0);
110 { /* "Grüß Gott. Здравствуйте! x=(-b±sqrt(b²-4ac))/(2a) 日本語,中文,한글" */
111 static const uint16_t input[] =
112 { 'G', 'r', 0x00FC, 0x00DF, ' ', 'G', 'o', 't', 't', '.', ' ',
113 0x0417, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
114 0x0439, 0x0442, 0x0435, '!', ' ',
115 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
116 '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
117 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
119 static const uint16_t casemapped[] =
120 { 'g', 'r', 0x00FC, 0x00DF, ' ', 'g', 'o', 't', 't', '.', ' ',
121 0x0437, 0x0434, 0x0440, 0x0430, 0x0432, 0x0441, 0x0442, 0x0432, 0x0443,
122 0x0439, 0x0442, 0x0435, '!', ' ',
123 'x', '=', '(', '-', 'b', 0x00B1, 's', 'q', 'r', 't', '(', 'b', 0x00B2,
124 '-', '4', 'a', 'c', ')', ')', '/', '(', '2', 'a', ')', ' ', ' ',
125 0x65E5, 0x672C, 0x8A9E, ',', 0x4E2D, 0x6587, ',', 0xD55C, 0xAE00, '\n'
127 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
130 /* Turkish letters i İ ı I */
131 { /* LATIN CAPITAL LETTER I */
132 static const uint16_t input[] = { 0x0049 };
133 static const uint16_t casemapped[] = { 0x0069 };
134 static const uint16_t casemapped_tr[] = { 0x0131 };
135 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
136 ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
138 { /* LATIN SMALL LETTER I */
139 static const uint16_t input[] = { 0x0069 };
140 static const uint16_t casemapped[] = { 0x0069 };
141 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
142 ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
144 { /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
145 static const uint16_t input[] = { 0x0130 };
146 static const uint16_t casemapped[] = { 0x0069, 0x0307 };
147 static const uint16_t casemapped_tr[] = { 0x0069 };
148 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
149 ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped_tr, SIZEOF (casemapped_tr)) == 0);
151 { /* LATIN SMALL LETTER DOTLESS I */
152 static const uint16_t input[] = { 0x0131 };
153 static const uint16_t casemapped[] = { 0x0131 };
154 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
155 ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
158 static const uint16_t input[] =
159 { 0x0054, 0x004F, 0x0050, 0x004B, 0x0041, 0x0050, 0x0049 };
160 static const uint16_t casemapped[] =
161 { 0x0074, 0x006F, 0x0070, 0x006B, 0x0061, 0x0070, 0x0131 };
162 ASSERT (check (input, SIZEOF (input), "tr", NULL, casemapped, SIZEOF (casemapped)) == 0);
165 /* Uppercasing can increase the number of Unicode characters. */
167 static const uint16_t input[] = { 0x0048, 0x0045, 0x0049, 0x00DF };
168 static const uint16_t casemapped[] = { 0x0068, 0x0065, 0x0069, 0x00DF };
169 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);
172 /* Case mappings for some characters can depend on the surrounding characters. */
173 { /* "ΠΕΡΙΣΣΌΤΕΡΕΣ ΠΛΗΡΟΦΟΡΊΕΣ" */
174 static const uint16_t input[] =
176 0x03A0, 0x0395, 0x03A1, 0x0399, 0x03A3, 0x03A3, 0x038C, 0x03A4,
177 0x0395, 0x03A1, 0x0395, 0x03A3, 0x0020, 0x03A0, 0x039B, 0x0397,
178 0x03A1, 0x039F, 0x03A6, 0x039F, 0x03A1, 0x038A, 0x0395, 0x03A3
180 static const uint16_t casemapped[] =
182 0x03C0, 0x03B5, 0x03C1, 0x03B9, 0x03C3, 0x03C3, 0x03CC, 0x03C4,
183 0x03B5, 0x03C1, 0x03B5, 0x03C2, 0x0020, 0x03C0, 0x03BB, 0x03B7,
184 0x03C1, 0x03BF, 0x03C6, 0x03BF, 0x03C1, 0x03AF, 0x03B5, 0x03C2
186 ASSERT (check (input, SIZEOF (input), NULL, NULL, casemapped, SIZEOF (casemapped)) == 0);