1 /* Unit tests for utilities
2 * Copyright (C) 2010 Red Hat, Inc.
3 *
4 * SPDX-License-Identifier: LicenseRef-old-glib-tests
5 *
6 * This work is provided "as is"; redistribution and modification
7 * in whole or in part, in any medium, physical or electronic is
8 * permitted without restriction.
9 *
10 * This work is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 *
14 * In no event shall the authors or contributors be liable for any
15 * direct, indirect, incidental, special, exemplary, or consequential
16 * damages (including, but not limited to, procurement of substitute
17 * goods or services; loss of use, data, or profits; or business
18 * interruption) however caused and on any theory of liability, whether
19 * in contract, strict liability, or tort (including negligence or
20 * otherwise) arising in any way out of the use of this software, even
21 * if advised of the possibility of such damage.
22 *
23 * Author: Matthias Clasen
24 */
25
26 #include "glib.h"
27
28 static void
29 test_utf8_strlen (void)
30 {
31 const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl";
32
33 g_assert_cmpint (g_utf8_strlen (string, -1), ==, 6);
34 g_assert_cmpint (g_utf8_strlen (string, 0), ==, 0);
35 g_assert_cmpint (g_utf8_strlen (string, 1), ==, 0);
36 g_assert_cmpint (g_utf8_strlen (string, 2), ==, 0);
37 g_assert_cmpint (g_utf8_strlen (string, 3), ==, 1);
38 g_assert_cmpint (g_utf8_strlen (string, 4), ==, 2);
39 g_assert_cmpint (g_utf8_strlen (string, 5), ==, 3);
40 g_assert_cmpint (g_utf8_strlen (string, 6), ==, 3);
41 g_assert_cmpint (g_utf8_strlen (string, 7), ==, 3);
42 g_assert_cmpint (g_utf8_strlen (string, 8), ==, 4);
43 g_assert_cmpint (g_utf8_strlen (string, 9), ==, 5);
44 g_assert_cmpint (g_utf8_strlen (string, 10), ==, 6);
45 }
46
47 static void
48 test_utf8_strncpy (void)
49 {
50 const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl";
51 gchar dest[20];
52
53 g_utf8_strncpy (dest, string, 0);
54 g_assert_cmpstr (dest, ==, "");
55
56 g_utf8_strncpy (dest, string, 1);
57 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0");
58
59 g_utf8_strncpy (dest, string, 2);
60 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0g");
61
62 g_utf8_strncpy (dest, string, 3);
63 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh");
64
65 g_utf8_strncpy (dest, string, 4);
66 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4");
67
68 g_utf8_strncpy (dest, string, 5);
69 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4j");
70
71 g_utf8_strncpy (dest, string, 6);
72 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl");
73
74 g_utf8_strncpy (dest, string, 20);
75 g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl");
76 }
77
78 static void
79 test_utf8_strrchr (void)
80 {
81 const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl\xe2\x82\xa4jl";
82
83 g_assert (g_utf8_strrchr (string, -1, 'j') == string + 13);
84 g_assert (g_utf8_strrchr (string, -1, 8356) == string + 10);
85 g_assert (g_utf8_strrchr (string, 9, 8356) == string + 5);
86 g_assert (g_utf8_strrchr (string, 3, 'j') == NULL);
87 g_assert (g_utf8_strrchr (string, -1, 'x') == NULL);
88 }
89
90 static void
91 test_utf8_reverse (void)
92 {
93 gchar *r;
94
95 r = g_utf8_strreverse ("abcdef", -1);
96 g_assert_cmpstr (r, ==, "fedcba");
97 g_free (r);
98
99 r = g_utf8_strreverse ("abcdef", 4);
100 g_assert_cmpstr (r, ==, "dcba");
101 g_free (r);
102
103 /* U+0B0B Oriya Letter Vocalic R
104 * U+10900 Phoenician Letter Alf
105 * U+0041 Latin Capital Letter A
106 * U+1EB6 Latin Capital Letter A With Breve And Dot Below
107 */
108 r = g_utf8_strreverse ("\340\254\213\360\220\244\200\101\341\272\266", -1);
109 g_assert_cmpstr (r, ==, "\341\272\266\101\360\220\244\200\340\254\213");
110 g_free (r);
111 }
112
113 static void
114 test_utf8_substring (void)
115 {
116 gchar *r;
117
118 r = g_utf8_substring ("abcd", 1, 3);
119 g_assert_cmpstr (r, ==, "bc");
120 g_free (r);
121
122 r = g_utf8_substring ("abcd", 0, 4);
123 g_assert_cmpstr (r, ==, "abcd");
124 g_free (r);
125
126 r = g_utf8_substring ("abcd", 2, 2);
127 g_assert_cmpstr (r, ==, "");
128 g_free (r);
129
130 r = g_utf8_substring ("abc\xe2\x82\xa0gh\xe2\x82\xa4", 2, 5);
131 g_assert_cmpstr (r, ==, "c\xe2\x82\xa0g");
132 g_free (r);
133
134 r = g_utf8_substring ("abcd", 1, -1);
135 g_assert_cmpstr (r, ==, "bcd");
136 g_free (r);
137 }
138
139 static void
140 test_utf8_make_valid (void)
141 {
142 gchar *r;
143
144 /* valid UTF8 */
145 r = g_utf8_make_valid ("\xe2\x82\xa0gh\xe2\x82\xa4jl", -1);
146 g_assert_cmpstr (r, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl");
147 g_free (r);
148
149 /* invalid UTF8 */
150 r = g_utf8_make_valid ("\xe2\x82\xa0gh\xe2\xffjl", -1);
151 g_assert_cmpstr (r, ==, "\xe2\x82\xa0gh\xef\xbf\xbd\xef\xbf\xbdjl");
152 g_free (r);
153
154 /* invalid UTF8 without nul terminator followed by something unfortunate */
155 r = g_utf8_make_valid ("Bj\xc3\xb8", 3);
156 g_assert_cmpstr (r, ==, "Bj\xef\xbf\xbd");
157 g_free (r);
158
159 /* invalid UTF8 with embedded nul */
160 r = g_utf8_make_valid ("\xe2\x82\xa0gh\xe2\x00jl", 9);
161 g_assert_cmpstr (r, ==, "\xe2\x82\xa0gh\xef\xbf\xbd\xef\xbf\xbdjl");
162 g_free (r);
163 }
164
165 static void
166 truncate_middle_helper (const char *in_str,
167 gsize truncate_len,
168 const char *out_str)
169 {
170 gchar *string = g_utf8_truncate_middle (in_str, truncate_len);
171 g_assert_cmpstr (string, ==, out_str);
172 g_free (string);
173 }
174
175 static void
176 test_utf8_truncate_middle (void)
177 {
178 truncate_middle_helper ("foo", 0, "");
179 truncate_middle_helper ("foo", 1, "…");
180 truncate_middle_helper ("foo", 2, "…o");
181 truncate_middle_helper ("foo", 3, "foo");
182 truncate_middle_helper ("foo", 4, "foo");
183 truncate_middle_helper ("foo", 5, "foo");
184 truncate_middle_helper ("foo", 6, "foo");
185 truncate_middle_helper ("foo", 7, "foo");
186
187 truncate_middle_helper ("a_much_longer_foo", 0, "");
188 truncate_middle_helper ("a_much_longer_foo", 1, "…");
189 truncate_middle_helper ("a_much_longer_foo", 2, "…o");
190 truncate_middle_helper ("a_much_longer_foo", 3, "a…o");
191 truncate_middle_helper ("a_much_longer_foo", 4, "a…oo");
192 truncate_middle_helper ("a_much_longer_foo", 5, "a_…oo");
193 truncate_middle_helper ("a_much_longer_foo", 6, "a_…foo");
194 truncate_middle_helper ("a_much_longer_foo", 7, "a_m…foo");
195 truncate_middle_helper ("a_much_longer_foo", 8, "a_m…_foo");
196 truncate_middle_helper ("a_much_longer_foo", 9, "a_mu…_foo");
197
198 truncate_middle_helper ("something_even", 8, "som…even");
199 truncate_middle_helper ("something_odd", 8, "som…_odd");
200 truncate_middle_helper ("something_even", 9, "some…even");
201 truncate_middle_helper ("something_odd", 9, "some…_odd");
202 truncate_middle_helper ("something_even", 10, "some…_even");
203 truncate_middle_helper ("something_odd", 10, "some…g_odd");
204 truncate_middle_helper ("something_even", 11, "somet…_even");
205 truncate_middle_helper ("something_odd", 11, "somet…g_odd");
206 truncate_middle_helper ("something_even", 12, "somet…g_even");
207 truncate_middle_helper ("something_odd", 12, "somet…ng_odd");
208 truncate_middle_helper ("something_even", 13, "someth…g_even");
209 truncate_middle_helper ("something_odd", 13, "something_odd");
210 truncate_middle_helper ("something_even", 14, "something_even");
211 truncate_middle_helper ("something_odd", 13, "something_odd");
212
213 truncate_middle_helper ("ääääääääää", 5, "ää…ää");
214 truncate_middle_helper ("あぃいぅうぇえぉ", 7, "あぃい…ぇえぉ");
215 }
216
217 int
218 main (int argc,
219 char *argv[])
220 {
221 g_test_init (&argc, &argv, NULL);
222
223 g_test_add_func ("/utf8/strlen", test_utf8_strlen);
224 g_test_add_func ("/utf8/strncpy", test_utf8_strncpy);
225 g_test_add_func ("/utf8/strrchr", test_utf8_strrchr);
226 g_test_add_func ("/utf8/reverse", test_utf8_reverse);
227 g_test_add_func ("/utf8/substring", test_utf8_substring);
228 g_test_add_func ("/utf8/make-valid", test_utf8_make_valid);
229 g_test_add_func ("/utf8/truncate-middle", test_utf8_truncate_middle);
230
231 return g_test_run();
232 }