Branch data Line data Source code
1 : : /* Unit tests for utilities
2 : : * Copyright (C) 2010 Red Hat, Inc.
3 : : * Copyright (C) 2011 Google, Inc.
4 : : *
5 : : * SPDX-License-Identifier: LicenseRef-old-glib-tests
6 : : *
7 : : * This work is provided "as is"; redistribution and modification
8 : : * in whole or in part, in any medium, physical or electronic is
9 : : * permitted without restriction.
10 : : *
11 : : * This work is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 : : *
15 : : * In no event shall the authors or contributors be liable for any
16 : : * direct, indirect, incidental, special, exemplary, or consequential
17 : : * damages (including, but not limited to, procurement of substitute
18 : : * goods or services; loss of use, data, or profits; or business
19 : : * interruption) however caused and on any theory of liability, whether
20 : : * in contract, strict liability, or tort (including negligence or
21 : : * otherwise) arising in any way out of the use of this software, even
22 : : * if advised of the possibility of such damage.
23 : : *
24 : : * Author: Matthias Clasen, Behdad Esfahbod
25 : : */
26 : :
27 : : /* We are testing some deprecated APIs here */
28 : : #ifndef GLIB_DISABLE_DEPRECATION_WARNINGS
29 : : #define GLIB_DISABLE_DEPRECATION_WARNINGS
30 : : #endif
31 : :
32 : : #include <locale.h>
33 : : #include <stdio.h>
34 : :
35 : : #include "glib.h"
36 : :
37 : : #include "glib/gunidecomp.h"
38 : :
39 : : #ifdef G_OS_WIN32
40 : : #include <windows.h>
41 : : #endif
42 : :
43 : : static void
44 : 6 : save_and_clear_env (const char *name,
45 : : char **save)
46 : : {
47 : 6 : *save = g_strdup (g_getenv (name));
48 : 6 : g_unsetenv (name);
49 : 6 : }
50 : :
51 : : /* Test that g_unichar_validate() returns the correct value for various
52 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
53 : : static void
54 : 1 : test_unichar_validate (void)
55 : : {
56 : 1 : g_assert_true (g_unichar_validate ('j'));
57 : 1 : g_assert_true (g_unichar_validate (8356));
58 : 1 : g_assert_true (g_unichar_validate (8356));
59 : 1 : g_assert_true (g_unichar_validate (0xFDD1));
60 : 1 : g_assert_true (g_unichar_validate (917760));
61 : 1 : g_assert_false (g_unichar_validate (0x110000));
62 : 1 : }
63 : :
64 : : /* Test that g_unichar_type() returns the correct value for various
65 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
66 : : static void
67 : 1 : test_unichar_character_type (void)
68 : : {
69 : : guint i;
70 : : struct {
71 : : GUnicodeType type;
72 : : gunichar c;
73 : 1 : } examples[] = {
74 : : { G_UNICODE_CONTROL, 0x000D },
75 : : { G_UNICODE_FORMAT, 0x200E },
76 : : /* G_UNICODE_UNASSIGNED */
77 : : { G_UNICODE_PRIVATE_USE, 0xE000 },
78 : : { G_UNICODE_SURROGATE, 0xD800 },
79 : : { G_UNICODE_LOWERCASE_LETTER, 0x0061 },
80 : : { G_UNICODE_MODIFIER_LETTER, 0x02B0 },
81 : : { G_UNICODE_OTHER_LETTER, 0x3400 },
82 : : { G_UNICODE_TITLECASE_LETTER, 0x01C5 },
83 : : { G_UNICODE_UPPERCASE_LETTER, 0xFF21 },
84 : : { G_UNICODE_SPACING_MARK, 0x0903 },
85 : : { G_UNICODE_ENCLOSING_MARK, 0x20DD },
86 : : { G_UNICODE_NON_SPACING_MARK, 0xA806 },
87 : : { G_UNICODE_DECIMAL_NUMBER, 0xFF10 },
88 : : { G_UNICODE_LETTER_NUMBER, 0x16EE },
89 : : { G_UNICODE_OTHER_NUMBER, 0x17F0 },
90 : : { G_UNICODE_CONNECT_PUNCTUATION, 0x005F },
91 : : { G_UNICODE_DASH_PUNCTUATION, 0x058A },
92 : : { G_UNICODE_CLOSE_PUNCTUATION, 0x0F3B },
93 : : { G_UNICODE_FINAL_PUNCTUATION, 0x2019 },
94 : : { G_UNICODE_INITIAL_PUNCTUATION, 0x2018 },
95 : : { G_UNICODE_OTHER_PUNCTUATION, 0x2016 },
96 : : { G_UNICODE_OPEN_PUNCTUATION, 0x0F3A },
97 : : { G_UNICODE_CURRENCY_SYMBOL, 0x20A0 },
98 : : { G_UNICODE_MODIFIER_SYMBOL, 0x309B },
99 : : { G_UNICODE_MATH_SYMBOL, 0xFB29 },
100 : : { G_UNICODE_OTHER_SYMBOL, 0x00A6 },
101 : : { G_UNICODE_LINE_SEPARATOR, 0x2028 },
102 : : { G_UNICODE_PARAGRAPH_SEPARATOR, 0x2029 },
103 : : { G_UNICODE_SPACE_SEPARATOR, 0x202F },
104 : : };
105 : :
106 [ + + ]: 30 : for (i = 0; i < G_N_ELEMENTS (examples); i++)
107 : : {
108 : 29 : g_assert_cmpint (g_unichar_type (examples[i].c), ==, examples[i].type);
109 : : }
110 : :
111 : : /*** Testing TYPE() border cases ***/
112 : 1 : g_assert_cmpint (g_unichar_type (0x3FF5), ==, 0x07);
113 : : /* U+FFEFF Plane 15 Private Use */
114 : 1 : g_assert_cmpint (g_unichar_type (0xFFEFF), ==, 0x03);
115 : : /* U+E0001 Language Tag */
116 : 1 : g_assert_cmpint (g_unichar_type (0xE0001), ==, 0x01);
117 : 1 : g_assert_cmpint (g_unichar_type (G_UNICODE_LAST_CHAR), ==, 0x02);
118 : 1 : g_assert_cmpint (g_unichar_type (G_UNICODE_LAST_CHAR + 1), ==, 0x02);
119 : 1 : g_assert_cmpint (g_unichar_type (G_UNICODE_LAST_CHAR_PART1), ==, 0x02);
120 : 1 : g_assert_cmpint (g_unichar_type (G_UNICODE_LAST_CHAR_PART1 + 1), ==, 0x02);
121 : 1 : }
122 : :
123 : : /* Test that g_unichar_break_type() returns the correct value for various
124 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
125 : : static void
126 : 1 : test_unichar_break_type (void)
127 : : {
128 : : guint i;
129 : : struct {
130 : : GUnicodeBreakType type;
131 : : gunichar c;
132 : 1 : } examples[] = {
133 : : { G_UNICODE_BREAK_MANDATORY, 0x2028 },
134 : : { G_UNICODE_BREAK_CARRIAGE_RETURN, 0x000D },
135 : : { G_UNICODE_BREAK_LINE_FEED, 0x000A },
136 : : { G_UNICODE_BREAK_COMBINING_MARK, 0x0300 },
137 : : { G_UNICODE_BREAK_SURROGATE, 0xD800 },
138 : : { G_UNICODE_BREAK_ZERO_WIDTH_SPACE, 0x200B },
139 : : { G_UNICODE_BREAK_INSEPARABLE, 0x2024 },
140 : : { G_UNICODE_BREAK_NON_BREAKING_GLUE, 0x00A0 },
141 : : { G_UNICODE_BREAK_CONTINGENT, 0xFFFC },
142 : : { G_UNICODE_BREAK_SPACE, 0x0020 },
143 : : { G_UNICODE_BREAK_AFTER, 0x05BE },
144 : : { G_UNICODE_BREAK_BEFORE, 0x02C8 },
145 : : { G_UNICODE_BREAK_BEFORE_AND_AFTER, 0x2014 },
146 : : { G_UNICODE_BREAK_HYPHEN, 0x002D },
147 : : { G_UNICODE_BREAK_NON_STARTER, 0x17D6 },
148 : : { G_UNICODE_BREAK_OPEN_PUNCTUATION, 0x0028 },
149 : : { G_UNICODE_BREAK_CLOSE_PARENTHESIS, 0x0029 },
150 : : { G_UNICODE_BREAK_CLOSE_PUNCTUATION, 0x007D },
151 : : { G_UNICODE_BREAK_QUOTATION, 0x0022 },
152 : : { G_UNICODE_BREAK_EXCLAMATION, 0x0021 },
153 : : { G_UNICODE_BREAK_IDEOGRAPHIC, 0x2E80 },
154 : : { G_UNICODE_BREAK_NUMERIC, 0x0030 },
155 : : { G_UNICODE_BREAK_INFIX_SEPARATOR, 0x002C },
156 : : { G_UNICODE_BREAK_SYMBOL, 0x002F },
157 : : { G_UNICODE_BREAK_ALPHABETIC, 0x0023 },
158 : : { G_UNICODE_BREAK_PREFIX, 0x0024 },
159 : : { G_UNICODE_BREAK_POSTFIX, 0x0025 },
160 : : { G_UNICODE_BREAK_COMPLEX_CONTEXT, 0x0E01 },
161 : : { G_UNICODE_BREAK_AMBIGUOUS, 0x00F7 },
162 : : { G_UNICODE_BREAK_UNKNOWN, 0xE000 },
163 : : { G_UNICODE_BREAK_NEXT_LINE, 0x0085 },
164 : : { G_UNICODE_BREAK_WORD_JOINER, 0x2060 },
165 : : { G_UNICODE_BREAK_HANGUL_L_JAMO, 0x1100 },
166 : : { G_UNICODE_BREAK_HANGUL_V_JAMO, 0x1160 },
167 : : { G_UNICODE_BREAK_HANGUL_T_JAMO, 0x11A8 },
168 : : { G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, 0xAC00 },
169 : : { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, 0xAC01 },
170 : : { G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, 0x3041 },
171 : : { G_UNICODE_BREAK_HEBREW_LETTER, 0x05D0 },
172 : : { G_UNICODE_BREAK_REGIONAL_INDICATOR, 0x1F1F6 },
173 : : { G_UNICODE_BREAK_EMOJI_BASE, 0x1F466 },
174 : : { G_UNICODE_BREAK_EMOJI_MODIFIER, 0x1F3FB },
175 : : { G_UNICODE_BREAK_ZERO_WIDTH_JOINER, 0x200D },
176 : : { G_UNICODE_BREAK_AKSARA, 0x1B45 },
177 : : { G_UNICODE_BREAK_AKSARA_PRE_BASE, 0x1193F },
178 : : { G_UNICODE_BREAK_AKSARA_START, 0x11F50 },
179 : : { G_UNICODE_BREAK_VIRAMA_FINAL, 0x1BF3 },
180 : : { G_UNICODE_BREAK_VIRAMA, 0xA9C0 },
181 : : };
182 : :
183 [ + + ]: 49 : for (i = 0; i < G_N_ELEMENTS (examples); i++)
184 : : {
185 : 48 : g_assert_cmpint (g_unichar_break_type (examples[i].c), ==, examples[i].type);
186 : : }
187 : 1 : }
188 : :
189 : : /* Test that g_unichar_get_script() returns the correct value for various
190 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
191 : : static void
192 : 1 : test_unichar_script (void)
193 : : {
194 : : guint i;
195 : : struct {
196 : : GUnicodeScript script;
197 : : gunichar c;
198 : 1 : } examples[] = {
199 : : { G_UNICODE_SCRIPT_COMMON, 0x002A },
200 : : { G_UNICODE_SCRIPT_INHERITED, 0x1CED },
201 : : { G_UNICODE_SCRIPT_INHERITED, 0x0670 },
202 : : { G_UNICODE_SCRIPT_ARABIC, 0x060D },
203 : : { G_UNICODE_SCRIPT_ARMENIAN, 0x0559 },
204 : : { G_UNICODE_SCRIPT_BENGALI, 0x09CD },
205 : : { G_UNICODE_SCRIPT_BOPOMOFO, 0x31B6 },
206 : : { G_UNICODE_SCRIPT_CHEROKEE, 0x13A2 },
207 : : { G_UNICODE_SCRIPT_COPTIC, 0x2CFD },
208 : : { G_UNICODE_SCRIPT_CYRILLIC, 0x0482 },
209 : : { G_UNICODE_SCRIPT_DESERET, 0x10401 },
210 : : { G_UNICODE_SCRIPT_DEVANAGARI, 0x094D },
211 : : { G_UNICODE_SCRIPT_ETHIOPIC, 0x1258 },
212 : : { G_UNICODE_SCRIPT_GEORGIAN, 0x10FC },
213 : : { G_UNICODE_SCRIPT_GOTHIC, 0x10341 },
214 : : { G_UNICODE_SCRIPT_GREEK, 0x0375 },
215 : : { G_UNICODE_SCRIPT_GUJARATI, 0x0A83 },
216 : : { G_UNICODE_SCRIPT_GURMUKHI, 0x0A3C },
217 : : { G_UNICODE_SCRIPT_HAN, 0x3005 },
218 : : { G_UNICODE_SCRIPT_HANGUL, 0x1100 },
219 : : { G_UNICODE_SCRIPT_HEBREW, 0x05BF },
220 : : { G_UNICODE_SCRIPT_HIRAGANA, 0x309F },
221 : : { G_UNICODE_SCRIPT_KANNADA, 0x0CBC },
222 : : { G_UNICODE_SCRIPT_KATAKANA, 0x30FF },
223 : : { G_UNICODE_SCRIPT_KHMER, 0x17DD },
224 : : { G_UNICODE_SCRIPT_LAO, 0x0EDD },
225 : : { G_UNICODE_SCRIPT_LATIN, 0x0061 },
226 : : { G_UNICODE_SCRIPT_MALAYALAM, 0x0D3D },
227 : : { G_UNICODE_SCRIPT_MONGOLIAN, 0x1843 },
228 : : { G_UNICODE_SCRIPT_MYANMAR, 0x1031 },
229 : : { G_UNICODE_SCRIPT_OGHAM, 0x169C },
230 : : { G_UNICODE_SCRIPT_OLD_ITALIC, 0x10322 },
231 : : { G_UNICODE_SCRIPT_ORIYA, 0x0B3C },
232 : : { G_UNICODE_SCRIPT_RUNIC, 0x16EF },
233 : : { G_UNICODE_SCRIPT_SINHALA, 0x0DBD },
234 : : { G_UNICODE_SCRIPT_SYRIAC, 0x0711 },
235 : : { G_UNICODE_SCRIPT_TAMIL, 0x0B82 },
236 : : { G_UNICODE_SCRIPT_TELUGU, 0x0C03 },
237 : : { G_UNICODE_SCRIPT_THAANA, 0x07B1 },
238 : : { G_UNICODE_SCRIPT_THAI, 0x0E31 },
239 : : { G_UNICODE_SCRIPT_TIBETAN, 0x0FD4 },
240 : : { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, 0x1400 },
241 : : { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, 0x1401 },
242 : : { G_UNICODE_SCRIPT_YI, 0xA015 },
243 : : { G_UNICODE_SCRIPT_TAGALOG, 0x1700 },
244 : : { G_UNICODE_SCRIPT_HANUNOO, 0x1720 },
245 : : { G_UNICODE_SCRIPT_BUHID, 0x1740 },
246 : : { G_UNICODE_SCRIPT_TAGBANWA, 0x1760 },
247 : : { G_UNICODE_SCRIPT_BRAILLE, 0x2800 },
248 : : { G_UNICODE_SCRIPT_CYPRIOT, 0x10808 },
249 : : { G_UNICODE_SCRIPT_LIMBU, 0x1932 },
250 : : { G_UNICODE_SCRIPT_OSMANYA, 0x10480 },
251 : : { G_UNICODE_SCRIPT_SHAVIAN, 0x10450 },
252 : : { G_UNICODE_SCRIPT_LINEAR_B, 0x10000 },
253 : : { G_UNICODE_SCRIPT_TAI_LE, 0x1950 },
254 : : { G_UNICODE_SCRIPT_UGARITIC, 0x1039F },
255 : : { G_UNICODE_SCRIPT_NEW_TAI_LUE, 0x1980 },
256 : : { G_UNICODE_SCRIPT_BUGINESE, 0x1A1F },
257 : : { G_UNICODE_SCRIPT_GLAGOLITIC, 0x2C00 },
258 : : { G_UNICODE_SCRIPT_TIFINAGH, 0x2D6F },
259 : : { G_UNICODE_SCRIPT_SYLOTI_NAGRI, 0xA800 },
260 : : { G_UNICODE_SCRIPT_OLD_PERSIAN, 0x103D0 },
261 : : { G_UNICODE_SCRIPT_KHAROSHTHI, 0x10A3F },
262 : : { G_UNICODE_SCRIPT_UNKNOWN, 0x1111111 },
263 : : { G_UNICODE_SCRIPT_BALINESE, 0x1B04 },
264 : : { G_UNICODE_SCRIPT_CUNEIFORM, 0x12000 },
265 : : { G_UNICODE_SCRIPT_PHOENICIAN, 0x10900 },
266 : : { G_UNICODE_SCRIPT_PHAGS_PA, 0xA840 },
267 : : { G_UNICODE_SCRIPT_NKO, 0x07C0 },
268 : : { G_UNICODE_SCRIPT_KAYAH_LI, 0xA900 },
269 : : { G_UNICODE_SCRIPT_LEPCHA, 0x1C00 },
270 : : { G_UNICODE_SCRIPT_REJANG, 0xA930 },
271 : : { G_UNICODE_SCRIPT_SUNDANESE, 0x1B80 },
272 : : { G_UNICODE_SCRIPT_SAURASHTRA, 0xA880 },
273 : : { G_UNICODE_SCRIPT_CHAM, 0xAA00 },
274 : : { G_UNICODE_SCRIPT_OL_CHIKI, 0x1C50 },
275 : : { G_UNICODE_SCRIPT_VAI, 0xA500 },
276 : : { G_UNICODE_SCRIPT_CARIAN, 0x102A0 },
277 : : { G_UNICODE_SCRIPT_LYCIAN, 0x10280 },
278 : : { G_UNICODE_SCRIPT_LYDIAN, 0x1093F },
279 : : { G_UNICODE_SCRIPT_AVESTAN, 0x10B00 },
280 : : { G_UNICODE_SCRIPT_BAMUM, 0xA6A0 },
281 : : { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, 0x13000 },
282 : : { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, 0x10840 },
283 : : { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, 0x10B60 },
284 : : { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, 0x10B40 },
285 : : { G_UNICODE_SCRIPT_JAVANESE, 0xA980 },
286 : : { G_UNICODE_SCRIPT_KAITHI, 0x11082 },
287 : : { G_UNICODE_SCRIPT_LISU, 0xA4D0 },
288 : : { G_UNICODE_SCRIPT_MEETEI_MAYEK, 0xABE5 },
289 : : { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, 0x10A60 },
290 : : { G_UNICODE_SCRIPT_OLD_TURKIC, 0x10C00 },
291 : : { G_UNICODE_SCRIPT_SAMARITAN, 0x0800 },
292 : : { G_UNICODE_SCRIPT_TAI_THAM, 0x1A20 },
293 : : { G_UNICODE_SCRIPT_TAI_VIET, 0xAA80 },
294 : : { G_UNICODE_SCRIPT_BATAK, 0x1BC0 },
295 : : { G_UNICODE_SCRIPT_BRAHMI, 0x11000 },
296 : : { G_UNICODE_SCRIPT_MANDAIC, 0x0840 },
297 : : { G_UNICODE_SCRIPT_CHAKMA, 0x11100 },
298 : : { G_UNICODE_SCRIPT_MEROITIC_CURSIVE, 0x109A0 },
299 : : { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, 0x10980 },
300 : : { G_UNICODE_SCRIPT_MIAO, 0x16F00 },
301 : : { G_UNICODE_SCRIPT_SHARADA, 0x11180 },
302 : : { G_UNICODE_SCRIPT_SORA_SOMPENG, 0x110D0 },
303 : : { G_UNICODE_SCRIPT_TAKRI, 0x11680 },
304 : : { G_UNICODE_SCRIPT_BASSA_VAH, 0x16AD0 },
305 : : { G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN, 0x10530 },
306 : : { G_UNICODE_SCRIPT_DUPLOYAN, 0x1BC00 },
307 : : { G_UNICODE_SCRIPT_ELBASAN, 0x10500 },
308 : : { G_UNICODE_SCRIPT_GRANTHA, 0x11301 },
309 : : { G_UNICODE_SCRIPT_KHOJKI, 0x11200 },
310 : : { G_UNICODE_SCRIPT_KHUDAWADI, 0x112B0 },
311 : : { G_UNICODE_SCRIPT_LINEAR_A, 0x10600 },
312 : : { G_UNICODE_SCRIPT_MAHAJANI, 0x11150 },
313 : : { G_UNICODE_SCRIPT_MANICHAEAN, 0x10AC0 },
314 : : { G_UNICODE_SCRIPT_MENDE_KIKAKUI, 0x1E800 },
315 : : { G_UNICODE_SCRIPT_MODI, 0x11600 },
316 : : { G_UNICODE_SCRIPT_MRO, 0x16A40 },
317 : : { G_UNICODE_SCRIPT_NABATAEAN, 0x10880 },
318 : : { G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN, 0x10A80 },
319 : : { G_UNICODE_SCRIPT_OLD_PERMIC, 0x10350 },
320 : : { G_UNICODE_SCRIPT_PAHAWH_HMONG, 0x16B00 },
321 : : { G_UNICODE_SCRIPT_PALMYRENE, 0x10860 },
322 : : { G_UNICODE_SCRIPT_PAU_CIN_HAU, 0x11AC0 },
323 : : { G_UNICODE_SCRIPT_PSALTER_PAHLAVI, 0x10B80 },
324 : : { G_UNICODE_SCRIPT_SIDDHAM, 0x11580 },
325 : : { G_UNICODE_SCRIPT_TIRHUTA, 0x11480 },
326 : : { G_UNICODE_SCRIPT_WARANG_CITI, 0x118A0 },
327 : : { G_UNICODE_SCRIPT_CHEROKEE, 0x0AB71 },
328 : : { G_UNICODE_SCRIPT_HATRAN, 0x108E0 },
329 : : { G_UNICODE_SCRIPT_OLD_HUNGARIAN, 0x10C80 },
330 : : { G_UNICODE_SCRIPT_MULTANI, 0x11280 },
331 : : { G_UNICODE_SCRIPT_AHOM, 0x11700 },
332 : : { G_UNICODE_SCRIPT_CUNEIFORM, 0x12480 },
333 : : { G_UNICODE_SCRIPT_ANATOLIAN_HIEROGLYPHS, 0x14400 },
334 : : { G_UNICODE_SCRIPT_SIGNWRITING, 0x1D800 },
335 : : { G_UNICODE_SCRIPT_ADLAM, 0x1E900 },
336 : : { G_UNICODE_SCRIPT_BHAIKSUKI, 0x11C00 },
337 : : { G_UNICODE_SCRIPT_MARCHEN, 0x11C70 },
338 : : { G_UNICODE_SCRIPT_NEWA, 0x11400 },
339 : : { G_UNICODE_SCRIPT_OSAGE, 0x104B0 },
340 : : { G_UNICODE_SCRIPT_TANGUT, 0x16FE0 },
341 : : { G_UNICODE_SCRIPT_MASARAM_GONDI, 0x11D00 },
342 : : { G_UNICODE_SCRIPT_NUSHU, 0x1B170 },
343 : : { G_UNICODE_SCRIPT_SOYOMBO, 0x11A50 },
344 : : { G_UNICODE_SCRIPT_ZANABAZAR_SQUARE, 0x11A00 },
345 : : { G_UNICODE_SCRIPT_DOGRA, 0x11800 },
346 : : { G_UNICODE_SCRIPT_GUNJALA_GONDI, 0x11D60 },
347 : : { G_UNICODE_SCRIPT_HANIFI_ROHINGYA, 0x10D00 },
348 : : { G_UNICODE_SCRIPT_MAKASAR, 0x11EE0 },
349 : : { G_UNICODE_SCRIPT_MEDEFAIDRIN, 0x16E40 },
350 : : { G_UNICODE_SCRIPT_OLD_SOGDIAN, 0x10F00 },
351 : : { G_UNICODE_SCRIPT_SOGDIAN, 0x10F30 },
352 : : { G_UNICODE_SCRIPT_ELYMAIC, 0x10FE0 },
353 : : { G_UNICODE_SCRIPT_NANDINAGARI, 0x119A0 },
354 : : { G_UNICODE_SCRIPT_NYIAKENG_PUACHUE_HMONG, 0x1E100 },
355 : : { G_UNICODE_SCRIPT_WANCHO, 0x1E2C0 },
356 : : { G_UNICODE_SCRIPT_CHORASMIAN, 0x10FB0 },
357 : : { G_UNICODE_SCRIPT_DIVES_AKURU, 0x11900 },
358 : : { G_UNICODE_SCRIPT_KHITAN_SMALL_SCRIPT, 0x18B00 },
359 : : { G_UNICODE_SCRIPT_YEZIDI, 0x10E80 },
360 : : { G_UNICODE_SCRIPT_CYPRO_MINOAN, 0x12F90 },
361 : : { G_UNICODE_SCRIPT_OLD_UYGHUR, 0x10F70 },
362 : : { G_UNICODE_SCRIPT_TANGSA, 0x16A70 },
363 : : { G_UNICODE_SCRIPT_TOTO, 0x1E290 },
364 : : { G_UNICODE_SCRIPT_VITHKUQI, 0x10570 },
365 : : { G_UNICODE_SCRIPT_KAWI, 0x11F00 },
366 : : { G_UNICODE_SCRIPT_NAG_MUNDARI, 0x1E4D0 },
367 : : };
368 [ + + ]: 169 : for (i = 0; i < G_N_ELEMENTS (examples); i++)
369 : 168 : g_assert_cmpint (g_unichar_get_script (examples[i].c), ==, examples[i].script);
370 : 1 : }
371 : :
372 : : /* Test that g_unichar_combining_class() returns the correct value for
373 : : * various ASCII and Unicode alphabetic, numeric, and other, codepoints. */
374 : : static void
375 : 1 : test_combining_class (void)
376 : : {
377 : : guint i;
378 : : struct {
379 : : gint class;
380 : : gunichar c;
381 : 1 : } examples[] = {
382 : : { 0, 0x0020 },
383 : : { 1, 0x0334 },
384 : : { 7, 0x093C },
385 : : { 8, 0x3099 },
386 : : { 9, 0x094D },
387 : : { 10, 0x05B0 },
388 : : { 11, 0x05B1 },
389 : : { 12, 0x05B2 },
390 : : { 13, 0x05B3 },
391 : : { 14, 0x05B4 },
392 : : { 15, 0x05B5 },
393 : : { 16, 0x05B6 },
394 : : { 17, 0x05B7 },
395 : : { 18, 0x05B8 },
396 : : { 19, 0x05B9 },
397 : : { 20, 0x05BB },
398 : : { 21, 0x05BC },
399 : : { 22, 0x05BD },
400 : : { 23, 0x05BF },
401 : : { 24, 0x05C1 },
402 : : { 25, 0x05C2 },
403 : : { 26, 0xFB1E },
404 : : { 27, 0x064B },
405 : : { 28, 0x064C },
406 : : { 29, 0x064D },
407 : : /* ... */
408 : : { 228, 0x05AE },
409 : : { 230, 0x0300 },
410 : : { 232, 0x302C },
411 : : { 233, 0x0362 },
412 : : { 234, 0x0360 },
413 : : { 234, 0x1DCD },
414 : : { 240, 0x0345 }
415 : : };
416 [ + + ]: 33 : for (i = 0; i < G_N_ELEMENTS (examples); i++)
417 : : {
418 : 32 : g_assert_cmpint (g_unichar_combining_class (examples[i].c), ==, examples[i].class);
419 : : }
420 : 1 : }
421 : :
422 : : /* Test that g_unichar_get_mirror() returns the correct value for various
423 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
424 : : static void
425 : 1 : test_mirror (void)
426 : : {
427 : : gunichar mirror;
428 : :
429 : 1 : g_assert_true (g_unichar_get_mirror_char ('(', &mirror));
430 : 1 : g_assert_cmpint (mirror, ==, ')');
431 : 1 : g_assert_true (g_unichar_get_mirror_char (')', &mirror));
432 : 1 : g_assert_cmpint (mirror, ==, '(');
433 : 1 : g_assert_true (g_unichar_get_mirror_char ('{', &mirror));
434 : 1 : g_assert_cmpint (mirror, ==, '}');
435 : 1 : g_assert_true (g_unichar_get_mirror_char ('}', &mirror));
436 : 1 : g_assert_cmpint (mirror, ==, '{');
437 : 1 : g_assert_true (g_unichar_get_mirror_char (0x208D, &mirror));
438 : 1 : g_assert_cmpint (mirror, ==, 0x208E);
439 : 1 : g_assert_true (g_unichar_get_mirror_char (0x208E, &mirror));
440 : 1 : g_assert_cmpint (mirror, ==, 0x208D);
441 : 1 : g_assert_false (g_unichar_get_mirror_char ('a', &mirror));
442 : 1 : }
443 : :
444 : : /* Test that g_utf8_strup() returns the correct value for various
445 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
446 : : static void
447 : 1 : test_strup (void)
448 : : {
449 : 1 : char *str_up = NULL;
450 : 1 : const char *str = "AaZz09x;\x03\x45"
451 : : "\xEF\xBD\x81" /* Unichar 'A' (U+FF21) */
452 : : "\xEF\xBC\xA1"; /* Unichar 'a' (U+FF41) */
453 : :
454 : : /* Testing degenerated cases */
455 [ + - ]: 1 : if (g_test_undefined ())
456 : : {
457 : 1 : g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
458 : : "*assertion*!= NULL*");
459 : 1 : str_up = g_utf8_strup (NULL, 0);
460 : 1 : g_test_assert_expected_messages ();
461 : : }
462 : :
463 : 1 : str_up = g_utf8_strup (str, strlen (str));
464 : : /* Tricky, comparing two unicode strings with an ASCII function */
465 : 1 : g_assert_cmpstr (str_up, ==, "AAZZ09X;\003E\357\274\241\357\274\241");
466 : 1 : g_free (str_up);
467 : :
468 : 1 : str_up = g_utf8_strup ("", 0);
469 : 1 : g_assert_cmpstr (str_up, ==, "");
470 : 1 : g_free (str_up);
471 : 1 : }
472 : :
473 : : /* Test that g_utf8_strdown() returns the correct value for various
474 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
475 : : static void
476 : 1 : test_strdown (void)
477 : : {
478 : 1 : char *str_down = NULL;
479 : 1 : const char *str = "AaZz09x;\x03\x07"
480 : : "\xEF\xBD\x81" /* Unichar 'A' (U+FF21) */
481 : : "\xEF\xBC\xA1"; /* Unichar 'a' (U+FF41) */
482 : :
483 : : /* Testing degenerated cases */
484 [ + - ]: 1 : if (g_test_undefined ())
485 : : {
486 : 1 : g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
487 : : "*assertion*!= NULL*");
488 : 1 : str_down = g_utf8_strdown (NULL, 0);
489 : 1 : g_test_assert_expected_messages ();
490 : : }
491 : :
492 : 1 : str_down = g_utf8_strdown (str, strlen (str));
493 : : /* Tricky, comparing two unicode strings with an ASCII function */
494 : 1 : g_assert_cmpstr (str_down, ==, "aazz09x;\003\007\357\275\201\357\275\201");
495 : 1 : g_free (str_down);
496 : :
497 : 1 : str_down = g_utf8_strdown ("", 0);
498 : 1 : g_assert_cmpstr (str_down, ==, "");
499 : 1 : g_free (str_down);
500 : 1 : }
501 : :
502 : : /* Test that g_utf8_strup() and g_utf8_strdown() return the correct
503 : : * value for Turkish 'i' with and without dot above. */
504 : : static void
505 : 1 : test_turkish_strupdown (void)
506 : : {
507 : 1 : char *str_up = NULL;
508 : 1 : char *str_down = NULL;
509 : 1 : const char *str = "iII"
510 : : "\xcc\x87" /* COMBINING DOT ABOVE (U+307) */
511 : : "\xc4\xb1" /* LATIN SMALL LETTER DOTLESS I (U+131) */
512 : : "\xc4\xb0"; /* LATIN CAPITAL LETTER I WITH DOT ABOVE (U+130) */
513 : : char *oldlocale;
514 : : char *old_lc_all, *old_lc_messages, *old_lang;
515 : : #ifdef G_OS_WIN32
516 : : LCID old_lcid;
517 : : #endif
518 : :
519 : : /* interferes with g_win32_getlocale() */
520 : 1 : save_and_clear_env ("LC_ALL", &old_lc_all);
521 : 1 : save_and_clear_env ("LC_MESSAGES", &old_lc_messages);
522 : 1 : save_and_clear_env ("LANG", &old_lang);
523 : :
524 : 1 : oldlocale = g_strdup (setlocale (LC_ALL, "tr_TR"));
525 [ - + ]: 1 : if (oldlocale == NULL)
526 : : {
527 : 0 : g_test_skip ("locale tr_TR not available");
528 : 0 : return;
529 : : }
530 : :
531 : : #ifdef G_OS_WIN32
532 : : old_lcid = GetThreadLocale ();
533 : : SetThreadLocale (MAKELCID (MAKELANGID (LANG_TURKISH, SUBLANG_TURKISH_TURKEY), SORT_DEFAULT));
534 : : #endif
535 : :
536 : 1 : str_up = g_utf8_strup (str, strlen (str));
537 : 1 : str_down = g_utf8_strdown (str, strlen (str));
538 : : /* i => LATIN CAPITAL LETTER I WITH DOT ABOVE,
539 : : * I => I,
540 : : * I + COMBINING DOT ABOVE => I + COMBINING DOT ABOVE,
541 : : * LATIN SMALL LETTER DOTLESS I => I,
542 : : * LATIN CAPITAL LETTER I WITH DOT ABOVE => LATIN CAPITAL LETTER I WITH DOT ABOVE */
543 : 1 : g_assert_cmpstr (str_up, ==, "\xc4\xb0II\xcc\x87I\xc4\xb0");
544 : : /* i => i,
545 : : * I => LATIN SMALL LETTER DOTLESS I,
546 : : * I + COMBINING DOT ABOVE => i,
547 : : * LATIN SMALL LETTER DOTLESS I => LATIN SMALL LETTER DOTLESS I,
548 : : * LATIN CAPITAL LETTER I WITH DOT ABOVE => i */
549 : 1 : g_assert_cmpstr (str_down, ==, "i\xc4\xb1i\xc4\xb1i");
550 : 1 : g_free (str_up);
551 : 1 : g_free (str_down);
552 : :
553 : 1 : setlocale (LC_ALL, oldlocale);
554 : : #ifdef G_OS_WIN32
555 : : SetThreadLocale (old_lcid);
556 : : #endif
557 : 1 : g_free (oldlocale);
558 [ - + ]: 1 : if (old_lc_all)
559 : 0 : g_setenv ("LC_ALL", old_lc_all, TRUE);
560 [ - + ]: 1 : if (old_lc_messages)
561 : 0 : g_setenv ("LC_MESSAGES", old_lc_messages, TRUE);
562 [ + - ]: 1 : if (old_lang)
563 : 1 : g_setenv ("LANG", old_lang, TRUE);
564 : 1 : g_free (old_lc_all);
565 : 1 : g_free (old_lc_messages);
566 : 1 : g_free (old_lang);
567 : : }
568 : :
569 : : /* Test that g_utf8_casefold() returns the correct value for various
570 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
571 : : static void
572 : 1 : test_casefold (void)
573 : : {
574 : 1 : char *str_casefold = NULL;
575 : 1 : const char *str = "AaZz09x;"
576 : : "\xEF\xBD\x81" /* Unichar 'A' (U+FF21) */
577 : : "\xEF\xBC\xA1"; /* Unichar 'a' (U+FF41) */
578 : :
579 : : /* Testing degenerated cases */
580 [ + - ]: 1 : if (g_test_undefined ())
581 : : {
582 : 1 : g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
583 : : "*assertion*!= NULL*");
584 : 1 : str_casefold = g_utf8_casefold (NULL, 0);
585 : 1 : g_test_assert_expected_messages ();
586 : : }
587 : :
588 : 1 : str_casefold = g_utf8_casefold (str, strlen (str));
589 : : /* Tricky, comparing two unicode strings with an ASCII function */
590 : 1 : g_assert_cmpstr (str_casefold, ==, "aazz09x;\357\275\201\357\275\201");
591 : 1 : g_free (str_casefold);
592 : :
593 : 1 : str_casefold = g_utf8_casefold ("", 0);
594 : 1 : g_assert_cmpstr (str_casefold, ==, "");
595 : 1 : g_free (str_casefold);
596 : 1 : }
597 : :
598 : : static void
599 : 1 : test_casemap_and_casefold (void)
600 : : {
601 : : FILE *infile;
602 : : char buffer[1024];
603 : : char **strings;
604 : : char *filename;
605 : : const char *locale;
606 : : const char *test;
607 : : const char *expected;
608 : : char *convert;
609 : 1 : char *current_locale = setlocale (LC_CTYPE, NULL);
610 : : char *old_lc_all, *old_lc_messages, *old_lang;
611 : : #ifdef G_OS_WIN32
612 : : LCID old_lcid;
613 : :
614 : : old_lcid = GetThreadLocale ();
615 : : #endif
616 : :
617 : : /* interferes with g_win32_getlocale() */
618 : 1 : save_and_clear_env ("LC_ALL", &old_lc_all);
619 : 1 : save_and_clear_env ("LC_MESSAGES", &old_lc_messages);
620 : 1 : save_and_clear_env ("LANG", &old_lang);
621 : :
622 : 1 : filename = g_test_build_filename (G_TEST_DIST, "casemap.txt", NULL);
623 : 1 : infile = fopen (filename, "r");
624 : 1 : g_assert (infile != NULL);
625 : :
626 [ + + ]: 4142 : while (fgets (buffer, sizeof (buffer), infile))
627 : : {
628 [ + + ]: 4141 : if (buffer[0] == '#')
629 : 13 : continue;
630 : :
631 : 4128 : strings = g_strsplit (buffer, "\t", -1);
632 : 4128 : locale = strings[0];
633 [ + + ]: 4128 : if (!locale[0])
634 : 4100 : locale = "C";
635 : :
636 [ + + ]: 4128 : if (strcmp (locale, current_locale) != 0)
637 : : {
638 : 6 : setlocale (LC_CTYPE, locale);
639 : 6 : current_locale = setlocale (LC_CTYPE, NULL);
640 : :
641 [ - + ]: 6 : if (strncmp (current_locale, locale, 2) != 0)
642 : : {
643 : 0 : g_test_message ("Cannot set locale to %s, skipping", locale);
644 : 0 : goto next;
645 : : }
646 : : }
647 : :
648 : : #ifdef G_OS_WIN32
649 : : if (strstr (locale, "lt_LT"))
650 : : SetThreadLocale (MAKELCID (MAKELANGID (LANG_LITHUANIAN, SUBLANG_LITHUANIAN), SORT_DEFAULT));
651 : : else if (strstr (locale, "tr_TR"))
652 : : SetThreadLocale (MAKELCID (MAKELANGID (LANG_TURKISH, SUBLANG_TURKISH_TURKEY), SORT_DEFAULT));
653 : : else
654 : : SetThreadLocale (old_lcid);
655 : : #endif
656 : :
657 : 4128 : test = strings[1];
658 : :
659 : : /* gen-casemap-txt.py uses an empty string when a single
660 : : * character doesn't have an equivalent in a particular case;
661 : : * since that behavior is nonsense for multicharacter strings,
662 : : * it would make more sense to put the expected result ... the
663 : : * original character unchanged. But for now, we just work
664 : : * around it here and take the empty string to mean "same as
665 : : * original"
666 : : */
667 : :
668 : 4128 : convert = g_utf8_strup (test, -1);
669 [ + + ]: 4128 : expected = strings[4][0] ? strings[4] : test;
670 : 4128 : g_assert_cmpstr (convert, ==, expected);
671 : 4128 : g_free (convert);
672 : :
673 : 4128 : convert = g_utf8_strdown (test, -1);
674 [ + + ]: 4128 : expected = strings[2][0] ? strings[2] : test;
675 : 4128 : g_assert_cmpstr (convert, ==, expected);
676 : 4128 : g_free (convert);
677 : :
678 : 4128 : next:
679 : 4128 : g_strfreev (strings);
680 : : }
681 : :
682 : 1 : fclose (infile);
683 : :
684 : 1 : g_free (filename);
685 : 1 : filename = g_test_build_filename (G_TEST_DIST, "casefold.txt", NULL);
686 : :
687 : 1 : infile = fopen (filename, "r");
688 : 1 : g_assert (infile != NULL);
689 : :
690 [ + + ]: 1540 : while (fgets (buffer, sizeof (buffer), infile))
691 : : {
692 [ + + ]: 1539 : if (buffer[0] == '#')
693 : 8 : continue;
694 : :
695 : 1531 : buffer[strlen (buffer) - 1] = '\0';
696 : 1531 : strings = g_strsplit (buffer, "\t", -1);
697 : :
698 : 1531 : test = strings[0];
699 : :
700 : 1531 : convert = g_utf8_casefold (test, -1);
701 : 1531 : g_assert_cmpstr (convert, ==, strings[1]);
702 : 1531 : g_free (convert);
703 : :
704 : 1531 : g_strfreev (strings);
705 : : }
706 : :
707 : 1 : fclose (infile);
708 : 1 : g_free (filename);
709 : :
710 [ - + ]: 1 : if (old_lc_all)
711 : 0 : g_setenv ("LC_ALL", old_lc_all, TRUE);
712 [ - + ]: 1 : if (old_lc_messages)
713 : 0 : g_setenv ("LC_MESSAGES", old_lc_messages, TRUE);
714 [ + - ]: 1 : if (old_lang)
715 : 1 : g_setenv ("LANG", old_lang, TRUE);
716 : 1 : g_free (old_lc_all);
717 : 1 : g_free (old_lc_messages);
718 : 1 : g_free (old_lang);
719 : : #ifdef G_OS_WIN32
720 : : SetThreadLocale (old_lcid);
721 : : #endif
722 : 1 : }
723 : :
724 : : /* Test that g_unichar_ismark() returns the correct value for various
725 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
726 : : static void
727 : 1 : test_mark (void)
728 : : {
729 : 1 : g_assert_true (g_unichar_ismark (0x0903));
730 : 1 : g_assert_true (g_unichar_ismark (0x20DD));
731 : 1 : g_assert_true (g_unichar_ismark (0xA806));
732 : 1 : g_assert_false (g_unichar_ismark ('a'));
733 : :
734 : : /*** Testing TYPE() border cases ***/
735 : 1 : g_assert_false (g_unichar_ismark (0x3FF5));
736 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
737 : 1 : g_assert_false (g_unichar_ismark (0xFFEFF));
738 : : /* U+E0001 Language Tag */
739 : 1 : g_assert_false (g_unichar_ismark (0xE0001));
740 : 1 : g_assert_false (g_unichar_ismark (G_UNICODE_LAST_CHAR));
741 : 1 : g_assert_false (g_unichar_ismark (G_UNICODE_LAST_CHAR + 1));
742 : 1 : g_assert_false (g_unichar_ismark (G_UNICODE_LAST_CHAR_PART1));
743 : 1 : g_assert_false (g_unichar_ismark (G_UNICODE_LAST_CHAR_PART1 + 1));
744 : 1 : }
745 : :
746 : : /* Test that g_unichar_isspace() returns the correct value for various
747 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
748 : : static void
749 : 1 : test_space (void)
750 : : {
751 : 1 : g_assert_false (g_unichar_isspace ('a'));
752 : 1 : g_assert_true (g_unichar_isspace (' '));
753 : 1 : g_assert_true (g_unichar_isspace ('\t'));
754 : 1 : g_assert_true (g_unichar_isspace ('\n'));
755 : 1 : g_assert_true (g_unichar_isspace ('\r'));
756 : 1 : g_assert_true (g_unichar_isspace ('\f'));
757 : 1 : g_assert_false (g_unichar_isspace (0xff41)); /* Unicode fullwidth 'a' */
758 : 1 : g_assert_true (g_unichar_isspace (0x202F)); /* Unicode space separator */
759 : 1 : g_assert_true (g_unichar_isspace (0x2028)); /* Unicode line separator */
760 : 1 : g_assert_true (g_unichar_isspace (0x2029)); /* Unicode paragraph separator */
761 : :
762 : : /*** Testing TYPE() border cases ***/
763 : 1 : g_assert_false (g_unichar_isspace (0x3FF5));
764 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
765 : 1 : g_assert_false (g_unichar_isspace (0xFFEFF));
766 : : /* U+E0001 Language Tag */
767 : 1 : g_assert_false (g_unichar_isspace (0xE0001));
768 : 1 : g_assert_false (g_unichar_isspace (G_UNICODE_LAST_CHAR));
769 : 1 : g_assert_false (g_unichar_isspace (G_UNICODE_LAST_CHAR + 1));
770 : 1 : g_assert_false (g_unichar_isspace (G_UNICODE_LAST_CHAR_PART1));
771 : 1 : g_assert_false (g_unichar_isspace (G_UNICODE_LAST_CHAR_PART1 + 1));
772 : 1 : }
773 : :
774 : : /* Test that g_unichar_isalnum() returns the correct value for various
775 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
776 : : static void
777 : 1 : test_alnum (void)
778 : : {
779 : 1 : g_assert_false (g_unichar_isalnum (' '));
780 : 1 : g_assert_true (g_unichar_isalnum ('a'));
781 : 1 : g_assert_true (g_unichar_isalnum ('z'));
782 : 1 : g_assert_true (g_unichar_isalnum ('0'));
783 : 1 : g_assert_true (g_unichar_isalnum ('9'));
784 : 1 : g_assert_true (g_unichar_isalnum ('A'));
785 : 1 : g_assert_true (g_unichar_isalnum ('Z'));
786 : 1 : g_assert_false (g_unichar_isalnum ('-'));
787 : 1 : g_assert_false (g_unichar_isalnum ('*'));
788 : 1 : g_assert_true (g_unichar_isalnum (0xFF21)); /* Unichar fullwidth 'A' */
789 : 1 : g_assert_true (g_unichar_isalnum (0xFF3A)); /* Unichar fullwidth 'Z' */
790 : 1 : g_assert_true (g_unichar_isalnum (0xFF41)); /* Unichar fullwidth 'a' */
791 : 1 : g_assert_true (g_unichar_isalnum (0xFF5A)); /* Unichar fullwidth 'z' */
792 : 1 : g_assert_true (g_unichar_isalnum (0xFF10)); /* Unichar fullwidth '0' */
793 : 1 : g_assert_true (g_unichar_isalnum (0xFF19)); /* Unichar fullwidth '9' */
794 : 1 : g_assert_false (g_unichar_isalnum (0xFF0A)); /* Unichar fullwidth '*' */
795 : :
796 : : /*** Testing TYPE() border cases ***/
797 : 1 : g_assert_true (g_unichar_isalnum (0x3FF5));
798 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
799 : 1 : g_assert_false (g_unichar_isalnum (0xFFEFF));
800 : : /* U+E0001 Language Tag */
801 : 1 : g_assert_false (g_unichar_isalnum (0xE0001));
802 : 1 : g_assert_false (g_unichar_isalnum (G_UNICODE_LAST_CHAR));
803 : 1 : g_assert_false (g_unichar_isalnum (G_UNICODE_LAST_CHAR + 1));
804 : 1 : g_assert_false (g_unichar_isalnum (G_UNICODE_LAST_CHAR_PART1));
805 : 1 : g_assert_false (g_unichar_isalnum (G_UNICODE_LAST_CHAR_PART1 + 1));
806 : 1 : }
807 : :
808 : : /* Test that g_unichar_isalpha() returns the correct value for various
809 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
810 : : static void
811 : 1 : test_alpha (void)
812 : : {
813 : 1 : g_assert_false (g_unichar_isalpha (' '));
814 : 1 : g_assert_true (g_unichar_isalpha ('a'));
815 : 1 : g_assert_true (g_unichar_isalpha ('z'));
816 : 1 : g_assert_false (g_unichar_isalpha ('0'));
817 : 1 : g_assert_false (g_unichar_isalpha ('9'));
818 : 1 : g_assert_true (g_unichar_isalpha ('A'));
819 : 1 : g_assert_true (g_unichar_isalpha ('Z'));
820 : 1 : g_assert_false (g_unichar_isalpha ('-'));
821 : 1 : g_assert_false (g_unichar_isalpha ('*'));
822 : 1 : g_assert_true (g_unichar_isalpha (0xFF21)); /* Unichar fullwidth 'A' */
823 : 1 : g_assert_true (g_unichar_isalpha (0xFF3A)); /* Unichar fullwidth 'Z' */
824 : 1 : g_assert_true (g_unichar_isalpha (0xFF41)); /* Unichar fullwidth 'a' */
825 : 1 : g_assert_true (g_unichar_isalpha (0xFF5A)); /* Unichar fullwidth 'z' */
826 : 1 : g_assert_false (g_unichar_isalpha (0xFF10)); /* Unichar fullwidth '0' */
827 : 1 : g_assert_false (g_unichar_isalpha (0xFF19)); /* Unichar fullwidth '9' */
828 : 1 : g_assert_false (g_unichar_isalpha (0xFF0A)); /* Unichar fullwidth '*' */
829 : :
830 : : /*** Testing TYPE() border cases ***/
831 : 1 : g_assert_true (g_unichar_isalpha (0x3FF5));
832 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
833 : 1 : g_assert_false (g_unichar_isalpha (0xFFEFF));
834 : : /* U+E0001 Language Tag */
835 : 1 : g_assert_false (g_unichar_isalpha (0xE0001));
836 : 1 : g_assert_false (g_unichar_isalpha (G_UNICODE_LAST_CHAR));
837 : 1 : g_assert_false (g_unichar_isalpha (G_UNICODE_LAST_CHAR + 1));
838 : 1 : g_assert_false (g_unichar_isalpha (G_UNICODE_LAST_CHAR_PART1));
839 : 1 : g_assert_false (g_unichar_isalpha (G_UNICODE_LAST_CHAR_PART1 + 1));
840 : 1 : }
841 : :
842 : : /* Test that g_unichar_isdigit() returns the correct value for various
843 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
844 : : static void
845 : 1 : test_digit (void)
846 : : {
847 : 1 : g_assert_false (g_unichar_isdigit (' '));
848 : 1 : g_assert_false (g_unichar_isdigit ('a'));
849 : 1 : g_assert_true (g_unichar_isdigit ('0'));
850 : 1 : g_assert_true (g_unichar_isdigit ('9'));
851 : 1 : g_assert_false (g_unichar_isdigit ('A'));
852 : 1 : g_assert_false (g_unichar_isdigit ('-'));
853 : 1 : g_assert_false (g_unichar_isdigit ('*'));
854 : 1 : g_assert_false (g_unichar_isdigit (0xFF21)); /* Unichar fullwidth 'A' */
855 : 1 : g_assert_false (g_unichar_isdigit (0xFF3A)); /* Unichar fullwidth 'Z' */
856 : 1 : g_assert_false (g_unichar_isdigit (0xFF41)); /* Unichar fullwidth 'a' */
857 : 1 : g_assert_false (g_unichar_isdigit (0xFF5A)); /* Unichar fullwidth 'z' */
858 : 1 : g_assert_true (g_unichar_isdigit (0xFF10)); /* Unichar fullwidth '0' */
859 : 1 : g_assert_true (g_unichar_isdigit (0xFF19)); /* Unichar fullwidth '9' */
860 : 1 : g_assert_false (g_unichar_isdigit (0xFF0A)); /* Unichar fullwidth '*' */
861 : :
862 : : /*** Testing TYPE() border cases ***/
863 : 1 : g_assert_false (g_unichar_isdigit (0x3FF5));
864 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
865 : 1 : g_assert_false (g_unichar_isdigit (0xFFEFF));
866 : : /* U+E0001 Language Tag */
867 : 1 : g_assert_false (g_unichar_isdigit (0xE0001));
868 : 1 : g_assert_false (g_unichar_isdigit (G_UNICODE_LAST_CHAR));
869 : 1 : g_assert_false (g_unichar_isdigit (G_UNICODE_LAST_CHAR + 1));
870 : 1 : g_assert_false (g_unichar_isdigit (G_UNICODE_LAST_CHAR_PART1));
871 : 1 : g_assert_false (g_unichar_isdigit (G_UNICODE_LAST_CHAR_PART1 + 1));
872 : 1 : }
873 : :
874 : : /* Test that g_unichar_digit_value() returns the correct value for various
875 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
876 : : static void
877 : 1 : test_digit_value (void)
878 : : {
879 : 1 : g_assert_cmpint (g_unichar_digit_value (' '), ==, -1);
880 : 1 : g_assert_cmpint (g_unichar_digit_value ('a'), ==, -1);
881 : 1 : g_assert_cmpint (g_unichar_digit_value ('0'), ==, 0);
882 : 1 : g_assert_cmpint (g_unichar_digit_value ('9'), ==, 9);
883 : 1 : g_assert_cmpint (g_unichar_digit_value ('A'), ==, -1);
884 : 1 : g_assert_cmpint (g_unichar_digit_value ('-'), ==, -1);
885 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF21), ==, -1); /* Unichar 'A' */
886 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF3A), ==, -1); /* Unichar 'Z' */
887 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF41), ==, -1); /* Unichar 'a' */
888 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF5A), ==, -1); /* Unichar 'z' */
889 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF10), ==, 0); /* Unichar '0' */
890 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF19), ==, 9); /* Unichar '9' */
891 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFF0A), ==, -1); /* Unichar '*' */
892 : :
893 : : /*** Testing TYPE() border cases ***/
894 : 1 : g_assert_cmpint (g_unichar_digit_value (0x3FF5), ==, -1);
895 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
896 : 1 : g_assert_cmpint (g_unichar_digit_value (0xFFEFF), ==, -1);
897 : : /* U+E0001 Language Tag */
898 : 1 : g_assert_cmpint (g_unichar_digit_value (0xE0001), ==, -1);
899 : 1 : g_assert_cmpint (g_unichar_digit_value (G_UNICODE_LAST_CHAR), ==, -1);
900 : 1 : g_assert_cmpint (g_unichar_digit_value (G_UNICODE_LAST_CHAR + 1), ==, -1);
901 : 1 : g_assert_cmpint (g_unichar_digit_value (G_UNICODE_LAST_CHAR_PART1), ==, -1);
902 : 1 : g_assert_cmpint (g_unichar_digit_value (G_UNICODE_LAST_CHAR_PART1 + 1), ==, -1);
903 : 1 : }
904 : :
905 : : /* Test that g_unichar_isxdigit() returns the correct value for various
906 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
907 : : static void
908 : 1 : test_xdigit (void)
909 : : {
910 : 1 : g_assert_false (g_unichar_isxdigit (' '));
911 : 1 : g_assert_true (g_unichar_isxdigit ('a'));
912 : 1 : g_assert_true (g_unichar_isxdigit ('f'));
913 : 1 : g_assert_false (g_unichar_isxdigit ('g'));
914 : 1 : g_assert_false (g_unichar_isxdigit ('z'));
915 : 1 : g_assert_true (g_unichar_isxdigit ('0'));
916 : 1 : g_assert_true (g_unichar_isxdigit ('9'));
917 : 1 : g_assert_true (g_unichar_isxdigit ('A'));
918 : 1 : g_assert_true (g_unichar_isxdigit ('F'));
919 : 1 : g_assert_false (g_unichar_isxdigit ('G'));
920 : 1 : g_assert_false (g_unichar_isxdigit ('Z'));
921 : 1 : g_assert_false (g_unichar_isxdigit ('-'));
922 : 1 : g_assert_false (g_unichar_isxdigit ('*'));
923 : 1 : g_assert_true (g_unichar_isxdigit (0xFF21)); /* Unichar fullwidth 'A' */
924 : 1 : g_assert_true (g_unichar_isxdigit (0xFF26)); /* Unichar fullwidth 'F' */
925 : 1 : g_assert_false (g_unichar_isxdigit (0xFF27)); /* Unichar fullwidth 'G' */
926 : 1 : g_assert_false (g_unichar_isxdigit (0xFF3A)); /* Unichar fullwidth 'Z' */
927 : 1 : g_assert_true (g_unichar_isxdigit (0xFF41)); /* Unichar fullwidth 'a' */
928 : 1 : g_assert_true (g_unichar_isxdigit (0xFF46)); /* Unichar fullwidth 'f' */
929 : 1 : g_assert_false (g_unichar_isxdigit (0xFF47)); /* Unichar fullwidth 'g' */
930 : 1 : g_assert_false (g_unichar_isxdigit (0xFF5A)); /* Unichar fullwidth 'z' */
931 : 1 : g_assert_true (g_unichar_isxdigit (0xFF10)); /* Unichar fullwidth '0' */
932 : 1 : g_assert_true (g_unichar_isxdigit (0xFF19)); /* Unichar fullwidth '9' */
933 : 1 : g_assert_false (g_unichar_isxdigit (0xFF0A)); /* Unichar fullwidth '*' */
934 : :
935 : : /*** Testing TYPE() border cases ***/
936 : 1 : g_assert_false (g_unichar_isxdigit (0x3FF5));
937 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
938 : 1 : g_assert_false (g_unichar_isxdigit (0xFFEFF));
939 : : /* U+E0001 Language Tag */
940 : 1 : g_assert_false (g_unichar_isxdigit (0xE0001));
941 : 1 : g_assert_false (g_unichar_isxdigit (G_UNICODE_LAST_CHAR));
942 : 1 : g_assert_false (g_unichar_isxdigit (G_UNICODE_LAST_CHAR + 1));
943 : 1 : g_assert_false (g_unichar_isxdigit (G_UNICODE_LAST_CHAR_PART1));
944 : 1 : g_assert_false (g_unichar_isxdigit (G_UNICODE_LAST_CHAR_PART1 + 1));
945 : 1 : }
946 : :
947 : : /* Test that g_unichar_xdigit_value() returns the correct value for various
948 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
949 : : static void
950 : 1 : test_xdigit_value (void)
951 : : {
952 : 1 : g_assert_cmpint (g_unichar_xdigit_value (' '), ==, -1);
953 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('a'), ==, 10);
954 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('f'), ==, 15);
955 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('g'), ==, -1);
956 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('0'), ==, 0);
957 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('9'), ==, 9);
958 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('A'), ==, 10);
959 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('F'), ==, 15);
960 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('G'), ==, -1);
961 : 1 : g_assert_cmpint (g_unichar_xdigit_value ('-'), ==, -1);
962 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF21), ==, 10); /* Unichar 'A' */
963 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF26), ==, 15); /* Unichar 'F' */
964 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF27), ==, -1); /* Unichar 'G' */
965 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF3A), ==, -1); /* Unichar 'Z' */
966 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF41), ==, 10); /* Unichar 'a' */
967 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF46), ==, 15); /* Unichar 'f' */
968 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF47), ==, -1); /* Unichar 'g' */
969 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF5A), ==, -1); /* Unichar 'z' */
970 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF10), ==, 0); /* Unichar '0' */
971 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF19), ==, 9); /* Unichar '9' */
972 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFF0A), ==, -1); /* Unichar '*' */
973 : :
974 : : /*** Testing TYPE() border cases ***/
975 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0x3FF5), ==, -1);
976 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
977 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xFFEFF), ==, -1);
978 : : /* U+E0001 Language Tag */
979 : 1 : g_assert_cmpint (g_unichar_xdigit_value (0xE0001), ==, -1);
980 : 1 : g_assert_cmpint (g_unichar_xdigit_value (G_UNICODE_LAST_CHAR), ==, -1);
981 : 1 : g_assert_cmpint (g_unichar_xdigit_value (G_UNICODE_LAST_CHAR + 1), ==, -1);
982 : 1 : g_assert_cmpint (g_unichar_xdigit_value (G_UNICODE_LAST_CHAR_PART1), ==, -1);
983 : 1 : g_assert_cmpint (g_unichar_xdigit_value (G_UNICODE_LAST_CHAR_PART1 + 1), ==, -1);
984 : 1 : }
985 : :
986 : : /* Test that g_unichar_ispunct() returns the correct value for various
987 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
988 : : static void
989 : 1 : test_punctuation (void)
990 : : {
991 : 1 : g_assert_false (g_unichar_ispunct (' '));
992 : 1 : g_assert_false (g_unichar_ispunct ('a'));
993 : 1 : g_assert_true (g_unichar_ispunct ('.'));
994 : 1 : g_assert_true (g_unichar_ispunct (','));
995 : 1 : g_assert_true (g_unichar_ispunct (';'));
996 : 1 : g_assert_true (g_unichar_ispunct (':'));
997 : 1 : g_assert_true (g_unichar_ispunct ('-'));
998 : :
999 : 1 : g_assert_false (g_unichar_ispunct (0xFF21)); /* Unichar fullwidth 'A' */
1000 : 1 : g_assert_true (g_unichar_ispunct (0x005F)); /* Unichar fullwidth '.' */
1001 : 1 : g_assert_true (g_unichar_ispunct (0x058A)); /* Unichar fullwidth '-' */
1002 : :
1003 : : /*** Testing TYPE() border cases ***/
1004 : 1 : g_assert_false (g_unichar_ispunct (0x3FF5));
1005 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1006 : 1 : g_assert_false (g_unichar_ispunct (0xFFEFF));
1007 : : /* U+E0001 Language Tag */
1008 : 1 : g_assert_false (g_unichar_ispunct (0xE0001));
1009 : 1 : g_assert_false (g_unichar_ispunct (G_UNICODE_LAST_CHAR));
1010 : 1 : g_assert_false (g_unichar_ispunct (G_UNICODE_LAST_CHAR + 1));
1011 : 1 : g_assert_false (g_unichar_ispunct (G_UNICODE_LAST_CHAR_PART1));
1012 : 1 : g_assert_false (g_unichar_ispunct (G_UNICODE_LAST_CHAR_PART1 + 1));
1013 : 1 : }
1014 : :
1015 : : /* Test that g_unichar_iscntrl() returns the correct value for various
1016 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1017 : : static void
1018 : 1 : test_cntrl (void)
1019 : : {
1020 : 1 : g_assert_true (g_unichar_iscntrl (0x08));
1021 : 1 : g_assert_false (g_unichar_iscntrl ('a'));
1022 : 1 : g_assert_true (g_unichar_iscntrl (0x007F)); /* Unichar fullwidth <del> */
1023 : 1 : g_assert_true (g_unichar_iscntrl (0x009F)); /* Unichar fullwidth control */
1024 : :
1025 : : /*** Testing TYPE() border cases ***/
1026 : 1 : g_assert_false (g_unichar_iscntrl (0x3FF5));
1027 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1028 : 1 : g_assert_false (g_unichar_iscntrl (0xFFEFF));
1029 : : /* U+E0001 Language Tag */
1030 : 1 : g_assert_false (g_unichar_iscntrl (0xE0001));
1031 : 1 : g_assert_false (g_unichar_iscntrl (G_UNICODE_LAST_CHAR));
1032 : 1 : g_assert_false (g_unichar_iscntrl (G_UNICODE_LAST_CHAR + 1));
1033 : 1 : g_assert_false (g_unichar_iscntrl (G_UNICODE_LAST_CHAR_PART1));
1034 : 1 : g_assert_false (g_unichar_iscntrl (G_UNICODE_LAST_CHAR_PART1 + 1));
1035 : 1 : }
1036 : :
1037 : : /* Test that g_unichar_isgraph() returns the correct value for various
1038 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1039 : : static void
1040 : 1 : test_graph (void)
1041 : : {
1042 : 1 : g_assert_false (g_unichar_isgraph (0x08));
1043 : 1 : g_assert_false (g_unichar_isgraph (' '));
1044 : 1 : g_assert_true (g_unichar_isgraph ('a'));
1045 : 1 : g_assert_true (g_unichar_isgraph ('0'));
1046 : 1 : g_assert_true (g_unichar_isgraph ('9'));
1047 : 1 : g_assert_true (g_unichar_isgraph ('A'));
1048 : 1 : g_assert_true (g_unichar_isgraph ('-'));
1049 : 1 : g_assert_true (g_unichar_isgraph ('*'));
1050 : 1 : g_assert_true (g_unichar_isgraph (0xFF21)); /* Unichar fullwidth 'A' */
1051 : 1 : g_assert_true (g_unichar_isgraph (0xFF3A)); /* Unichar fullwidth 'Z' */
1052 : 1 : g_assert_true (g_unichar_isgraph (0xFF41)); /* Unichar fullwidth 'a' */
1053 : 1 : g_assert_true (g_unichar_isgraph (0xFF5A)); /* Unichar fullwidth 'z' */
1054 : 1 : g_assert_true (g_unichar_isgraph (0xFF10)); /* Unichar fullwidth '0' */
1055 : 1 : g_assert_true (g_unichar_isgraph (0xFF19)); /* Unichar fullwidth '9' */
1056 : 1 : g_assert_true (g_unichar_isgraph (0xFF0A)); /* Unichar fullwidth '*' */
1057 : 1 : g_assert_false (g_unichar_isgraph (0x007F)); /* Unichar fullwidth <del> */
1058 : 1 : g_assert_false (g_unichar_isgraph (0x009F)); /* Unichar fullwidth control */
1059 : :
1060 : : /*** Testing TYPE() border cases ***/
1061 : 1 : g_assert_true (g_unichar_isgraph (0x3FF5));
1062 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1063 : 1 : g_assert_true (g_unichar_isgraph (0xFFEFF));
1064 : : /* U+E0001 Language Tag */
1065 : 1 : g_assert_false (g_unichar_isgraph (0xE0001));
1066 : 1 : g_assert_false (g_unichar_isgraph (G_UNICODE_LAST_CHAR));
1067 : 1 : g_assert_false (g_unichar_isgraph (G_UNICODE_LAST_CHAR + 1));
1068 : 1 : g_assert_false (g_unichar_isgraph (G_UNICODE_LAST_CHAR_PART1));
1069 : 1 : g_assert_false (g_unichar_isgraph (G_UNICODE_LAST_CHAR_PART1 + 1));
1070 : 1 : }
1071 : :
1072 : : /* Test that g_unichar_iszerowidth() returns the correct value for various
1073 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1074 : : static void
1075 : 1 : test_zerowidth (void)
1076 : : {
1077 : 1 : g_assert_false (g_unichar_iszerowidth (0x00AD));
1078 : 1 : g_assert_false (g_unichar_iszerowidth (0x115F));
1079 : 1 : g_assert_true (g_unichar_iszerowidth (0x1160));
1080 : 1 : g_assert_true (g_unichar_iszerowidth (0x11AA));
1081 : 1 : g_assert_true (g_unichar_iszerowidth (0x11FF));
1082 : 1 : g_assert_false (g_unichar_iszerowidth (0x1200));
1083 : 1 : g_assert_false (g_unichar_iszerowidth (0x200A));
1084 : 1 : g_assert_true (g_unichar_iszerowidth (0x200B));
1085 : 1 : g_assert_true (g_unichar_iszerowidth (0x200C));
1086 : 1 : g_assert_true (g_unichar_iszerowidth (0x591));
1087 : :
1088 : : /*** Testing TYPE() border cases ***/
1089 : 1 : g_assert_false (g_unichar_iszerowidth (0x3FF5));
1090 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1091 : 1 : g_assert_false (g_unichar_iszerowidth (0xFFEFF));
1092 : : /* U+E0001 Language Tag */
1093 : 1 : g_assert_true (g_unichar_iszerowidth (0xE0001));
1094 : 1 : g_assert_false (g_unichar_iszerowidth (G_UNICODE_LAST_CHAR));
1095 : 1 : g_assert_false (g_unichar_iszerowidth (G_UNICODE_LAST_CHAR + 1));
1096 : 1 : g_assert_false (g_unichar_iszerowidth (G_UNICODE_LAST_CHAR_PART1));
1097 : 1 : g_assert_false (g_unichar_iszerowidth (G_UNICODE_LAST_CHAR_PART1 + 1));
1098 : :
1099 : : /* Hangul Jamo Extended-B block, containing jungseong and jongseong for
1100 : : * Old Korean */
1101 : 1 : g_assert_true (g_unichar_iszerowidth (0xD7B0));
1102 : 1 : g_assert_true (g_unichar_iszerowidth (0xD7FB));
1103 : 1 : }
1104 : :
1105 : : /* Test that g_unichar_istitle() returns the correct value for various
1106 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1107 : : static void
1108 : 1 : test_title (void)
1109 : : {
1110 : 1 : g_assert_true (g_unichar_istitle (0x01c5));
1111 : 1 : g_assert_true (g_unichar_istitle (0x1f88));
1112 : 1 : g_assert_true (g_unichar_istitle (0x1fcc));
1113 : 1 : g_assert_false (g_unichar_istitle ('a'));
1114 : 1 : g_assert_false (g_unichar_istitle ('A'));
1115 : 1 : g_assert_false (g_unichar_istitle (';'));
1116 : :
1117 : : /*** Testing TYPE() border cases ***/
1118 : 1 : g_assert_false (g_unichar_istitle (0x3FF5));
1119 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1120 : 1 : g_assert_false (g_unichar_istitle (0xFFEFF));
1121 : : /* U+E0001 Language Tag */
1122 : 1 : g_assert_false (g_unichar_istitle (0xE0001));
1123 : 1 : g_assert_false (g_unichar_istitle (G_UNICODE_LAST_CHAR));
1124 : 1 : g_assert_false (g_unichar_istitle (G_UNICODE_LAST_CHAR + 1));
1125 : 1 : g_assert_false (g_unichar_istitle (G_UNICODE_LAST_CHAR_PART1));
1126 : 1 : g_assert_false (g_unichar_istitle (G_UNICODE_LAST_CHAR_PART1 + 1));
1127 : :
1128 : 1 : g_assert_cmphex (g_unichar_totitle (0x0000), ==, 0x0000);
1129 : 1 : g_assert_cmphex (g_unichar_totitle (0x01c6), ==, 0x01c5);
1130 : 1 : g_assert_cmphex (g_unichar_totitle (0x01c4), ==, 0x01c5);
1131 : 1 : g_assert_cmphex (g_unichar_totitle (0x01c5), ==, 0x01c5);
1132 : 1 : g_assert_cmphex (g_unichar_totitle (0x1f80), ==, 0x1f88);
1133 : 1 : g_assert_cmphex (g_unichar_totitle (0x1f88), ==, 0x1f88);
1134 : 1 : g_assert_cmphex (g_unichar_totitle ('a'), ==, 'A');
1135 : 1 : g_assert_cmphex (g_unichar_totitle ('A'), ==, 'A');
1136 : :
1137 : : /*** Testing TYPE() border cases ***/
1138 : 1 : g_assert_cmphex (g_unichar_totitle (0x3FF5), ==, 0x3FF5);
1139 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1140 : 1 : g_assert_cmphex (g_unichar_totitle (0xFFEFF), ==, 0xFFEFF);
1141 : 1 : g_assert_cmphex (g_unichar_totitle (0xDFFFF), ==, 0xDFFFF);
1142 : : /* U+E0001 Language Tag */
1143 : 1 : g_assert_cmphex (g_unichar_totitle (0xE0001), ==, 0xE0001);
1144 : 1 : g_assert_cmphex (g_unichar_totitle (G_UNICODE_LAST_CHAR), ==,
1145 : : G_UNICODE_LAST_CHAR);
1146 : 1 : g_assert_cmphex (g_unichar_totitle (G_UNICODE_LAST_CHAR + 1), ==,
1147 : : (G_UNICODE_LAST_CHAR + 1));
1148 : 1 : g_assert_cmphex (g_unichar_totitle (G_UNICODE_LAST_CHAR_PART1), ==,
1149 : : (G_UNICODE_LAST_CHAR_PART1));
1150 : 1 : g_assert_cmphex (g_unichar_totitle (G_UNICODE_LAST_CHAR_PART1 + 1), ==,
1151 : : (G_UNICODE_LAST_CHAR_PART1 + 1));
1152 : 1 : }
1153 : :
1154 : : /* Test that g_unichar_isupper() returns the correct value for various
1155 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1156 : : static void
1157 : 1 : test_upper (void)
1158 : : {
1159 : 1 : g_assert_false (g_unichar_isupper (' '));
1160 : 1 : g_assert_false (g_unichar_isupper ('0'));
1161 : 1 : g_assert_false (g_unichar_isupper ('a'));
1162 : 1 : g_assert_true (g_unichar_isupper ('A'));
1163 : 1 : g_assert_false (g_unichar_isupper (0xff41)); /* Unicode fullwidth 'a' */
1164 : 1 : g_assert_true (g_unichar_isupper (0xff21)); /* Unicode fullwidth 'A' */
1165 : :
1166 : : /*** Testing TYPE() border cases ***/
1167 : 1 : g_assert_false (g_unichar_isupper (0x3FF5));
1168 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1169 : 1 : g_assert_false (g_unichar_isupper (0xFFEFF));
1170 : : /* U+E0001 Language Tag */
1171 : 1 : g_assert_false (g_unichar_isupper (0xE0001));
1172 : 1 : g_assert_false (g_unichar_isupper (G_UNICODE_LAST_CHAR));
1173 : 1 : g_assert_false (g_unichar_isupper (G_UNICODE_LAST_CHAR + 1));
1174 : 1 : g_assert_false (g_unichar_isupper (G_UNICODE_LAST_CHAR_PART1));
1175 : 1 : g_assert_false (g_unichar_isupper (G_UNICODE_LAST_CHAR_PART1 + 1));
1176 : 1 : }
1177 : :
1178 : : /* Test that g_unichar_islower() returns the correct value for various
1179 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1180 : : static void
1181 : 1 : test_lower (void)
1182 : : {
1183 : 1 : g_assert_false (g_unichar_islower (' '));
1184 : 1 : g_assert_false (g_unichar_islower ('0'));
1185 : 1 : g_assert_true (g_unichar_islower ('a'));
1186 : 1 : g_assert_false (g_unichar_islower ('A'));
1187 : 1 : g_assert_true (g_unichar_islower (0xff41)); /* Unicode fullwidth 'a' */
1188 : 1 : g_assert_false (g_unichar_islower (0xff21)); /* Unicode fullwidth 'A' */
1189 : :
1190 : : /*** Testing TYPE() border cases ***/
1191 : 1 : g_assert_false (g_unichar_islower (0x3FF5));
1192 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1193 : 1 : g_assert_false (g_unichar_islower (0xFFEFF));
1194 : : /* U+E0001 Language Tag */
1195 : 1 : g_assert_false (g_unichar_islower (0xE0001));
1196 : 1 : g_assert_false (g_unichar_islower (G_UNICODE_LAST_CHAR));
1197 : 1 : g_assert_false (g_unichar_islower (G_UNICODE_LAST_CHAR + 1));
1198 : 1 : g_assert_false (g_unichar_islower (G_UNICODE_LAST_CHAR_PART1));
1199 : 1 : g_assert_false (g_unichar_islower (G_UNICODE_LAST_CHAR_PART1 + 1));
1200 : 1 : }
1201 : :
1202 : : /* Test that g_unichar_isprint() returns the correct value for various
1203 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1204 : : static void
1205 : 1 : test_print (void)
1206 : : {
1207 : 1 : g_assert_true (g_unichar_isprint (' '));
1208 : 1 : g_assert_true (g_unichar_isprint ('0'));
1209 : 1 : g_assert_true (g_unichar_isprint ('a'));
1210 : 1 : g_assert_true (g_unichar_isprint ('A'));
1211 : 1 : g_assert_true (g_unichar_isprint (0xff41)); /* Unicode fullwidth 'a' */
1212 : 1 : g_assert_true (g_unichar_isprint (0xff21)); /* Unicode fullwidth 'A' */
1213 : :
1214 : : /*** Testing TYPE() border cases ***/
1215 : 1 : g_assert_true (g_unichar_isprint (0x3FF5));
1216 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1217 : 1 : g_assert_true (g_unichar_isprint (0xFFEFF));
1218 : : /* U+E0001 Language Tag */
1219 : 1 : g_assert_false (g_unichar_isprint (0xE0001));
1220 : 1 : g_assert_false (g_unichar_isprint (G_UNICODE_LAST_CHAR));
1221 : 1 : g_assert_false (g_unichar_isprint (G_UNICODE_LAST_CHAR + 1));
1222 : 1 : g_assert_false (g_unichar_isprint (G_UNICODE_LAST_CHAR_PART1));
1223 : 1 : g_assert_false (g_unichar_isprint (G_UNICODE_LAST_CHAR_PART1 + 1));
1224 : 1 : }
1225 : :
1226 : : /* Test that g_unichar_toupper() and g_unichar_tolower() return the
1227 : : * correct values for various ASCII and Unicode alphabetic, numeric,
1228 : : * and other, codepoints. */
1229 : : static void
1230 : 1 : test_cases (void)
1231 : : {
1232 : 1 : g_assert_cmphex (g_unichar_toupper (0x0), ==, 0x0);
1233 : 1 : g_assert_cmphex (g_unichar_tolower (0x0), ==, 0x0);
1234 : 1 : g_assert_cmphex (g_unichar_toupper ('a'), ==, 'A');
1235 : 1 : g_assert_cmphex (g_unichar_toupper ('A'), ==, 'A');
1236 : : /* Unicode fullwidth 'a' == 'A' */
1237 : 1 : g_assert_cmphex (g_unichar_toupper (0xff41), ==, 0xff21);
1238 : : /* Unicode fullwidth 'A' == 'A' */
1239 : 1 : g_assert_cmphex (g_unichar_toupper (0xff21), ==, 0xff21);
1240 : 1 : g_assert_cmphex (g_unichar_toupper (0x01C5), ==, 0x01C4);
1241 : 1 : g_assert_cmphex (g_unichar_toupper (0x01C6), ==, 0x01C4);
1242 : 1 : g_assert_cmphex (g_unichar_tolower ('A'), ==, 'a');
1243 : 1 : g_assert_cmphex (g_unichar_tolower ('a'), ==, 'a');
1244 : : /* Unicode fullwidth 'A' == 'a' */
1245 : 1 : g_assert_cmphex (g_unichar_tolower (0xff21), ==, 0xff41);
1246 : : /* Unicode fullwidth 'a' == 'a' */
1247 : 1 : g_assert_cmphex (g_unichar_tolower (0xff41), ==, 0xff41);
1248 : 1 : g_assert_cmphex (g_unichar_tolower (0x01C4), ==, 0x01C6);
1249 : 1 : g_assert_cmphex (g_unichar_tolower (0x01C5), ==, 0x01C6);
1250 : 1 : g_assert_cmphex (g_unichar_tolower (0x1F8A), ==, 0x1F82);
1251 : 1 : g_assert_cmphex (g_unichar_totitle (0x1F8A), ==, 0x1F8A);
1252 : 1 : g_assert_cmphex (g_unichar_toupper (0x1F8A), ==, 0x1F8A);
1253 : 1 : g_assert_cmphex (g_unichar_tolower (0x1FB2), ==, 0x1FB2);
1254 : 1 : g_assert_cmphex (g_unichar_toupper (0x1FB2), ==, 0x1FB2);
1255 : :
1256 : : /* U+130 is a special case, it's a 'I' with a dot on top */
1257 : 1 : g_assert_cmphex (g_unichar_tolower (0x130), ==, 0x69);
1258 : :
1259 : : /* Testing ATTTABLE() border cases */
1260 : 1 : g_assert_cmphex (g_unichar_toupper (0x1D6FE), ==, 0x1D6FE);
1261 : :
1262 : : /*** Testing TYPE() border cases ***/
1263 : 1 : g_assert_cmphex (g_unichar_toupper (0x3FF5), ==, 0x3FF5);
1264 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1265 : 1 : g_assert_cmphex (g_unichar_toupper (0xFFEFF), ==, 0xFFEFF);
1266 : 1 : g_assert_cmphex (g_unichar_toupper (0xDFFFF), ==, 0xDFFFF);
1267 : : /* U+E0001 Language Tag */
1268 : 1 : g_assert_cmphex (g_unichar_toupper (0xE0001), ==, 0xE0001);
1269 : 1 : g_assert_cmphex (g_unichar_toupper (G_UNICODE_LAST_CHAR), ==,
1270 : : G_UNICODE_LAST_CHAR);
1271 : 1 : g_assert_cmphex (g_unichar_toupper (G_UNICODE_LAST_CHAR + 1), ==,
1272 : : (G_UNICODE_LAST_CHAR + 1));
1273 : 1 : g_assert_cmphex (g_unichar_toupper (G_UNICODE_LAST_CHAR_PART1), ==,
1274 : : (G_UNICODE_LAST_CHAR_PART1));
1275 : 1 : g_assert_cmphex (g_unichar_toupper (G_UNICODE_LAST_CHAR_PART1 + 1), ==,
1276 : : (G_UNICODE_LAST_CHAR_PART1 + 1));
1277 : :
1278 : : /* Testing ATTTABLE() border cases */
1279 : 1 : g_assert_cmphex (g_unichar_tolower (0x1D6FA), ==, 0x1D6FA);
1280 : :
1281 : : /*** Testing TYPE() border cases ***/
1282 : 1 : g_assert_cmphex (g_unichar_tolower (0x3FF5), ==, 0x3FF5);
1283 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1284 : 1 : g_assert_cmphex (g_unichar_tolower (0xFFEFF), ==, 0xFFEFF);
1285 : 1 : g_assert_cmphex (g_unichar_tolower (0xDFFFF), ==, 0xDFFFF);
1286 : : /* U+E0001 Language Tag */
1287 : 1 : g_assert_cmphex (g_unichar_tolower (0xE0001), ==, 0xE0001);
1288 : 1 : g_assert_cmphex (g_unichar_tolower (G_UNICODE_LAST_CHAR), ==,
1289 : : G_UNICODE_LAST_CHAR);
1290 : 1 : g_assert_cmphex (g_unichar_tolower (G_UNICODE_LAST_CHAR + 1), ==,
1291 : : (G_UNICODE_LAST_CHAR + 1));
1292 : 1 : g_assert_cmphex (g_unichar_tolower (G_UNICODE_LAST_CHAR_PART1), ==,
1293 : : G_UNICODE_LAST_CHAR_PART1);
1294 : 1 : g_assert_cmphex (g_unichar_tolower (G_UNICODE_LAST_CHAR_PART1 + 1), ==,
1295 : : (G_UNICODE_LAST_CHAR_PART1 + 1));
1296 : 1 : }
1297 : :
1298 : : /* Test that g_unichar_isdefined() returns the correct value for various
1299 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1300 : : static void
1301 : 1 : test_defined (void)
1302 : : {
1303 : 1 : g_assert_true (g_unichar_isdefined (0x0903));
1304 : 1 : g_assert_true (g_unichar_isdefined (0x20DD));
1305 : 1 : g_assert_true (g_unichar_isdefined (0x20BA));
1306 : 1 : g_assert_true (g_unichar_isdefined (0xA806));
1307 : 1 : g_assert_true (g_unichar_isdefined ('a'));
1308 : 1 : g_assert_false (g_unichar_isdefined (0x10C49));
1309 : 1 : g_assert_false (g_unichar_isdefined (0x169D));
1310 : :
1311 : : /*** Testing TYPE() border cases ***/
1312 : 1 : g_assert_true (g_unichar_isdefined (0x3FF5));
1313 : : /* U+FFEFF Plane 15 Private Use (needed to be > G_UNICODE_MAX_TABLE_INDEX) */
1314 : 1 : g_assert_true (g_unichar_isdefined (0xFFEFF));
1315 : 1 : g_assert_false (g_unichar_isdefined (0xDFFFF));
1316 : : /* U+E0001 Language Tag */
1317 : 1 : g_assert_true (g_unichar_isdefined (0xE0001));
1318 : 1 : g_assert_false (g_unichar_isdefined (G_UNICODE_LAST_CHAR));
1319 : 1 : g_assert_false (g_unichar_isdefined (G_UNICODE_LAST_CHAR + 1));
1320 : 1 : g_assert_false (g_unichar_isdefined (G_UNICODE_LAST_CHAR_PART1));
1321 : 1 : g_assert_false (g_unichar_isdefined (G_UNICODE_LAST_CHAR_PART1 + 1));
1322 : 1 : }
1323 : :
1324 : : /* Test that g_unichar_iswide() returns the correct value for various
1325 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1326 : : static void
1327 : 1 : test_wide (void)
1328 : : {
1329 : : guint i;
1330 : : struct {
1331 : : gunichar c;
1332 : : enum {
1333 : : NOT_WIDE,
1334 : : WIDE_CJK,
1335 : : WIDE
1336 : : } wide;
1337 : 1 : } examples[] = {
1338 : : /* Neutral */
1339 : : { 0x0000, NOT_WIDE },
1340 : : { 0x0483, NOT_WIDE },
1341 : : { 0x0641, NOT_WIDE },
1342 : : { 0xFFFC, NOT_WIDE },
1343 : : { 0x10000, NOT_WIDE },
1344 : : { 0xE0001, NOT_WIDE },
1345 : : { 0x2FFFE, NOT_WIDE },
1346 : : { 0x3FFFE, NOT_WIDE },
1347 : :
1348 : : /* Narrow */
1349 : : { 0x0020, NOT_WIDE },
1350 : : { 0x0041, NOT_WIDE },
1351 : : { 0x27E6, NOT_WIDE },
1352 : :
1353 : : /* Halfwidth */
1354 : : { 0x20A9, NOT_WIDE },
1355 : : { 0xFF61, NOT_WIDE },
1356 : : { 0xFF69, NOT_WIDE },
1357 : : { 0xFFEE, NOT_WIDE },
1358 : :
1359 : : /* Ambiguous */
1360 : : { 0x00A1, WIDE_CJK },
1361 : : { 0x00BE, WIDE_CJK },
1362 : : { 0x02DD, WIDE_CJK },
1363 : : { 0x2020, WIDE_CJK },
1364 : : { 0xFFFD, WIDE_CJK },
1365 : : { 0x00A1, WIDE_CJK },
1366 : : { 0x1F100, WIDE_CJK },
1367 : : { 0xE0100, WIDE_CJK },
1368 : : { 0x100000, WIDE_CJK },
1369 : : { 0x10FFFD, WIDE_CJK },
1370 : :
1371 : : /* Fullwidth */
1372 : : { 0x3000, WIDE },
1373 : : { 0xFF60, WIDE },
1374 : :
1375 : : /* Wide */
1376 : : { 0x2329, WIDE },
1377 : : { 0x3001, WIDE },
1378 : : { 0xFE69, WIDE },
1379 : : { 0x30000, WIDE },
1380 : : { 0x3FFFD, WIDE },
1381 : :
1382 : : /* Default Wide blocks */
1383 : : { 0x4DBF, WIDE },
1384 : : { 0x9FFF, WIDE },
1385 : : { 0xFAFF, WIDE },
1386 : : { 0x2A6DF, WIDE },
1387 : : { 0x2B73F, WIDE },
1388 : : { 0x2B81F, WIDE },
1389 : : { 0x2FA1F, WIDE },
1390 : :
1391 : : /* Uniode-5.2 character additions */
1392 : : /* Wide */
1393 : : { 0x115F, WIDE },
1394 : :
1395 : : /* Uniode-6.0 character additions */
1396 : : /* Wide */
1397 : : { 0x2B740, WIDE },
1398 : : { 0x1B000, WIDE },
1399 : :
1400 : : { 0x111111, NOT_WIDE }
1401 : : };
1402 : :
1403 [ + + ]: 44 : for (i = 0; i < G_N_ELEMENTS (examples); i++)
1404 : : {
1405 : 43 : g_assert_cmpint (g_unichar_iswide (examples[i].c), ==,
1406 : : (examples[i].wide == WIDE));
1407 : 43 : g_assert_cmpint (g_unichar_iswide_cjk (examples[i].c), ==,
1408 : : (examples[i].wide != NOT_WIDE));
1409 : : }
1410 : 1 : };
1411 : :
1412 : : /* Test that g_unichar_compose() returns the correct value for various
1413 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1414 : : static void
1415 : 1 : test_compose (void)
1416 : : {
1417 : : gunichar ch;
1418 : :
1419 : : /* Not composable */
1420 : 1 : g_assert_false (g_unichar_compose (0x0041, 0x0042, &ch) && ch == 0);
1421 : 1 : g_assert_false (g_unichar_compose (0x0041, 0, &ch) && ch == 0);
1422 : 1 : g_assert_false (g_unichar_compose (0x0066, 0x0069, &ch) && ch == 0);
1423 : :
1424 : : /* Tricky non-composable */
1425 : 1 : g_assert_false (g_unichar_compose (0x0308, 0x0301, &ch) && ch == 0); /* !0x0344 */
1426 : 1 : g_assert_false (g_unichar_compose (0x0F71, 0x0F72, &ch) && ch == 0); /* !0x0F73 */
1427 : :
1428 : : /* Singletons should not compose */
1429 : 1 : g_assert_false (g_unichar_compose (0x212B, 0, &ch) && ch == 0);
1430 : 1 : g_assert_false (g_unichar_compose (0x00C5, 0, &ch) && ch == 0);
1431 : 1 : g_assert_false (g_unichar_compose (0x2126, 0, &ch) && ch == 0);
1432 : 1 : g_assert_false (g_unichar_compose (0x03A9, 0, &ch) && ch == 0);
1433 : :
1434 : : /* Pairs */
1435 : 1 : g_assert_true (g_unichar_compose (0x0041, 0x030A, &ch) && ch == 0x00C5);
1436 : 1 : g_assert_true (g_unichar_compose (0x006F, 0x0302, &ch) && ch == 0x00F4);
1437 : 1 : g_assert_true (g_unichar_compose (0x1E63, 0x0307, &ch) && ch == 0x1E69);
1438 : 1 : g_assert_true (g_unichar_compose (0x0073, 0x0323, &ch) && ch == 0x1E63);
1439 : 1 : g_assert_true (g_unichar_compose (0x0064, 0x0307, &ch) && ch == 0x1E0B);
1440 : 1 : g_assert_true (g_unichar_compose (0x0064, 0x0323, &ch) && ch == 0x1E0D);
1441 : :
1442 : : /* Hangul */
1443 : 1 : g_assert_true (g_unichar_compose (0xD4CC, 0x11B6, &ch) && ch == 0xD4DB);
1444 : 1 : g_assert_true (g_unichar_compose (0x1111, 0x1171, &ch) && ch == 0xD4CC);
1445 : 1 : g_assert_true (g_unichar_compose (0xCE20, 0x11B8, &ch) && ch == 0xCE31);
1446 : 1 : g_assert_true (g_unichar_compose (0x110E, 0x1173, &ch) && ch == 0xCE20);
1447 : 1 : }
1448 : :
1449 : : /* Test that g_unichar_decompose() returns the correct value for various
1450 : : * ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1451 : : static void
1452 : 1 : test_decompose (void)
1453 : : {
1454 : : gunichar a, b;
1455 : :
1456 : : /* Not decomposable */
1457 : 1 : g_assert_false (g_unichar_decompose (0x0041, &a, &b) && a == 0x0041 && b == 0);
1458 : 1 : g_assert_false (g_unichar_decompose (0xFB01, &a, &b) && a == 0xFB01 && b == 0);
1459 : :
1460 : : /* Singletons */
1461 : 1 : g_assert_true (g_unichar_decompose (0x212B, &a, &b) && a == 0x00C5 && b == 0);
1462 : 1 : g_assert_true (g_unichar_decompose (0x2126, &a, &b) && a == 0x03A9 && b == 0);
1463 : :
1464 : : /* Tricky pairs */
1465 : 1 : g_assert_true (g_unichar_decompose (0x0344, &a, &b) && a == 0x0308 && b == 0x0301);
1466 : 1 : g_assert_true (g_unichar_decompose (0x0F73, &a, &b) && a == 0x0F71 && b == 0x0F72);
1467 : :
1468 : : /* Pairs */
1469 : 1 : g_assert_true (g_unichar_decompose (0x00C5, &a, &b) && a == 0x0041 && b == 0x030A);
1470 : 1 : g_assert_true (g_unichar_decompose (0x00F4, &a, &b) && a == 0x006F && b == 0x0302);
1471 : 1 : g_assert_true (g_unichar_decompose (0x1E69, &a, &b) && a == 0x1E63 && b == 0x0307);
1472 : 1 : g_assert_true (g_unichar_decompose (0x1E63, &a, &b) && a == 0x0073 && b == 0x0323);
1473 : 1 : g_assert_true (g_unichar_decompose (0x1E0B, &a, &b) && a == 0x0064 && b == 0x0307);
1474 : 1 : g_assert_true (g_unichar_decompose (0x1E0D, &a, &b) && a == 0x0064 && b == 0x0323);
1475 : :
1476 : : /* Hangul */
1477 : 1 : g_assert_true (g_unichar_decompose (0xD4DB, &a, &b) && a == 0xD4CC && b == 0x11B6);
1478 : 1 : g_assert_true (g_unichar_decompose (0xD4CC, &a, &b) && a == 0x1111 && b == 0x1171);
1479 : 1 : g_assert_true (g_unichar_decompose (0xCE31, &a, &b) && a == 0xCE20 && b == 0x11B8);
1480 : 1 : g_assert_true (g_unichar_decompose (0xCE20, &a, &b) && a == 0x110E && b == 0x1173);
1481 : 1 : }
1482 : :
1483 : : /* Test that g_unichar_fully_decompose() returns the correct value for
1484 : : * various ASCII and Unicode alphabetic, numeric, and other, codepoints. */
1485 : : static void
1486 : 1 : test_fully_decompose_canonical (void)
1487 : : {
1488 : : gunichar decomp[5];
1489 : : gsize len;
1490 : :
1491 : : #define TEST_DECOMP(ch, expected_len, a, b, c, d) \
1492 : : len = g_unichar_fully_decompose (ch, FALSE, decomp, G_N_ELEMENTS (decomp)); \
1493 : : g_assert_cmpint (expected_len, ==, len); \
1494 : : if (expected_len >= 1) g_assert_cmphex (decomp[0], ==, a); \
1495 : : if (expected_len >= 2) g_assert_cmphex (decomp[1], ==, b); \
1496 : : if (expected_len >= 3) g_assert_cmphex (decomp[2], ==, c); \
1497 : : if (expected_len >= 4) g_assert_cmphex (decomp[3], ==, d); \
1498 : :
1499 : : #define TEST0(ch) TEST_DECOMP (ch, 1, ch, 0, 0, 0)
1500 : : #define TEST1(ch, a) TEST_DECOMP (ch, 1, a, 0, 0, 0)
1501 : : #define TEST2(ch, a, b) TEST_DECOMP (ch, 2, a, b, 0, 0)
1502 : : #define TEST3(ch, a, b, c) TEST_DECOMP (ch, 3, a, b, c, 0)
1503 : : #define TEST4(ch, a, b, c, d) TEST_DECOMP (ch, 4, a, b, c, d)
1504 : :
1505 : : /* Not decomposable */
1506 [ - + - + ]: 1 : TEST0 (0x0041);
1507 [ - + - + ]: 1 : TEST0 (0xFB01);
1508 : :
1509 : : /* Singletons */
1510 [ - + - + : 1 : TEST2 (0x212B, 0x0041, 0x030A);
- + ]
1511 [ - + - + ]: 1 : TEST1 (0x2126, 0x03A9);
1512 : :
1513 : : /* Tricky pairs */
1514 [ - + - + : 1 : TEST2 (0x0344, 0x0308, 0x0301);
- + ]
1515 [ - + - + : 1 : TEST2 (0x0F73, 0x0F71, 0x0F72);
- + ]
1516 : :
1517 : : /* General */
1518 [ - + - + : 1 : TEST2 (0x00C5, 0x0041, 0x030A);
- + ]
1519 [ - + - + : 1 : TEST2 (0x00F4, 0x006F, 0x0302);
- + ]
1520 [ - + - + : 1 : TEST3 (0x1E69, 0x0073, 0x0323, 0x0307);
- + - + ]
1521 [ - + - + : 1 : TEST2 (0x1E63, 0x0073, 0x0323);
- + ]
1522 [ - + - + : 1 : TEST2 (0x1E0B, 0x0064, 0x0307);
- + ]
1523 [ - + - + : 1 : TEST2 (0x1E0D, 0x0064, 0x0323);
- + ]
1524 : :
1525 : : /* Hangul */
1526 [ - + - + : 1 : TEST3 (0xD4DB, 0x1111, 0x1171, 0x11B6);
- + - + ]
1527 [ - + - + : 1 : TEST2 (0xD4CC, 0x1111, 0x1171);
- + ]
1528 [ - + - + : 1 : TEST3 (0xCE31, 0x110E, 0x1173, 0x11B8);
- + - + ]
1529 [ - + - + : 1 : TEST2 (0xCE20, 0x110E, 0x1173);
- + ]
1530 : :
1531 : : #undef TEST_DECOMP
1532 : 1 : }
1533 : :
1534 : : /* Test that g_unicode_canonical_decomposition() returns the correct
1535 : : * value for various ASCII and Unicode alphabetic, numeric, and other,
1536 : : * codepoints. */
1537 : : static void
1538 : 1 : test_canonical_decomposition (void)
1539 : : {
1540 : : gunichar *decomp;
1541 : : gsize len;
1542 : :
1543 : : #define TEST_DECOMP(ch, expected_len, a, b, c, d) \
1544 : : decomp = g_unicode_canonical_decomposition (ch, &len); \
1545 : : g_assert_cmpint (expected_len, ==, len); \
1546 : : if (expected_len >= 1) g_assert_cmphex (decomp[0], ==, a); \
1547 : : if (expected_len >= 2) g_assert_cmphex (decomp[1], ==, b); \
1548 : : if (expected_len >= 3) g_assert_cmphex (decomp[2], ==, c); \
1549 : : if (expected_len >= 4) g_assert_cmphex (decomp[3], ==, d); \
1550 : : g_free (decomp);
1551 : :
1552 : : #define TEST0(ch) TEST_DECOMP (ch, 1, ch, 0, 0, 0)
1553 : : #define TEST1(ch, a) TEST_DECOMP (ch, 1, a, 0, 0, 0)
1554 : : #define TEST2(ch, a, b) TEST_DECOMP (ch, 2, a, b, 0, 0)
1555 : : #define TEST3(ch, a, b, c) TEST_DECOMP (ch, 3, a, b, c, 0)
1556 : : #define TEST4(ch, a, b, c, d) TEST_DECOMP (ch, 4, a, b, c, d)
1557 : :
1558 : : /* Not decomposable */
1559 [ - + - + ]: 1 : TEST0 (0x0041);
1560 [ - + - + ]: 1 : TEST0 (0xFB01);
1561 : :
1562 : : /* Singletons */
1563 [ - + - + : 1 : TEST2 (0x212B, 0x0041, 0x030A);
- + ]
1564 [ - + - + ]: 1 : TEST1 (0x2126, 0x03A9);
1565 : :
1566 : : /* Tricky pairs */
1567 [ - + - + : 1 : TEST2 (0x0344, 0x0308, 0x0301);
- + ]
1568 [ - + - + : 1 : TEST2 (0x0F73, 0x0F71, 0x0F72);
- + ]
1569 : :
1570 : : /* General */
1571 [ - + - + : 1 : TEST2 (0x00C5, 0x0041, 0x030A);
- + ]
1572 [ - + - + : 1 : TEST2 (0x00F4, 0x006F, 0x0302);
- + ]
1573 [ - + - + : 1 : TEST3 (0x1E69, 0x0073, 0x0323, 0x0307);
- + - + ]
1574 [ - + - + : 1 : TEST2 (0x1E63, 0x0073, 0x0323);
- + ]
1575 [ - + - + : 1 : TEST2 (0x1E0B, 0x0064, 0x0307);
- + ]
1576 [ - + - + : 1 : TEST2 (0x1E0D, 0x0064, 0x0323);
- + ]
1577 : :
1578 : : /* Hangul */
1579 [ - + - + : 1 : TEST3 (0xD4DB, 0x1111, 0x1171, 0x11B6);
- + - + ]
1580 [ - + - + : 1 : TEST2 (0xD4CC, 0x1111, 0x1171);
- + ]
1581 [ - + - + : 1 : TEST3 (0xCE31, 0x110E, 0x1173, 0x11B8);
- + - + ]
1582 [ - + - + : 1 : TEST2 (0xCE20, 0x110E, 0x1173);
- + ]
1583 : :
1584 : : #undef TEST_DECOMP
1585 : 1 : }
1586 : :
1587 : : /* Test that g_unichar_decompose() whenever encouttering a char ch
1588 : : * decomposes into a and b, b itself won't decompose any further. */
1589 : : static void
1590 : 1 : test_decompose_tail (void)
1591 : : {
1592 : : gunichar ch, a, b, c, d;
1593 : :
1594 : : /* Test that whenever a char ch decomposes into a and b, b itself
1595 : : * won't decompose any further. */
1596 : :
1597 [ + + ]: 1114113 : for (ch = 0; ch < 0x110000; ch++)
1598 [ + + ]: 1114112 : if (g_unichar_decompose (ch, &a, &b))
1599 : 13233 : g_assert_false (g_unichar_decompose (b, &c, &d));
1600 : : else
1601 : : {
1602 : 1100879 : g_assert_cmpuint (a, ==, ch);
1603 : 1100879 : g_assert_cmpuint (b, ==, 0);
1604 : : }
1605 : 1 : }
1606 : :
1607 : : /* Test that all canonical decompositions of g_unichar_fully_decompose()
1608 : : * are at most 4 in length, and compatibility decompositions are
1609 : : * at most 18 in length. */
1610 : : static void
1611 : 1 : test_fully_decompose_len (void)
1612 : : {
1613 : : gunichar ch;
1614 : :
1615 : : /* Test that all canonical decompositions are at most 4 in length,
1616 : : * and compatibility decompositions are at most 18 in length.
1617 : : */
1618 : :
1619 [ + + ]: 1114113 : for (ch = 0; ch < 0x110000; ch++) {
1620 : 1114112 : g_assert_cmpint (g_unichar_fully_decompose (ch, FALSE, NULL, 0), <=, 4);
1621 : 1114112 : g_assert_cmpint (g_unichar_fully_decompose (ch, TRUE, NULL, 0), <=, 18);
1622 : : }
1623 : 1 : }
1624 : :
1625 : : /* Check various examples from Unicode Annex #15 for NFD and NFC
1626 : : * normalization.
1627 : : */
1628 : : static void
1629 : 1 : test_normalization (void)
1630 : : {
1631 : : const struct {
1632 : : const char *source;
1633 : : const char *nfd;
1634 : : const char *nfc;
1635 : 1 : } tests[] = {
1636 : : // Singletons
1637 : : { "\xe2\x84\xab", "A\xcc\x8a", "Å" }, // U+212B ANGSTROM SIGN
1638 : : { "\xe2\x84\xa6", "Ω", "Ω" }, // U+2126 OHM SIGN
1639 : : // Canonical Composites
1640 : : { "Å", "A\xcc\x8a", "Å" }, // U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
1641 : : { "ô", "o\xcc\x82", "ô" }, // U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
1642 : : // Multiple Combining Marks
1643 : : { "\xe1\xb9\xa9", "s\xcc\xa3\xcc\x87", "ṩ" }, // U+1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
1644 : : { "\xe1\xb8\x8b\xcc\xa3", "d\xcc\xa3\xcc\x87", "ḍ̇" },
1645 : : { "q\xcc\x87\xcc\xa3", "q\xcc\xa3\xcc\x87", "q̣̇" },
1646 : : // Compatibility Composites
1647 : : { "fi", "fi", "fi" }, // U+FB01 LATIN SMALL LIGATURE FI
1648 : : { "2\xe2\x81\xb5", "2\xe2\x81\xb5", "2⁵" },
1649 : : { "\xe1\xba\x9b\xcc\xa3", "\xc5\xbf\xcc\xa3\xcc\x87", "ẛ̣" },
1650 : :
1651 : : // Tests for behavior with reordered marks
1652 : : { "s\xcc\x87\xcc\xa3", "s\xcc\xa3\xcc\x87", "ṩ" },
1653 : : { "α\xcc\x94\xcd\x82", "α\xcc\x94\xcd\x82", "ἇ" },
1654 : : { "α\xcd\x82\xcc\x94", "α\xcd\x82\xcc\x94", "ᾶ\xcc\x94" },
1655 : : };
1656 : : gsize i;
1657 : :
1658 [ + + ]: 14 : for (i = 0; i < G_N_ELEMENTS (tests); i++)
1659 : : {
1660 : : char *nfd, *nfc;
1661 : :
1662 : 13 : nfd = g_utf8_normalize (tests[i].source, -1, G_NORMALIZE_NFD);
1663 : 13 : g_assert_cmpstr (nfd, ==, tests[i].nfd);
1664 : :
1665 : 13 : nfc = g_utf8_normalize (tests[i].nfd, -1, G_NORMALIZE_NFC);
1666 : 13 : g_assert_cmpstr (nfc, ==, tests[i].nfc);
1667 : :
1668 : 13 : g_free (nfd);
1669 : 13 : g_free (nfc);
1670 : : }
1671 : 1 : }
1672 : :
1673 : : static void
1674 : 1 : test_iso15924 (void)
1675 : : {
1676 : : const struct {
1677 : : GUnicodeScript script;
1678 : : char four_letter_code[5];
1679 : 1 : } data[] = {
1680 : : { G_UNICODE_SCRIPT_COMMON, "Zyyy" },
1681 : : { G_UNICODE_SCRIPT_INHERITED, "Zinh" },
1682 : : { G_UNICODE_SCRIPT_MATH, "Zmth" },
1683 : : { G_UNICODE_SCRIPT_ARABIC, "Arab" },
1684 : : { G_UNICODE_SCRIPT_ARMENIAN, "Armn" },
1685 : : { G_UNICODE_SCRIPT_BENGALI, "Beng" },
1686 : : { G_UNICODE_SCRIPT_BOPOMOFO, "Bopo" },
1687 : : { G_UNICODE_SCRIPT_CHEROKEE, "Cher" },
1688 : : { G_UNICODE_SCRIPT_COPTIC, "Copt" },
1689 : : { G_UNICODE_SCRIPT_CYRILLIC, "Cyrl" },
1690 : : { G_UNICODE_SCRIPT_DESERET, "Dsrt" },
1691 : : { G_UNICODE_SCRIPT_DEVANAGARI, "Deva" },
1692 : : { G_UNICODE_SCRIPT_ETHIOPIC, "Ethi" },
1693 : : { G_UNICODE_SCRIPT_GEORGIAN, "Geor" },
1694 : : { G_UNICODE_SCRIPT_GOTHIC, "Goth" },
1695 : : { G_UNICODE_SCRIPT_GREEK, "Grek" },
1696 : : { G_UNICODE_SCRIPT_GUJARATI, "Gujr" },
1697 : : { G_UNICODE_SCRIPT_GURMUKHI, "Guru" },
1698 : : { G_UNICODE_SCRIPT_HAN, "Hani" },
1699 : : { G_UNICODE_SCRIPT_HANGUL, "Hang" },
1700 : : { G_UNICODE_SCRIPT_HEBREW, "Hebr" },
1701 : : { G_UNICODE_SCRIPT_HIRAGANA, "Hira" },
1702 : : { G_UNICODE_SCRIPT_KANNADA, "Knda" },
1703 : : { G_UNICODE_SCRIPT_KATAKANA, "Kana" },
1704 : : { G_UNICODE_SCRIPT_KHMER, "Khmr" },
1705 : : { G_UNICODE_SCRIPT_LAO, "Laoo" },
1706 : : { G_UNICODE_SCRIPT_LATIN, "Latn" },
1707 : : { G_UNICODE_SCRIPT_MALAYALAM, "Mlym" },
1708 : : { G_UNICODE_SCRIPT_MONGOLIAN, "Mong" },
1709 : : { G_UNICODE_SCRIPT_MYANMAR, "Mymr" },
1710 : : { G_UNICODE_SCRIPT_OGHAM, "Ogam" },
1711 : : { G_UNICODE_SCRIPT_OLD_ITALIC, "Ital" },
1712 : : { G_UNICODE_SCRIPT_ORIYA, "Orya" },
1713 : : { G_UNICODE_SCRIPT_RUNIC, "Runr" },
1714 : : { G_UNICODE_SCRIPT_SINHALA, "Sinh" },
1715 : : { G_UNICODE_SCRIPT_SYRIAC, "Syrc" },
1716 : : { G_UNICODE_SCRIPT_TAMIL, "Taml" },
1717 : : { G_UNICODE_SCRIPT_TELUGU, "Telu" },
1718 : : { G_UNICODE_SCRIPT_THAANA, "Thaa" },
1719 : : { G_UNICODE_SCRIPT_THAI, "Thai" },
1720 : : { G_UNICODE_SCRIPT_TIBETAN, "Tibt" },
1721 : : { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, "Cans" },
1722 : : { G_UNICODE_SCRIPT_YI, "Yiii" },
1723 : : { G_UNICODE_SCRIPT_TAGALOG, "Tglg" },
1724 : : { G_UNICODE_SCRIPT_HANUNOO, "Hano" },
1725 : : { G_UNICODE_SCRIPT_BUHID, "Buhd" },
1726 : : { G_UNICODE_SCRIPT_TAGBANWA, "Tagb" },
1727 : :
1728 : : /* Unicode-4.0 additions */
1729 : : { G_UNICODE_SCRIPT_BRAILLE, "Brai" },
1730 : : { G_UNICODE_SCRIPT_CYPRIOT, "Cprt" },
1731 : : { G_UNICODE_SCRIPT_LIMBU, "Limb" },
1732 : : { G_UNICODE_SCRIPT_OSMANYA, "Osma" },
1733 : : { G_UNICODE_SCRIPT_SHAVIAN, "Shaw" },
1734 : : { G_UNICODE_SCRIPT_LINEAR_B, "Linb" },
1735 : : { G_UNICODE_SCRIPT_TAI_LE, "Tale" },
1736 : : { G_UNICODE_SCRIPT_UGARITIC, "Ugar" },
1737 : :
1738 : : /* Unicode-4.1 additions */
1739 : : { G_UNICODE_SCRIPT_NEW_TAI_LUE, "Talu" },
1740 : : { G_UNICODE_SCRIPT_BUGINESE, "Bugi" },
1741 : : { G_UNICODE_SCRIPT_GLAGOLITIC, "Glag" },
1742 : : { G_UNICODE_SCRIPT_TIFINAGH, "Tfng" },
1743 : : { G_UNICODE_SCRIPT_SYLOTI_NAGRI, "Sylo" },
1744 : : { G_UNICODE_SCRIPT_OLD_PERSIAN, "Xpeo" },
1745 : : { G_UNICODE_SCRIPT_KHAROSHTHI, "Khar" },
1746 : :
1747 : : /* Unicode-5.0 additions */
1748 : : { G_UNICODE_SCRIPT_UNKNOWN, "Zzzz" },
1749 : : { G_UNICODE_SCRIPT_BALINESE, "Bali" },
1750 : : { G_UNICODE_SCRIPT_CUNEIFORM, "Xsux" },
1751 : : { G_UNICODE_SCRIPT_PHOENICIAN, "Phnx" },
1752 : : { G_UNICODE_SCRIPT_PHAGS_PA, "Phag" },
1753 : : { G_UNICODE_SCRIPT_NKO, "Nkoo" },
1754 : :
1755 : : /* Unicode-5.1 additions */
1756 : : { G_UNICODE_SCRIPT_KAYAH_LI, "Kali" },
1757 : : { G_UNICODE_SCRIPT_LEPCHA, "Lepc" },
1758 : : { G_UNICODE_SCRIPT_REJANG, "Rjng" },
1759 : : { G_UNICODE_SCRIPT_SUNDANESE, "Sund" },
1760 : : { G_UNICODE_SCRIPT_SAURASHTRA, "Saur" },
1761 : : { G_UNICODE_SCRIPT_CHAM, "Cham" },
1762 : : { G_UNICODE_SCRIPT_OL_CHIKI, "Olck" },
1763 : : { G_UNICODE_SCRIPT_VAI, "Vaii" },
1764 : : { G_UNICODE_SCRIPT_CARIAN, "Cari" },
1765 : : { G_UNICODE_SCRIPT_LYCIAN, "Lyci" },
1766 : : { G_UNICODE_SCRIPT_LYDIAN, "Lydi" },
1767 : :
1768 : : /* Unicode-5.2 additions */
1769 : : { G_UNICODE_SCRIPT_AVESTAN, "Avst" },
1770 : : { G_UNICODE_SCRIPT_BAMUM, "Bamu" },
1771 : : { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, "Egyp" },
1772 : : { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, "Armi" },
1773 : : { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, "Phli" },
1774 : : { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, "Prti" },
1775 : : { G_UNICODE_SCRIPT_JAVANESE, "Java" },
1776 : : { G_UNICODE_SCRIPT_KAITHI, "Kthi" },
1777 : : { G_UNICODE_SCRIPT_LISU, "Lisu" },
1778 : : { G_UNICODE_SCRIPT_MEETEI_MAYEK, "Mtei" },
1779 : : { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, "Sarb" },
1780 : : { G_UNICODE_SCRIPT_OLD_TURKIC, "Orkh" },
1781 : : { G_UNICODE_SCRIPT_SAMARITAN, "Samr" },
1782 : : { G_UNICODE_SCRIPT_TAI_THAM, "Lana" },
1783 : : { G_UNICODE_SCRIPT_TAI_VIET, "Tavt" },
1784 : :
1785 : : /* Unicode-6.0 additions */
1786 : : { G_UNICODE_SCRIPT_BATAK, "Batk" },
1787 : : { G_UNICODE_SCRIPT_BRAHMI, "Brah" },
1788 : : { G_UNICODE_SCRIPT_MANDAIC, "Mand" },
1789 : :
1790 : : /* Unicode-6.1 additions */
1791 : : { G_UNICODE_SCRIPT_CHAKMA, "Cakm" },
1792 : : { G_UNICODE_SCRIPT_MEROITIC_CURSIVE, "Merc" },
1793 : : { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, "Mero" },
1794 : : { G_UNICODE_SCRIPT_MIAO, "Plrd" },
1795 : : { G_UNICODE_SCRIPT_SHARADA, "Shrd" },
1796 : : { G_UNICODE_SCRIPT_SORA_SOMPENG, "Sora" },
1797 : : { G_UNICODE_SCRIPT_TAKRI, "Takr" },
1798 : :
1799 : : /* Unicode 7.0 additions */
1800 : : { G_UNICODE_SCRIPT_BASSA_VAH, "Bass" },
1801 : : { G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN, "Aghb" },
1802 : : { G_UNICODE_SCRIPT_DUPLOYAN, "Dupl" },
1803 : : { G_UNICODE_SCRIPT_ELBASAN, "Elba" },
1804 : : { G_UNICODE_SCRIPT_GRANTHA, "Gran" },
1805 : : { G_UNICODE_SCRIPT_KHOJKI, "Khoj" },
1806 : : { G_UNICODE_SCRIPT_KHUDAWADI, "Sind" },
1807 : : { G_UNICODE_SCRIPT_LINEAR_A, "Lina" },
1808 : : { G_UNICODE_SCRIPT_MAHAJANI, "Mahj" },
1809 : : { G_UNICODE_SCRIPT_MANICHAEAN, "Mani" },
1810 : : { G_UNICODE_SCRIPT_MENDE_KIKAKUI, "Mend" },
1811 : : { G_UNICODE_SCRIPT_MODI, "Modi" },
1812 : : { G_UNICODE_SCRIPT_MRO, "Mroo" },
1813 : : { G_UNICODE_SCRIPT_NABATAEAN, "Nbat" },
1814 : : { G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN, "Narb" },
1815 : : { G_UNICODE_SCRIPT_OLD_PERMIC, "Perm" },
1816 : : { G_UNICODE_SCRIPT_PAHAWH_HMONG, "Hmng" },
1817 : : { G_UNICODE_SCRIPT_PALMYRENE, "Palm" },
1818 : : { G_UNICODE_SCRIPT_PAU_CIN_HAU, "Pauc" },
1819 : : { G_UNICODE_SCRIPT_PSALTER_PAHLAVI, "Phlp" },
1820 : : { G_UNICODE_SCRIPT_SIDDHAM, "Sidd" },
1821 : : { G_UNICODE_SCRIPT_TIRHUTA, "Tirh" },
1822 : : { G_UNICODE_SCRIPT_WARANG_CITI, "Wara" },
1823 : :
1824 : : /* Unicode 8.0 additions */
1825 : : { G_UNICODE_SCRIPT_AHOM, "Ahom" },
1826 : : { G_UNICODE_SCRIPT_ANATOLIAN_HIEROGLYPHS, "Hluw" },
1827 : : { G_UNICODE_SCRIPT_HATRAN, "Hatr" },
1828 : : { G_UNICODE_SCRIPT_MULTANI, "Mult" },
1829 : : { G_UNICODE_SCRIPT_OLD_HUNGARIAN, "Hung" },
1830 : : { G_UNICODE_SCRIPT_SIGNWRITING, "Sgnw" },
1831 : :
1832 : : /* Unicode 9.0 additions */
1833 : : { G_UNICODE_SCRIPT_ADLAM, "Adlm" },
1834 : : { G_UNICODE_SCRIPT_BHAIKSUKI, "Bhks" },
1835 : : { G_UNICODE_SCRIPT_MARCHEN, "Marc" },
1836 : : { G_UNICODE_SCRIPT_NEWA, "Newa" },
1837 : : { G_UNICODE_SCRIPT_OSAGE, "Osge" },
1838 : : { G_UNICODE_SCRIPT_TANGUT, "Tang" },
1839 : :
1840 : : /* Unicode 10.0 additions */
1841 : : { G_UNICODE_SCRIPT_MASARAM_GONDI, "Gonm" },
1842 : : { G_UNICODE_SCRIPT_NUSHU, "Nshu" },
1843 : : { G_UNICODE_SCRIPT_SOYOMBO, "Soyo" },
1844 : : { G_UNICODE_SCRIPT_ZANABAZAR_SQUARE, "Zanb" },
1845 : :
1846 : : /* Unicode 11.0 additions */
1847 : : { G_UNICODE_SCRIPT_DOGRA, "Dogr" },
1848 : : { G_UNICODE_SCRIPT_GUNJALA_GONDI, "Gong" },
1849 : : { G_UNICODE_SCRIPT_HANIFI_ROHINGYA, "Rohg" },
1850 : : { G_UNICODE_SCRIPT_MAKASAR, "Maka" },
1851 : : { G_UNICODE_SCRIPT_MEDEFAIDRIN, "Medf" },
1852 : : { G_UNICODE_SCRIPT_OLD_SOGDIAN, "Sogo" },
1853 : : { G_UNICODE_SCRIPT_SOGDIAN, "Sogd" },
1854 : :
1855 : : /* Unicode 12.0 additions */
1856 : : { G_UNICODE_SCRIPT_ELYMAIC, "Elym" },
1857 : : { G_UNICODE_SCRIPT_NANDINAGARI, "Nand" },
1858 : : { G_UNICODE_SCRIPT_NYIAKENG_PUACHUE_HMONG, "Hmnp" },
1859 : : { G_UNICODE_SCRIPT_WANCHO, "Wcho" },
1860 : :
1861 : : /* Unicode 13.0 additions */
1862 : : { G_UNICODE_SCRIPT_CHORASMIAN, "Chrs" },
1863 : : { G_UNICODE_SCRIPT_DIVES_AKURU, "Diak" },
1864 : : { G_UNICODE_SCRIPT_KHITAN_SMALL_SCRIPT, "Kits" },
1865 : : { G_UNICODE_SCRIPT_YEZIDI, "Yezi" },
1866 : :
1867 : : /* Unicode 14.0 additions */
1868 : : { G_UNICODE_SCRIPT_CYPRO_MINOAN, "Cpmn" },
1869 : : { G_UNICODE_SCRIPT_OLD_UYGHUR, "Ougr" },
1870 : : { G_UNICODE_SCRIPT_TANGSA, "Tnsa" },
1871 : : { G_UNICODE_SCRIPT_TOTO, "Toto" },
1872 : : { G_UNICODE_SCRIPT_VITHKUQI, "Vith" },
1873 : :
1874 : : /* Unicode 15.0 additions */
1875 : : { G_UNICODE_SCRIPT_KAWI, "Kawi" },
1876 : : { G_UNICODE_SCRIPT_NAG_MUNDARI, "Nagm" },
1877 : : };
1878 : : guint i;
1879 : :
1880 : 1 : g_assert_cmphex (0, ==,
1881 : : g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_INVALID_CODE));
1882 : 1 : g_assert_cmphex (0x5A7A7A7A, ==, g_unicode_script_to_iso15924 (1000));
1883 : 1 : g_assert_cmphex (0x41726162, ==,
1884 : : g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_ARABIC));
1885 : :
1886 : 1 : g_assert_cmphex (G_UNICODE_SCRIPT_INVALID_CODE, ==,
1887 : : g_unicode_script_from_iso15924 (0));
1888 : 1 : g_assert_cmphex (G_UNICODE_SCRIPT_UNKNOWN, ==,
1889 : : g_unicode_script_from_iso15924 (0x12345678));
1890 : :
1891 : : #define PACK(a,b,c,d) \
1892 : : ((guint32)((((guint8)(a))<<24)|(((guint8)(b))<<16)|(((guint8)(c))<<8)|((guint8)(d))))
1893 : :
1894 [ + + ]: 166 : for (i = 0; i < G_N_ELEMENTS (data); i++)
1895 : : {
1896 : 165 : guint32 code = PACK (data[i].four_letter_code[0],
1897 : : data[i].four_letter_code[1],
1898 : : data[i].four_letter_code[2],
1899 : : data[i].four_letter_code[3]);
1900 : :
1901 : 165 : g_test_message ("Testing script %s (code %u)", data[i].four_letter_code, code);
1902 : 165 : g_assert_cmphex (g_unicode_script_to_iso15924 (data[i].script), ==, code);
1903 : 165 : g_assert_cmpint (g_unicode_script_from_iso15924 (code), ==, data[i].script);
1904 : : }
1905 : :
1906 : : #undef PACK
1907 : 1 : }
1908 : :
1909 : : static void
1910 : 1 : test_normalize (void)
1911 : : {
1912 : : guint i;
1913 : : typedef struct
1914 : : {
1915 : : const gchar *str;
1916 : : const gchar *nfd;
1917 : : const gchar *nfc;
1918 : : const gchar *nfkd;
1919 : : const gchar *nfkc;
1920 : : } Test;
1921 : 1 : Test tests[] = {
1922 : : { "Äffin", "A\u0308ffin", "Äffin", "A\u0308ffin", "Äffin" },
1923 : : { "Ä\uFB03n", "A\u0308\uFB03n", "Ä\uFB03n", "A\u0308ffin", "Äffin" },
1924 : : { "Henry IV", "Henry IV", "Henry IV", "Henry IV", "Henry IV" },
1925 : : { "Henry \u2163", "Henry \u2163", "Henry \u2163", "Henry IV", "Henry IV" },
1926 : : { "non-utf\x88", NULL, NULL, NULL, NULL },
1927 : : { "", "", "", "", "" },
1928 : : };
1929 : :
1930 : : #define TEST(str, mode, expected) \
1931 : : { \
1932 : : gchar *normalized = g_utf8_normalize (str, -1, mode); \
1933 : : g_assert_cmpstr (normalized, ==, expected); \
1934 : : g_free (normalized); \
1935 : : }
1936 : :
1937 [ + + ]: 7 : for (i = 0; i < G_N_ELEMENTS (tests); i++)
1938 : : {
1939 [ - + ]: 6 : TEST (tests[i].str, G_NORMALIZE_NFD, tests[i].nfd);
1940 [ - + ]: 6 : TEST (tests[i].str, G_NORMALIZE_NFC, tests[i].nfc);
1941 [ - + ]: 6 : TEST (tests[i].str, G_NORMALIZE_NFKD, tests[i].nfkd);
1942 [ - + ]: 6 : TEST (tests[i].str, G_NORMALIZE_NFKC, tests[i].nfkc);
1943 : : }
1944 : :
1945 : : #undef TEST
1946 : 1 : }
1947 : :
1948 : : int
1949 : 1 : main (int argc,
1950 : : char *argv[])
1951 : : {
1952 : 1 : g_test_init (&argc, &argv, NULL);
1953 : :
1954 : 1 : g_test_add_func ("/unicode/alnum", test_alnum);
1955 : 1 : g_test_add_func ("/unicode/alpha", test_alpha);
1956 : 1 : g_test_add_func ("/unicode/break-type", test_unichar_break_type);
1957 : 1 : g_test_add_func ("/unicode/canonical-decomposition", test_canonical_decomposition);
1958 : 1 : g_test_add_func ("/unicode/casefold", test_casefold);
1959 : 1 : g_test_add_func ("/unicode/casemap_and_casefold", test_casemap_and_casefold);
1960 : 1 : g_test_add_func ("/unicode/cases", test_cases);
1961 : 1 : g_test_add_func ("/unicode/character-type", test_unichar_character_type);
1962 : 1 : g_test_add_func ("/unicode/cntrl", test_cntrl);
1963 : 1 : g_test_add_func ("/unicode/combining-class", test_combining_class);
1964 : 1 : g_test_add_func ("/unicode/compose", test_compose);
1965 : 1 : g_test_add_func ("/unicode/decompose", test_decompose);
1966 : 1 : g_test_add_func ("/unicode/decompose-tail", test_decompose_tail);
1967 : 1 : g_test_add_func ("/unicode/defined", test_defined);
1968 : 1 : g_test_add_func ("/unicode/digit", test_digit);
1969 : 1 : g_test_add_func ("/unicode/digit-value", test_digit_value);
1970 : 1 : g_test_add_func ("/unicode/fully-decompose-canonical", test_fully_decompose_canonical);
1971 : 1 : g_test_add_func ("/unicode/fully-decompose-len", test_fully_decompose_len);
1972 : 1 : g_test_add_func ("/unicode/normalization", test_normalization);
1973 : 1 : g_test_add_func ("/unicode/graph", test_graph);
1974 : 1 : g_test_add_func ("/unicode/iso15924", test_iso15924);
1975 : 1 : g_test_add_func ("/unicode/lower", test_lower);
1976 : 1 : g_test_add_func ("/unicode/mark", test_mark);
1977 : 1 : g_test_add_func ("/unicode/mirror", test_mirror);
1978 : 1 : g_test_add_func ("/unicode/print", test_print);
1979 : 1 : g_test_add_func ("/unicode/punctuation", test_punctuation);
1980 : 1 : g_test_add_func ("/unicode/script", test_unichar_script);
1981 : 1 : g_test_add_func ("/unicode/space", test_space);
1982 : 1 : g_test_add_func ("/unicode/strdown", test_strdown);
1983 : 1 : g_test_add_func ("/unicode/strup", test_strup);
1984 : 1 : g_test_add_func ("/unicode/turkish-strupdown", test_turkish_strupdown);
1985 : 1 : g_test_add_func ("/unicode/title", test_title);
1986 : 1 : g_test_add_func ("/unicode/upper", test_upper);
1987 : 1 : g_test_add_func ("/unicode/validate", test_unichar_validate);
1988 : 1 : g_test_add_func ("/unicode/wide", test_wide);
1989 : 1 : g_test_add_func ("/unicode/xdigit", test_xdigit);
1990 : 1 : g_test_add_func ("/unicode/xdigit-value", test_xdigit_value);
1991 : 1 : g_test_add_func ("/unicode/zero-width", test_zerowidth);
1992 : 1 : g_test_add_func ("/unicode/normalize", test_normalize);
1993 : :
1994 : 1 : return g_test_run();
1995 : : }
|