glib-unix: add function to ensure an fd is sealed
[platform/upstream/glib.git] / glib / tests / unicode.c
1 /* Unit tests for utilities
2  * Copyright (C) 2010 Red Hat, Inc.
3  * Copyright (C) 2011 Google, Inc.
4  *
5  * This work is provided "as is"; redistribution and modification
6  * in whole or in part, in any medium, physical or electronic is
7  * permitted without restriction.
8  *
9  * This work 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.
12  *
13  * In no event shall the authors or contributors be liable for any
14  * direct, indirect, incidental, special, exemplary, or consequential
15  * damages (including, but not limited to, procurement of substitute
16  * goods or services; loss of use, data, or profits; or business
17  * interruption) however caused and on any theory of liability, whether
18  * in contract, strict liability, or tort (including negligence or
19  * otherwise) arising in any way out of the use of this software, even
20  * if advised of the possibility of such damage.
21  *
22  * Author: Matthias Clasen, Behdad Esfahbod
23  */
24
25 /* We are testing some deprecated APIs here */
26 #define GLIB_DISABLE_DEPRECATION_WARNINGS
27
28 #include "glib.h"
29
30 static void
31 test_unichar_validate (void)
32 {
33   g_assert (g_unichar_validate ('j'));
34   g_assert (g_unichar_validate (8356));
35   g_assert (g_unichar_validate (8356));
36   g_assert (g_unichar_validate (0xfdd1));
37   g_assert (g_unichar_validate (917760));
38   g_assert (!g_unichar_validate (0x110000));
39 }
40
41 static void
42 test_unichar_character_type (void)
43 {
44   guint i;
45   struct {
46     GUnicodeType type;
47     gunichar     c;
48   } examples[] = {
49     { G_UNICODE_CONTROL,              0x000D },
50     { G_UNICODE_FORMAT,               0x200E },
51      /* G_UNICODE_UNASSIGNED */
52     { G_UNICODE_PRIVATE_USE,          0xE000 },
53     { G_UNICODE_SURROGATE,            0xD800 },
54     { G_UNICODE_LOWERCASE_LETTER,     0x0061 },
55     { G_UNICODE_MODIFIER_LETTER,      0x02B0 },
56     { G_UNICODE_OTHER_LETTER,         0x3400 },
57     { G_UNICODE_TITLECASE_LETTER,     0x01C5 },
58     { G_UNICODE_UPPERCASE_LETTER,     0xFF21 },
59     { G_UNICODE_COMBINING_MARK,       0x0903 },
60     { G_UNICODE_ENCLOSING_MARK,       0x20DD },
61     { G_UNICODE_NON_SPACING_MARK,     0xA806 },
62     { G_UNICODE_DECIMAL_NUMBER,       0xFF10 },
63     { G_UNICODE_LETTER_NUMBER,        0x16EE },
64     { G_UNICODE_OTHER_NUMBER,         0x17F0 },
65     { G_UNICODE_CONNECT_PUNCTUATION,  0x005F },
66     { G_UNICODE_DASH_PUNCTUATION,     0x058A },
67     { G_UNICODE_CLOSE_PUNCTUATION,    0x0F3B },
68     { G_UNICODE_FINAL_PUNCTUATION,    0x2019 },
69     { G_UNICODE_INITIAL_PUNCTUATION,  0x2018 },
70     { G_UNICODE_OTHER_PUNCTUATION,    0x2016 },
71     { G_UNICODE_OPEN_PUNCTUATION,     0x0F3A },
72     { G_UNICODE_CURRENCY_SYMBOL,      0x20A0 },
73     { G_UNICODE_MODIFIER_SYMBOL,      0x309B },
74     { G_UNICODE_MATH_SYMBOL,          0xFB29 },
75     { G_UNICODE_OTHER_SYMBOL,         0x00A6 },
76     { G_UNICODE_LINE_SEPARATOR,       0x2028 },
77     { G_UNICODE_PARAGRAPH_SEPARATOR,  0x2029 },
78     { G_UNICODE_SPACE_SEPARATOR,      0x202F },
79   };
80
81   for (i = 0; i < G_N_ELEMENTS (examples); i++)
82     {
83       g_assert_cmpint (g_unichar_type (examples[i].c), ==, examples[i].type);
84     }
85 }
86
87 static void
88 test_unichar_break_type (void)
89 {
90   guint i;
91   struct {
92     GUnicodeBreakType type;
93     gunichar          c;
94   } examples[] = {
95     { G_UNICODE_BREAK_MANDATORY,           0x2028 },
96     { G_UNICODE_BREAK_CARRIAGE_RETURN,     0x000D },
97     { G_UNICODE_BREAK_LINE_FEED,           0x000A },
98     { G_UNICODE_BREAK_COMBINING_MARK,      0x0300 },
99     { G_UNICODE_BREAK_SURROGATE,           0xD800 },
100     { G_UNICODE_BREAK_ZERO_WIDTH_SPACE,    0x200B },
101     { G_UNICODE_BREAK_INSEPARABLE,         0x2024 },
102     { G_UNICODE_BREAK_NON_BREAKING_GLUE,   0x00A0 },
103     { G_UNICODE_BREAK_CONTINGENT,          0xFFFC },
104     { G_UNICODE_BREAK_SPACE,               0x0020 },
105     { G_UNICODE_BREAK_AFTER,               0x05BE },
106     { G_UNICODE_BREAK_BEFORE,              0x02C8 },
107     { G_UNICODE_BREAK_BEFORE_AND_AFTER,    0x2014 },
108     { G_UNICODE_BREAK_HYPHEN,              0x002D },
109     { G_UNICODE_BREAK_NON_STARTER,         0x17D6 },
110     { G_UNICODE_BREAK_OPEN_PUNCTUATION,    0x0028 },
111     { G_UNICODE_BREAK_CLOSE_PARANTHESIS,   0x0029 },
112     { G_UNICODE_BREAK_CLOSE_PUNCTUATION,   0x007D },
113     { G_UNICODE_BREAK_QUOTATION,           0x0022 },
114     { G_UNICODE_BREAK_EXCLAMATION,         0x0021 },
115     { G_UNICODE_BREAK_IDEOGRAPHIC,         0x2E80 },
116     { G_UNICODE_BREAK_NUMERIC,             0x0030 },
117     { G_UNICODE_BREAK_INFIX_SEPARATOR,     0x002C },
118     { G_UNICODE_BREAK_SYMBOL,              0x002F },
119     { G_UNICODE_BREAK_ALPHABETIC,          0x0023 },
120     { G_UNICODE_BREAK_PREFIX,              0x0024 },
121     { G_UNICODE_BREAK_POSTFIX,             0x0025 },
122     { G_UNICODE_BREAK_COMPLEX_CONTEXT,     0x0E01 },
123     { G_UNICODE_BREAK_AMBIGUOUS,           0x00F7 },
124     { G_UNICODE_BREAK_UNKNOWN,             0xE000 },
125     { G_UNICODE_BREAK_NEXT_LINE,           0x0085 },
126     { G_UNICODE_BREAK_WORD_JOINER,         0x2060 },
127     { G_UNICODE_BREAK_HANGUL_L_JAMO,       0x1100 },
128     { G_UNICODE_BREAK_HANGUL_V_JAMO,       0x1160 },
129     { G_UNICODE_BREAK_HANGUL_T_JAMO,       0x11A8 },
130     { G_UNICODE_BREAK_HANGUL_LV_SYLLABLE,  0xAC00 },
131     { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, 0xAC01 },
132     { G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, 0x3041 },
133     { G_UNICODE_BREAK_HEBREW_LETTER,                0x05D0 },
134     { G_UNICODE_BREAK_REGIONAL_INDICATOR,           0x1F1F6 }
135   };
136
137   for (i = 0; i < G_N_ELEMENTS (examples); i++)
138     {
139       g_assert_cmpint (g_unichar_break_type (examples[i].c), ==, examples[i].type);
140     }
141 }
142
143 static void
144 test_unichar_script (void)
145 {
146   guint i;
147   struct {
148     GUnicodeScript script;
149     gunichar          c;
150   } examples[] = {
151     { G_UNICODE_SCRIPT_COMMON,                  0x002A },
152     { G_UNICODE_SCRIPT_INHERITED,               0x1CED },
153     { G_UNICODE_SCRIPT_INHERITED,               0x0670 },
154     { G_UNICODE_SCRIPT_ARABIC,                  0x060D },
155     { G_UNICODE_SCRIPT_ARMENIAN,                0x0559 },
156     { G_UNICODE_SCRIPT_BENGALI,                 0x09CD },
157     { G_UNICODE_SCRIPT_BOPOMOFO,                0x31B6 },
158     { G_UNICODE_SCRIPT_CHEROKEE,                0x13A2 },
159     { G_UNICODE_SCRIPT_COPTIC,                  0x2CFD },
160     { G_UNICODE_SCRIPT_CYRILLIC,                0x0482 },
161     { G_UNICODE_SCRIPT_DESERET,                0x10401 },
162     { G_UNICODE_SCRIPT_DEVANAGARI,              0x094D },
163     { G_UNICODE_SCRIPT_ETHIOPIC,                0x1258 },
164     { G_UNICODE_SCRIPT_GEORGIAN,                0x10FC },
165     { G_UNICODE_SCRIPT_GOTHIC,                 0x10341 },
166     { G_UNICODE_SCRIPT_GREEK,                   0x0375 },
167     { G_UNICODE_SCRIPT_GUJARATI,                0x0A83 },
168     { G_UNICODE_SCRIPT_GURMUKHI,                0x0A3C },
169     { G_UNICODE_SCRIPT_HAN,                     0x3005 },
170     { G_UNICODE_SCRIPT_HANGUL,                  0x1100 },
171     { G_UNICODE_SCRIPT_HEBREW,                  0x05BF },
172     { G_UNICODE_SCRIPT_HIRAGANA,                0x309F },
173     { G_UNICODE_SCRIPT_KANNADA,                 0x0CBC },
174     { G_UNICODE_SCRIPT_KATAKANA,                0x30FF },
175     { G_UNICODE_SCRIPT_KHMER,                   0x17DD },
176     { G_UNICODE_SCRIPT_LAO,                     0x0EDD },
177     { G_UNICODE_SCRIPT_LATIN,                   0x0061 },
178     { G_UNICODE_SCRIPT_MALAYALAM,               0x0D3D },
179     { G_UNICODE_SCRIPT_MONGOLIAN,               0x1843 },
180     { G_UNICODE_SCRIPT_MYANMAR,                 0x1031 },
181     { G_UNICODE_SCRIPT_OGHAM,                   0x169C },
182     { G_UNICODE_SCRIPT_OLD_ITALIC,             0x10322 },
183     { G_UNICODE_SCRIPT_ORIYA,                   0x0B3C },
184     { G_UNICODE_SCRIPT_RUNIC,                   0x16EF },
185     { G_UNICODE_SCRIPT_SINHALA,                 0x0DBD },
186     { G_UNICODE_SCRIPT_SYRIAC,                  0x0711 },
187     { G_UNICODE_SCRIPT_TAMIL,                   0x0B82 },
188     { G_UNICODE_SCRIPT_TELUGU,                  0x0C03 },
189     { G_UNICODE_SCRIPT_THAANA,                  0x07B1 },
190     { G_UNICODE_SCRIPT_THAI,                    0x0E31 },
191     { G_UNICODE_SCRIPT_TIBETAN,                 0x0FD4 },
192     { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,     0x1400 },
193     { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL,     0x1401 },
194     { G_UNICODE_SCRIPT_YI,                      0xA015 },
195     { G_UNICODE_SCRIPT_TAGALOG,                 0x1700 },
196     { G_UNICODE_SCRIPT_HANUNOO,                 0x1720 },
197     { G_UNICODE_SCRIPT_BUHID,                   0x1740 },
198     { G_UNICODE_SCRIPT_TAGBANWA,                0x1760 },
199     { G_UNICODE_SCRIPT_BRAILLE,                 0x2800 },
200     { G_UNICODE_SCRIPT_CYPRIOT,                0x10808 },
201     { G_UNICODE_SCRIPT_LIMBU,                   0x1932 },
202     { G_UNICODE_SCRIPT_OSMANYA,                0x10480 },
203     { G_UNICODE_SCRIPT_SHAVIAN,                0x10450 },
204     { G_UNICODE_SCRIPT_LINEAR_B,               0x10000 },
205     { G_UNICODE_SCRIPT_TAI_LE,                  0x1950 },
206     { G_UNICODE_SCRIPT_UGARITIC,               0x1039F },
207     { G_UNICODE_SCRIPT_NEW_TAI_LUE,             0x1980 },
208     { G_UNICODE_SCRIPT_BUGINESE,                0x1A1F },
209     { G_UNICODE_SCRIPT_GLAGOLITIC,              0x2C00 },
210     { G_UNICODE_SCRIPT_TIFINAGH,                0x2D6F },
211     { G_UNICODE_SCRIPT_SYLOTI_NAGRI,            0xA800 },
212     { G_UNICODE_SCRIPT_OLD_PERSIAN,            0x103D0 },
213     { G_UNICODE_SCRIPT_KHAROSHTHI,             0x10A3F },
214     { G_UNICODE_SCRIPT_UNKNOWN,              0x1111111 },
215     { G_UNICODE_SCRIPT_BALINESE,                0x1B04 },
216     { G_UNICODE_SCRIPT_CUNEIFORM,              0x12000 },
217     { G_UNICODE_SCRIPT_PHOENICIAN,             0x10900 },
218     { G_UNICODE_SCRIPT_PHAGS_PA,                0xA840 },
219     { G_UNICODE_SCRIPT_NKO,                     0x07C0 },
220     { G_UNICODE_SCRIPT_KAYAH_LI,                0xA900 },
221     { G_UNICODE_SCRIPT_LEPCHA,                  0x1C00 },
222     { G_UNICODE_SCRIPT_REJANG,                  0xA930 },
223     { G_UNICODE_SCRIPT_SUNDANESE,               0x1B80 },
224     { G_UNICODE_SCRIPT_SAURASHTRA,              0xA880 },
225     { G_UNICODE_SCRIPT_CHAM,                    0xAA00 },
226     { G_UNICODE_SCRIPT_OL_CHIKI,                0x1C50 },
227     { G_UNICODE_SCRIPT_VAI,                     0xA500 },
228     { G_UNICODE_SCRIPT_CARIAN,                 0x102A0 },
229     { G_UNICODE_SCRIPT_LYCIAN,                 0x10280 },
230     { G_UNICODE_SCRIPT_LYDIAN,                 0x1093F },
231     { G_UNICODE_SCRIPT_AVESTAN,                0x10B00 },
232     { G_UNICODE_SCRIPT_BAMUM,                   0xA6A0 },
233     { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS,   0x13000 },
234     { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC,       0x10840 },
235     { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI,  0x10B60 },
236     { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, 0x10B40 },
237     { G_UNICODE_SCRIPT_JAVANESE,                0xA980 },
238     { G_UNICODE_SCRIPT_KAITHI,                 0x11082 },
239     { G_UNICODE_SCRIPT_LISU,                    0xA4D0 },
240     { G_UNICODE_SCRIPT_MEETEI_MAYEK,            0xABE5 },
241     { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN,      0x10A60 },
242     { G_UNICODE_SCRIPT_OLD_TURKIC,             0x10C00 },
243     { G_UNICODE_SCRIPT_SAMARITAN,               0x0800 },
244     { G_UNICODE_SCRIPT_TAI_THAM,                0x1A20 },
245     { G_UNICODE_SCRIPT_TAI_VIET,                0xAA80 },
246     { G_UNICODE_SCRIPT_BATAK,                   0x1BC0 },
247     { G_UNICODE_SCRIPT_BRAHMI,                 0x11000 },
248     { G_UNICODE_SCRIPT_MANDAIC,                 0x0840 },
249     { G_UNICODE_SCRIPT_CHAKMA,                 0x11100 },
250     { G_UNICODE_SCRIPT_MEROITIC_CURSIVE,       0x109A0 },
251     { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS,   0x10980 },
252     { G_UNICODE_SCRIPT_MIAO,                   0x16F00 },
253     { G_UNICODE_SCRIPT_SHARADA,                0x11180 },
254     { G_UNICODE_SCRIPT_SORA_SOMPENG,           0x110D0 },
255     { G_UNICODE_SCRIPT_TAKRI,                  0x11680 },
256     { G_UNICODE_SCRIPT_BASSA_VAH,              0x16AD0 },
257     { G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN,     0x10530 },
258     { G_UNICODE_SCRIPT_DUPLOYAN,               0x1BC00 },
259     { G_UNICODE_SCRIPT_ELBASAN,                0x10500 },
260     { G_UNICODE_SCRIPT_GRANTHA,                0x11301 },
261     { G_UNICODE_SCRIPT_KHOJKI,                 0x11200 },
262     { G_UNICODE_SCRIPT_KHUDAWADI,              0x112B0 },
263     { G_UNICODE_SCRIPT_LINEAR_A,               0x10600 },
264     { G_UNICODE_SCRIPT_MAHAJANI,               0x11150 },
265     { G_UNICODE_SCRIPT_MANICHAEAN,             0x10AC0 },
266     { G_UNICODE_SCRIPT_MENDE_KIKAKUI,          0x1E800 },
267     { G_UNICODE_SCRIPT_MODI,                   0x11600 },
268     { G_UNICODE_SCRIPT_MRO,                    0x16A40 },
269     { G_UNICODE_SCRIPT_NABATAEAN,              0x10880 },
270     { G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN,      0x10A80 },
271     { G_UNICODE_SCRIPT_OLD_PERMIC,             0x10350 },
272     { G_UNICODE_SCRIPT_PAHAWH_HMONG,           0x16B00 },
273     { G_UNICODE_SCRIPT_PALMYRENE,              0x10860 },
274     { G_UNICODE_SCRIPT_PAU_CIN_HAU,            0x11AC0 },
275     { G_UNICODE_SCRIPT_PSALTER_PAHLAVI,        0x10B80 },
276     { G_UNICODE_SCRIPT_SIDDHAM,                0x11580 },
277     { G_UNICODE_SCRIPT_TIRHUTA,                0x11480 },
278     { G_UNICODE_SCRIPT_WARANG_CITI,            0x118A0 },
279   };
280   for (i = 0; i < G_N_ELEMENTS (examples); i++)
281     {
282       g_assert_cmpint (g_unichar_get_script (examples[i].c), ==, examples[i].script);
283     }
284 }
285
286 static void
287 test_combining_class (void)
288 {
289   guint i;
290   struct {
291     gint class;
292     gunichar          c;
293   } examples[] = {
294     {   0, 0x0020 },
295     {   1, 0x0334 },
296     {   7, 0x093C },
297     {   8, 0x3099 },
298     {   9, 0x094D },
299     {  10, 0x05B0 },
300     {  11, 0x05B1 },
301     {  12, 0x05B2 },
302     {  13, 0x05B3 },
303     {  14, 0x05B4 },
304     {  15, 0x05B5 },
305     {  16, 0x05B6 },
306     {  17, 0x05B7 },
307     {  18, 0x05B8 },
308     {  19, 0x05B9 },
309     {  20, 0x05BB },
310     {  21, 0x05BC },
311     {  22, 0x05BD },
312     {  23, 0x05BF },
313     {  24, 0x05C1 },
314     {  25, 0x05C2 },
315     {  26, 0xFB1E },
316     {  27, 0x064B },
317     {  28, 0x064C },
318     {  29, 0x064D },
319     /* ... */
320     { 228, 0x05AE },
321     { 230, 0x0300 },
322     { 232, 0x302C },
323     { 233, 0x0362 },
324     { 234, 0x0360 },
325     { 234, 0x1DCD },
326     { 240, 0x0345 }
327   };
328   for (i = 0; i < G_N_ELEMENTS (examples); i++)
329     {
330       g_assert_cmpint (g_unichar_combining_class (examples[i].c), ==, examples[i].class);
331     }
332 }
333
334 static void
335 test_mirror (void)
336 {
337   gunichar mirror;
338
339   g_assert (g_unichar_get_mirror_char ('(', &mirror));
340   g_assert_cmpint (mirror, ==, ')');
341   g_assert (g_unichar_get_mirror_char (')', &mirror));
342   g_assert_cmpint (mirror, ==, '(');
343   g_assert (g_unichar_get_mirror_char ('{', &mirror));
344   g_assert_cmpint (mirror, ==, '}');
345   g_assert (g_unichar_get_mirror_char ('}', &mirror));
346   g_assert_cmpint (mirror, ==, '{');
347   g_assert (g_unichar_get_mirror_char (0x208D, &mirror));
348   g_assert_cmpint (mirror, ==, 0x208E);
349   g_assert (g_unichar_get_mirror_char (0x208E, &mirror));
350   g_assert_cmpint (mirror, ==, 0x208D);
351   g_assert (!g_unichar_get_mirror_char ('a', &mirror));
352 }
353
354 static void
355 test_mark (void)
356 {
357   g_assert (g_unichar_ismark (0x0903));
358   g_assert (g_unichar_ismark (0x20DD));
359   g_assert (g_unichar_ismark (0xA806));
360   g_assert (!g_unichar_ismark ('a'));
361 }
362
363 static void
364 test_zerowidth (void)
365 {
366   g_assert (!g_unichar_iszerowidth (0x00AD));
367   g_assert (!g_unichar_iszerowidth (0x00AD));
368   g_assert (!g_unichar_iszerowidth (0x115F));
369   g_assert (g_unichar_iszerowidth (0x1160));
370   g_assert (g_unichar_iszerowidth (0x11AA));
371   g_assert (g_unichar_iszerowidth (0x11FF));
372   g_assert (!g_unichar_iszerowidth (0x1200));
373   g_assert (g_unichar_iszerowidth (0x200B));
374   g_assert (g_unichar_iszerowidth (0x591));
375 }
376
377 static void
378 test_title (void)
379 {
380   g_assert (g_unichar_istitle (0x01c5));
381   g_assert (g_unichar_istitle (0x1f88));
382   g_assert (g_unichar_istitle (0x1fcc));
383   g_assert (!g_unichar_istitle ('a'));
384   g_assert (!g_unichar_istitle ('A'));
385
386   g_assert_cmphex (g_unichar_totitle (0x01c6), ==, 0x01c5);
387   g_assert_cmphex (g_unichar_totitle (0x01c4), ==, 0x01c5);
388   g_assert_cmphex (g_unichar_totitle (0x01c5), ==, 0x01c5);
389   g_assert_cmphex (g_unichar_totitle (0x1f80), ==, 0x1f88);
390   g_assert_cmphex (g_unichar_totitle (0x1f88), ==, 0x1f88);
391   g_assert_cmphex (g_unichar_totitle ('a'), ==, 'A');
392   g_assert_cmphex (g_unichar_totitle ('A'), ==, 'A');
393 }
394
395 static void
396 test_cases (void)
397 {
398   g_assert_cmphex (g_unichar_toupper ('a'), ==, 'A');
399   g_assert_cmphex (g_unichar_toupper ('A'), ==, 'A');
400   g_assert_cmphex (g_unichar_toupper (0x01C5), ==, 0x01C4);
401   g_assert_cmphex (g_unichar_toupper (0x01C6), ==, 0x01C4);
402   g_assert_cmphex (g_unichar_tolower ('A'), ==, 'a');
403   g_assert_cmphex (g_unichar_tolower ('a'), ==, 'a');
404   g_assert_cmphex (g_unichar_tolower (0x01C4), ==, 0x01C6);
405   g_assert_cmphex (g_unichar_tolower (0x01C5), ==, 0x01C6);
406   g_assert_cmphex (g_unichar_tolower (0x1F8A), ==, 0x1F82);
407   g_assert_cmphex (g_unichar_totitle (0x1F8A), ==, 0x1F8A);
408   g_assert_cmphex (g_unichar_toupper (0x1F8A), ==, 0x1F8A);
409   g_assert_cmphex (g_unichar_tolower (0x1FB2), ==, 0x1FB2);
410   g_assert_cmphex (g_unichar_toupper (0x1FB2), ==, 0x1FB2);
411 }
412
413 static void
414 test_defined (void)
415 {
416   g_assert (g_unichar_isdefined (0x0903));
417   g_assert (g_unichar_isdefined (0x20DD));
418   g_assert (g_unichar_isdefined (0x20BA));
419   g_assert (g_unichar_isdefined (0xA806));
420   g_assert (g_unichar_isdefined ('a'));
421   g_assert (!g_unichar_isdefined (0x10C49));
422   g_assert (!g_unichar_isdefined (0x169D));
423 }
424
425 static void
426 test_wide (void)
427 {
428   guint i;
429   struct {
430     gunichar c;
431     enum {
432       NOT_WIDE,
433       WIDE_CJK,
434       WIDE
435     } wide;
436   } examples[] = {
437     /* Neutral */
438     {   0x0000, NOT_WIDE },
439     {   0x0483, NOT_WIDE },
440     {   0x0641, NOT_WIDE },
441     {   0xFFFC, NOT_WIDE },
442     {  0x10000, NOT_WIDE },
443     {  0xE0001, NOT_WIDE },
444
445     /* Narrow */
446     {   0x0020, NOT_WIDE },
447     {   0x0041, NOT_WIDE },
448     {   0x27E6, NOT_WIDE },
449
450     /* Halfwidth */
451     {   0x20A9, NOT_WIDE },
452     {   0xFF61, NOT_WIDE },
453     {   0xFF69, NOT_WIDE },
454     {   0xFFEE, NOT_WIDE },
455
456     /* Ambiguous */
457     {   0x00A1, WIDE_CJK },
458     {   0x00BE, WIDE_CJK },
459     {   0x02DD, WIDE_CJK },
460     {   0x2020, WIDE_CJK },
461     {   0xFFFD, WIDE_CJK },
462     {   0x00A1, WIDE_CJK },
463     {  0x1F100, WIDE_CJK },
464     {  0xE0100, WIDE_CJK },
465     { 0x100000, WIDE_CJK },
466     { 0x10FFFD, WIDE_CJK },
467
468     /* Fullwidth */
469     {   0x3000, WIDE },
470     {   0xFF60, WIDE },
471
472     /* Wide */
473     {   0x2329, WIDE },
474     {   0x3001, WIDE },
475     {   0xFE69, WIDE },
476     {  0x30000, WIDE },
477     {  0x3FFFD, WIDE },
478
479     /* Default Wide blocks */
480     {   0x4DBF, WIDE },
481     {   0x9FFF, WIDE },
482     {   0xFAFF, WIDE },
483     {  0x2A6DF, WIDE },
484     {  0x2B73F, WIDE },
485     {  0x2B81F, WIDE },
486     {  0x2FA1F, WIDE },
487
488     /* Uniode-5.2 character additions */
489     /* Wide */
490     {   0x115F, WIDE },
491
492     /* Uniode-6.0 character additions */
493     /* Wide */
494     {  0x2B740, WIDE },
495     {  0x1B000, WIDE },
496
497     { 0x111111, NOT_WIDE }
498   };
499
500   for (i = 0; i < G_N_ELEMENTS (examples); i++)
501     {
502       g_assert_cmpint (g_unichar_iswide (examples[i].c), ==, (examples[i].wide == WIDE));
503       g_assert_cmpint (g_unichar_iswide_cjk (examples[i].c), ==, (examples[i].wide != NOT_WIDE));
504     }
505 };
506
507 static void
508 test_compose (void)
509 {
510   gunichar ch;
511
512   /* Not composable */
513   g_assert (!g_unichar_compose (0x0041, 0x0042, &ch) && ch == 0);
514   g_assert (!g_unichar_compose (0x0041, 0, &ch) && ch == 0);
515   g_assert (!g_unichar_compose (0x0066, 0x0069, &ch) && ch == 0);
516
517   /* Tricky non-composable */
518   g_assert (!g_unichar_compose (0x0308, 0x0301, &ch) && ch == 0); /* !0x0344 */
519   g_assert (!g_unichar_compose (0x0F71, 0x0F72, &ch) && ch == 0); /* !0x0F73 */
520
521   /* Singletons should not compose */
522   g_assert (!g_unichar_compose (0x212B, 0, &ch) && ch == 0);
523   g_assert (!g_unichar_compose (0x00C5, 0, &ch) && ch == 0);
524   g_assert (!g_unichar_compose (0x2126, 0, &ch) && ch == 0);
525   g_assert (!g_unichar_compose (0x03A9, 0, &ch) && ch == 0);
526
527   /* Pairs */
528   g_assert (g_unichar_compose (0x0041, 0x030A, &ch) && ch == 0x00C5);
529   g_assert (g_unichar_compose (0x006F, 0x0302, &ch) && ch == 0x00F4);
530   g_assert (g_unichar_compose (0x1E63, 0x0307, &ch) && ch == 0x1E69);
531   g_assert (g_unichar_compose (0x0073, 0x0323, &ch) && ch == 0x1E63);
532   g_assert (g_unichar_compose (0x0064, 0x0307, &ch) && ch == 0x1E0B);
533   g_assert (g_unichar_compose (0x0064, 0x0323, &ch) && ch == 0x1E0D);
534
535   /* Hangul */
536   g_assert (g_unichar_compose (0xD4CC, 0x11B6, &ch) && ch == 0xD4DB);
537   g_assert (g_unichar_compose (0x1111, 0x1171, &ch) && ch == 0xD4CC);
538   g_assert (g_unichar_compose (0xCE20, 0x11B8, &ch) && ch == 0xCE31);
539   g_assert (g_unichar_compose (0x110E, 0x1173, &ch) && ch == 0xCE20);
540 }
541
542 static void
543 test_decompose (void)
544 {
545   gunichar a, b;
546
547   /* Not decomposable */
548   g_assert (!g_unichar_decompose (0x0041, &a, &b) && a == 0x0041 && b == 0);
549   g_assert (!g_unichar_decompose (0xFB01, &a, &b) && a == 0xFB01 && b == 0);
550
551   /* Singletons */
552   g_assert (g_unichar_decompose (0x212B, &a, &b) && a == 0x00C5 && b == 0);
553   g_assert (g_unichar_decompose (0x2126, &a, &b) && a == 0x03A9 && b == 0);
554
555   /* Tricky pairs */
556   g_assert (g_unichar_decompose (0x0344, &a, &b) && a == 0x0308 && b == 0x0301);
557   g_assert (g_unichar_decompose (0x0F73, &a, &b) && a == 0x0F71 && b == 0x0F72);
558
559   /* Pairs */
560   g_assert (g_unichar_decompose (0x00C5, &a, &b) && a == 0x0041 && b == 0x030A);
561   g_assert (g_unichar_decompose (0x00F4, &a, &b) && a == 0x006F && b == 0x0302);
562   g_assert (g_unichar_decompose (0x1E69, &a, &b) && a == 0x1E63 && b == 0x0307);
563   g_assert (g_unichar_decompose (0x1E63, &a, &b) && a == 0x0073 && b == 0x0323);
564   g_assert (g_unichar_decompose (0x1E0B, &a, &b) && a == 0x0064 && b == 0x0307);
565   g_assert (g_unichar_decompose (0x1E0D, &a, &b) && a == 0x0064 && b == 0x0323);
566
567   /* Hangul */
568   g_assert (g_unichar_decompose (0xD4DB, &a, &b) && a == 0xD4CC && b == 0x11B6);
569   g_assert (g_unichar_decompose (0xD4CC, &a, &b) && a == 0x1111 && b == 0x1171);
570   g_assert (g_unichar_decompose (0xCE31, &a, &b) && a == 0xCE20 && b == 0x11B8);
571   g_assert (g_unichar_decompose (0xCE20, &a, &b) && a == 0x110E && b == 0x1173);
572 }
573
574 static void
575 test_fully_decompose_canonical (void)
576 {
577   gunichar decomp[5];
578   gsize len;
579
580 #define TEST_DECOMP(ch, expected_len, a, b, c, d) \
581   len = g_unichar_fully_decompose (ch, FALSE, decomp, G_N_ELEMENTS (decomp)); \
582   g_assert_cmpint (expected_len, ==, len); \
583   if (expected_len >= 1) g_assert_cmphex (decomp[0], ==, a); \
584   if (expected_len >= 2) g_assert_cmphex (decomp[1], ==, b); \
585   if (expected_len >= 3) g_assert_cmphex (decomp[2], ==, c); \
586   if (expected_len >= 4) g_assert_cmphex (decomp[3], ==, d); \
587
588 #define TEST0(ch)               TEST_DECOMP (ch, 1, ch, 0, 0, 0)
589 #define TEST1(ch, a)            TEST_DECOMP (ch, 1, a, 0, 0, 0)
590 #define TEST2(ch, a, b)         TEST_DECOMP (ch, 2, a, b, 0, 0)
591 #define TEST3(ch, a, b, c)      TEST_DECOMP (ch, 3, a, b, c, 0)
592 #define TEST4(ch, a, b, c, d)   TEST_DECOMP (ch, 4, a, b, c, d)
593
594   /* Not decomposable */
595   TEST0 (0x0041);
596   TEST0 (0xFB01);
597
598   /* Singletons */
599   TEST2 (0x212B, 0x0041, 0x030A);
600   TEST1 (0x2126, 0x03A9);
601
602   /* Tricky pairs */
603   TEST2 (0x0344, 0x0308, 0x0301);
604   TEST2 (0x0F73, 0x0F71, 0x0F72);
605
606   /* General */
607   TEST2 (0x00C5, 0x0041, 0x030A);
608   TEST2 (0x00F4, 0x006F, 0x0302);
609   TEST3 (0x1E69, 0x0073, 0x0323, 0x0307);
610   TEST2 (0x1E63, 0x0073, 0x0323);
611   TEST2 (0x1E0B, 0x0064, 0x0307);
612   TEST2 (0x1E0D, 0x0064, 0x0323);
613
614   /* Hangul */
615   TEST3 (0xD4DB, 0x1111, 0x1171, 0x11B6);
616   TEST2 (0xD4CC, 0x1111, 0x1171);
617   TEST3 (0xCE31, 0x110E, 0x1173, 0x11B8);
618   TEST2 (0xCE20, 0x110E, 0x1173);
619
620 #undef TEST_DECOMP
621 }
622
623 static void
624 test_canonical_decomposition (void)
625 {
626   gunichar *decomp;
627   gsize len;
628
629 #define TEST_DECOMP(ch, expected_len, a, b, c, d) \
630   decomp = g_unicode_canonical_decomposition (ch, &len); \
631   g_assert_cmpint (expected_len, ==, len); \
632   if (expected_len >= 1) g_assert_cmphex (decomp[0], ==, a); \
633   if (expected_len >= 2) g_assert_cmphex (decomp[1], ==, b); \
634   if (expected_len >= 3) g_assert_cmphex (decomp[2], ==, c); \
635   if (expected_len >= 4) g_assert_cmphex (decomp[3], ==, d); \
636   g_free (decomp);
637
638 #define TEST0(ch)               TEST_DECOMP (ch, 1, ch, 0, 0, 0)
639 #define TEST1(ch, a)            TEST_DECOMP (ch, 1, a, 0, 0, 0)
640 #define TEST2(ch, a, b)         TEST_DECOMP (ch, 2, a, b, 0, 0)
641 #define TEST3(ch, a, b, c)      TEST_DECOMP (ch, 3, a, b, c, 0)
642 #define TEST4(ch, a, b, c, d)   TEST_DECOMP (ch, 4, a, b, c, d)
643
644   /* Not decomposable */
645   TEST0 (0x0041);
646   TEST0 (0xFB01);
647
648   /* Singletons */
649   TEST2 (0x212B, 0x0041, 0x030A);
650   TEST1 (0x2126, 0x03A9);
651
652   /* Tricky pairs */
653   TEST2 (0x0344, 0x0308, 0x0301);
654   TEST2 (0x0F73, 0x0F71, 0x0F72);
655
656   /* General */
657   TEST2 (0x00C5, 0x0041, 0x030A);
658   TEST2 (0x00F4, 0x006F, 0x0302);
659   TEST3 (0x1E69, 0x0073, 0x0323, 0x0307);
660   TEST2 (0x1E63, 0x0073, 0x0323);
661   TEST2 (0x1E0B, 0x0064, 0x0307);
662   TEST2 (0x1E0D, 0x0064, 0x0323);
663
664   /* Hangul */
665   TEST3 (0xD4DB, 0x1111, 0x1171, 0x11B6);
666   TEST2 (0xD4CC, 0x1111, 0x1171);
667   TEST3 (0xCE31, 0x110E, 0x1173, 0x11B8);
668   TEST2 (0xCE20, 0x110E, 0x1173);
669
670 #undef TEST_DECOMP
671 }
672
673 static void
674 test_decompose_tail (void)
675 {
676   gunichar ch, a, b, c, d;
677
678   /* Test that whenever a char ch decomposes into a and b, b itself
679    * won't decompose any further. */
680
681   for (ch = 0; ch < 0x110000; ch++)
682     if (g_unichar_decompose (ch, &a, &b))
683       g_assert (!g_unichar_decompose (b, &c, &d));
684     else
685       {
686         g_assert_cmpuint (a, ==, ch);
687         g_assert_cmpuint (b, ==, 0);
688       }
689 }
690
691 static void
692 test_fully_decompose_len (void)
693 {
694   gunichar ch;
695
696   /* Test that all canonical decompositions are at most 4 in length,
697    * and compatibility decompositions are at most 18 in length.
698    */
699
700   for (ch = 0; ch < 0x110000; ch++) {
701     g_assert_cmpint (g_unichar_fully_decompose (ch, FALSE, NULL, 0), <=, 4);
702     g_assert_cmpint (g_unichar_fully_decompose (ch, TRUE,  NULL, 0), <=, 18);
703   }
704 }
705
706 static void
707 test_iso15924 (void)
708 {
709   const struct {
710     GUnicodeScript script;
711     char four_letter_code[5];
712   } data[] = {
713     { G_UNICODE_SCRIPT_COMMON,             "Zyyy" },
714     { G_UNICODE_SCRIPT_INHERITED,          "Zinh" },
715     { G_UNICODE_SCRIPT_ARABIC,             "Arab" },
716     { G_UNICODE_SCRIPT_ARMENIAN,           "Armn" },
717     { G_UNICODE_SCRIPT_BENGALI,            "Beng" },
718     { G_UNICODE_SCRIPT_BOPOMOFO,           "Bopo" },
719     { G_UNICODE_SCRIPT_CHEROKEE,           "Cher" },
720     { G_UNICODE_SCRIPT_COPTIC,             "Copt" },
721     { G_UNICODE_SCRIPT_CYRILLIC,           "Cyrl" },
722     { G_UNICODE_SCRIPT_DESERET,            "Dsrt" },
723     { G_UNICODE_SCRIPT_DEVANAGARI,         "Deva" },
724     { G_UNICODE_SCRIPT_ETHIOPIC,           "Ethi" },
725     { G_UNICODE_SCRIPT_GEORGIAN,           "Geor" },
726     { G_UNICODE_SCRIPT_GOTHIC,             "Goth" },
727     { G_UNICODE_SCRIPT_GREEK,              "Grek" },
728     { G_UNICODE_SCRIPT_GUJARATI,           "Gujr" },
729     { G_UNICODE_SCRIPT_GURMUKHI,           "Guru" },
730     { G_UNICODE_SCRIPT_HAN,                "Hani" },
731     { G_UNICODE_SCRIPT_HANGUL,             "Hang" },
732     { G_UNICODE_SCRIPT_HEBREW,             "Hebr" },
733     { G_UNICODE_SCRIPT_HIRAGANA,           "Hira" },
734     { G_UNICODE_SCRIPT_KANNADA,            "Knda" },
735     { G_UNICODE_SCRIPT_KATAKANA,           "Kana" },
736     { G_UNICODE_SCRIPT_KHMER,              "Khmr" },
737     { G_UNICODE_SCRIPT_LAO,                "Laoo" },
738     { G_UNICODE_SCRIPT_LATIN,              "Latn" },
739     { G_UNICODE_SCRIPT_MALAYALAM,          "Mlym" },
740     { G_UNICODE_SCRIPT_MONGOLIAN,          "Mong" },
741     { G_UNICODE_SCRIPT_MYANMAR,            "Mymr" },
742     { G_UNICODE_SCRIPT_OGHAM,              "Ogam" },
743     { G_UNICODE_SCRIPT_OLD_ITALIC,         "Ital" },
744     { G_UNICODE_SCRIPT_ORIYA,              "Orya" },
745     { G_UNICODE_SCRIPT_RUNIC,              "Runr" },
746     { G_UNICODE_SCRIPT_SINHALA,            "Sinh" },
747     { G_UNICODE_SCRIPT_SYRIAC,             "Syrc" },
748     { G_UNICODE_SCRIPT_TAMIL,              "Taml" },
749     { G_UNICODE_SCRIPT_TELUGU,             "Telu" },
750     { G_UNICODE_SCRIPT_THAANA,             "Thaa" },
751     { G_UNICODE_SCRIPT_THAI,               "Thai" },
752     { G_UNICODE_SCRIPT_TIBETAN,            "Tibt" },
753     { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, "Cans" },
754     { G_UNICODE_SCRIPT_YI,                 "Yiii" },
755     { G_UNICODE_SCRIPT_TAGALOG,            "Tglg" },
756     { G_UNICODE_SCRIPT_HANUNOO,            "Hano" },
757     { G_UNICODE_SCRIPT_BUHID,              "Buhd" },
758     { G_UNICODE_SCRIPT_TAGBANWA,           "Tagb" },
759
760     /* Unicode-4.0 additions */
761     { G_UNICODE_SCRIPT_BRAILLE,            "Brai" },
762     { G_UNICODE_SCRIPT_CYPRIOT,            "Cprt" },
763     { G_UNICODE_SCRIPT_LIMBU,              "Limb" },
764     { G_UNICODE_SCRIPT_OSMANYA,            "Osma" },
765     { G_UNICODE_SCRIPT_SHAVIAN,            "Shaw" },
766     { G_UNICODE_SCRIPT_LINEAR_B,           "Linb" },
767     { G_UNICODE_SCRIPT_TAI_LE,             "Tale" },
768     { G_UNICODE_SCRIPT_UGARITIC,           "Ugar" },
769
770     /* Unicode-4.1 additions */
771     { G_UNICODE_SCRIPT_NEW_TAI_LUE,        "Talu" },
772     { G_UNICODE_SCRIPT_BUGINESE,           "Bugi" },
773     { G_UNICODE_SCRIPT_GLAGOLITIC,         "Glag" },
774     { G_UNICODE_SCRIPT_TIFINAGH,           "Tfng" },
775     { G_UNICODE_SCRIPT_SYLOTI_NAGRI,       "Sylo" },
776     { G_UNICODE_SCRIPT_OLD_PERSIAN,        "Xpeo" },
777     { G_UNICODE_SCRIPT_KHAROSHTHI,         "Khar" },
778
779     /* Unicode-5.0 additions */
780     { G_UNICODE_SCRIPT_UNKNOWN,            "Zzzz" },
781     { G_UNICODE_SCRIPT_BALINESE,           "Bali" },
782     { G_UNICODE_SCRIPT_CUNEIFORM,          "Xsux" },
783     { G_UNICODE_SCRIPT_PHOENICIAN,         "Phnx" },
784     { G_UNICODE_SCRIPT_PHAGS_PA,           "Phag" },
785     { G_UNICODE_SCRIPT_NKO,                "Nkoo" },
786
787     /* Unicode-5.1 additions */
788     { G_UNICODE_SCRIPT_KAYAH_LI,           "Kali" },
789     { G_UNICODE_SCRIPT_LEPCHA,             "Lepc" },
790     { G_UNICODE_SCRIPT_REJANG,             "Rjng" },
791     { G_UNICODE_SCRIPT_SUNDANESE,          "Sund" },
792     { G_UNICODE_SCRIPT_SAURASHTRA,         "Saur" },
793     { G_UNICODE_SCRIPT_CHAM,               "Cham" },
794     { G_UNICODE_SCRIPT_OL_CHIKI,           "Olck" },
795     { G_UNICODE_SCRIPT_VAI,                "Vaii" },
796     { G_UNICODE_SCRIPT_CARIAN,             "Cari" },
797     { G_UNICODE_SCRIPT_LYCIAN,             "Lyci" },
798     { G_UNICODE_SCRIPT_LYDIAN,             "Lydi" },
799
800     /* Unicode-5.2 additions */
801     { G_UNICODE_SCRIPT_AVESTAN,                "Avst" },
802     { G_UNICODE_SCRIPT_BAMUM,                  "Bamu" },
803     { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS,   "Egyp" },
804     { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC,       "Armi" },
805     { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI,  "Phli" },
806     { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, "Prti" },
807     { G_UNICODE_SCRIPT_JAVANESE,               "Java" },
808     { G_UNICODE_SCRIPT_KAITHI,                 "Kthi" },
809     { G_UNICODE_SCRIPT_LISU,                   "Lisu" },
810     { G_UNICODE_SCRIPT_MEETEI_MAYEK,           "Mtei" },
811     { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN,      "Sarb" },
812     { G_UNICODE_SCRIPT_OLD_TURKIC,             "Orkh" },
813     { G_UNICODE_SCRIPT_SAMARITAN,              "Samr" },
814     { G_UNICODE_SCRIPT_TAI_THAM,               "Lana" },
815     { G_UNICODE_SCRIPT_TAI_VIET,               "Tavt" },
816
817     /* Unicode-6.0 additions */
818     { G_UNICODE_SCRIPT_BATAK,                  "Batk" },
819     { G_UNICODE_SCRIPT_BRAHMI,                 "Brah" },
820     { G_UNICODE_SCRIPT_MANDAIC,                "Mand" },
821
822     /* Unicode-6.1 additions */
823     { G_UNICODE_SCRIPT_CHAKMA,                 "Cakm" },
824     { G_UNICODE_SCRIPT_MEROITIC_CURSIVE,       "Merc" },
825     { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS,   "Mero" },
826     { G_UNICODE_SCRIPT_MIAO,                   "Plrd" },
827     { G_UNICODE_SCRIPT_SHARADA,                "Shrd" },
828     { G_UNICODE_SCRIPT_SORA_SOMPENG,           "Sora" },
829     { G_UNICODE_SCRIPT_TAKRI,                  "Takr" },
830
831     /* Unicode 7.0 additions */
832     { G_UNICODE_SCRIPT_BASSA_VAH,              "Bass" },
833     { G_UNICODE_SCRIPT_CAUCASIAN_ALBANIAN,     "Aghb" },
834     { G_UNICODE_SCRIPT_DUPLOYAN,               "Dupl" },
835     { G_UNICODE_SCRIPT_ELBASAN,                "Elba" },
836     { G_UNICODE_SCRIPT_GRANTHA,                "Gran" },
837     { G_UNICODE_SCRIPT_KHOJKI,                 "Khoj" },
838     { G_UNICODE_SCRIPT_KHUDAWADI,              "Sind" },
839     { G_UNICODE_SCRIPT_LINEAR_A,               "Lina" },
840     { G_UNICODE_SCRIPT_MAHAJANI,               "Mahj" },
841     { G_UNICODE_SCRIPT_MANICHAEAN,             "Manu" },
842     { G_UNICODE_SCRIPT_MENDE_KIKAKUI,          "Mend" },
843     { G_UNICODE_SCRIPT_MODI,                   "Modi" },
844     { G_UNICODE_SCRIPT_MRO,                    "Mroo" },
845     { G_UNICODE_SCRIPT_NABATAEAN,              "Nbat" },
846     { G_UNICODE_SCRIPT_OLD_NORTH_ARABIAN,      "Narb" },
847     { G_UNICODE_SCRIPT_OLD_PERMIC,             "Perm" },
848     { G_UNICODE_SCRIPT_PAHAWH_HMONG,           "Hmng" },
849     { G_UNICODE_SCRIPT_PALMYRENE,              "Palm" },
850     { G_UNICODE_SCRIPT_PAU_CIN_HAU,            "Pauc" },
851     { G_UNICODE_SCRIPT_PSALTER_PAHLAVI,        "Phlp" },
852     { G_UNICODE_SCRIPT_SIDDHAM,                "Sidd" },
853     { G_UNICODE_SCRIPT_TIRHUTA,                "Tirh" },
854     { G_UNICODE_SCRIPT_WARANG_CITI,            "Wara" },
855   };
856   guint i;
857
858   g_assert_cmphex (0, ==, g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_INVALID_CODE));
859   g_assert_cmphex (0x5A7A7A7A, ==, g_unicode_script_to_iso15924 (1000));
860   g_assert_cmphex (0x41726162, ==, g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_ARABIC));
861
862   g_assert_cmphex (G_UNICODE_SCRIPT_INVALID_CODE, ==, g_unicode_script_from_iso15924 (0));
863   g_assert_cmphex (G_UNICODE_SCRIPT_UNKNOWN, ==, g_unicode_script_from_iso15924 (0x12345678));
864
865 #define PACK(a,b,c,d) ((guint32)((((guint8)(a))<<24)|(((guint8)(b))<<16)|(((guint8)(c))<<8)|((guint8)(d))))
866
867   for (i = 0; i < G_N_ELEMENTS (data); i++)
868     {
869       guint32 code = PACK (data[i].four_letter_code[0],
870                            data[i].four_letter_code[1],
871                            data[i].four_letter_code[2],
872                            data[i].four_letter_code[3]);
873
874       g_assert_cmphex (g_unicode_script_to_iso15924 (data[i].script), ==, code);
875       g_assert_cmpint (g_unicode_script_from_iso15924 (code), ==, data[i].script);
876     }
877
878 #undef PACK
879 }
880
881 int
882 main (int   argc,
883       char *argv[])
884 {
885   g_test_init (&argc, &argv, NULL);
886
887   g_test_add_func ("/unicode/validate", test_unichar_validate);
888   g_test_add_func ("/unicode/character-type", test_unichar_character_type);
889   g_test_add_func ("/unicode/break-type", test_unichar_break_type);
890   g_test_add_func ("/unicode/script", test_unichar_script);
891   g_test_add_func ("/unicode/combining-class", test_combining_class);
892   g_test_add_func ("/unicode/mirror", test_mirror);
893   g_test_add_func ("/unicode/mark", test_mark);
894   g_test_add_func ("/unicode/title", test_title);
895   g_test_add_func ("/unicode/zero-width", test_zerowidth);
896   g_test_add_func ("/unicode/defined", test_defined);
897   g_test_add_func ("/unicode/wide", test_wide);
898   g_test_add_func ("/unicode/compose", test_compose);
899   g_test_add_func ("/unicode/decompose", test_decompose);
900   g_test_add_func ("/unicode/fully-decompose-canonical", test_fully_decompose_canonical);
901   g_test_add_func ("/unicode/canonical-decomposition", test_canonical_decomposition);
902   g_test_add_func ("/unicode/decompose-tail", test_decompose_tail);
903   g_test_add_func ("/unicode/fully-decompose-len", test_fully_decompose_len);
904   g_test_add_func ("/unicode/iso15924", test_iso15924);
905   g_test_add_func ("/unicode/cases", test_cases);
906
907   return g_test_run();
908 }