Branch data Line data Source code
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 : 1 : test_utf8_strlen (void)
30 : : {
31 : 1 : const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl";
32 : :
33 : 1 : g_assert_cmpint (g_utf8_strlen (string, -1), ==, 6);
34 : 1 : g_assert_cmpint (g_utf8_strlen (string, 0), ==, 0);
35 : 1 : g_assert_cmpint (g_utf8_strlen (string, 1), ==, 0);
36 : 1 : g_assert_cmpint (g_utf8_strlen (string, 2), ==, 0);
37 : 1 : g_assert_cmpint (g_utf8_strlen (string, 3), ==, 1);
38 : 1 : g_assert_cmpint (g_utf8_strlen (string, 4), ==, 2);
39 : 1 : g_assert_cmpint (g_utf8_strlen (string, 5), ==, 3);
40 : 1 : g_assert_cmpint (g_utf8_strlen (string, 6), ==, 3);
41 : 1 : g_assert_cmpint (g_utf8_strlen (string, 7), ==, 3);
42 : 1 : g_assert_cmpint (g_utf8_strlen (string, 8), ==, 4);
43 : 1 : g_assert_cmpint (g_utf8_strlen (string, 9), ==, 5);
44 : 1 : g_assert_cmpint (g_utf8_strlen (string, 10), ==, 6);
45 : 1 : }
46 : :
47 : : static void
48 : 1 : test_utf8_strncpy (void)
49 : : {
50 : 1 : const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl";
51 : : gchar dest[20];
52 : :
53 : 1 : g_utf8_strncpy (dest, string, 0);
54 : 1 : g_assert_cmpstr (dest, ==, "");
55 : :
56 : 1 : g_utf8_strncpy (dest, string, 1);
57 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0");
58 : :
59 : 1 : g_utf8_strncpy (dest, string, 2);
60 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0g");
61 : :
62 : 1 : g_utf8_strncpy (dest, string, 3);
63 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh");
64 : :
65 : 1 : g_utf8_strncpy (dest, string, 4);
66 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4");
67 : :
68 : 1 : g_utf8_strncpy (dest, string, 5);
69 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4j");
70 : :
71 : 1 : g_utf8_strncpy (dest, string, 6);
72 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl");
73 : :
74 : 1 : g_utf8_strncpy (dest, string, 20);
75 : 1 : g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl");
76 : 1 : }
77 : :
78 : : static void
79 : 1 : test_utf8_strrchr (void)
80 : : {
81 : 1 : const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl\xe2\x82\xa4jl";
82 : :
83 : 1 : g_assert (g_utf8_strrchr (string, -1, 'j') == string + 13);
84 : 1 : g_assert (g_utf8_strrchr (string, -1, 8356) == string + 10);
85 : 1 : g_assert (g_utf8_strrchr (string, 9, 8356) == string + 5);
86 : 1 : g_assert (g_utf8_strrchr (string, 3, 'j') == NULL);
87 : 1 : g_assert (g_utf8_strrchr (string, -1, 'x') == NULL);
88 : 1 : }
89 : :
90 : : static void
91 : 1 : test_utf8_reverse (void)
92 : : {
93 : : gchar *r;
94 : :
95 : 1 : r = g_utf8_strreverse ("abcdef", -1);
96 : 1 : g_assert_cmpstr (r, ==, "fedcba");
97 : 1 : g_free (r);
98 : :
99 : 1 : r = g_utf8_strreverse ("abcdef", 4);
100 : 1 : g_assert_cmpstr (r, ==, "dcba");
101 : 1 : 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 : 1 : r = g_utf8_strreverse ("\340\254\213\360\220\244\200\101\341\272\266", -1);
109 : 1 : g_assert_cmpstr (r, ==, "\341\272\266\101\360\220\244\200\340\254\213");
110 : 1 : g_free (r);
111 : 1 : }
112 : :
113 : : static void
114 : 1 : test_utf8_substring (void)
115 : : {
116 : : gchar *r;
117 : :
118 : 1 : r = g_utf8_substring ("abcd", 1, 3);
119 : 1 : g_assert_cmpstr (r, ==, "bc");
120 : 1 : g_free (r);
121 : :
122 : 1 : r = g_utf8_substring ("abcd", 0, 4);
123 : 1 : g_assert_cmpstr (r, ==, "abcd");
124 : 1 : g_free (r);
125 : :
126 : 1 : r = g_utf8_substring ("abcd", 2, 2);
127 : 1 : g_assert_cmpstr (r, ==, "");
128 : 1 : g_free (r);
129 : :
130 : 1 : r = g_utf8_substring ("abc\xe2\x82\xa0gh\xe2\x82\xa4", 2, 5);
131 : 1 : g_assert_cmpstr (r, ==, "c\xe2\x82\xa0g");
132 : 1 : g_free (r);
133 : :
134 : 1 : r = g_utf8_substring ("abcd", 1, -1);
135 : 1 : g_assert_cmpstr (r, ==, "bcd");
136 : 1 : g_free (r);
137 : 1 : }
138 : :
139 : : static void
140 : 1 : test_utf8_make_valid (void)
141 : : {
142 : : gchar *r;
143 : :
144 : : /* valid UTF8 */
145 : 1 : r = g_utf8_make_valid ("\xe2\x82\xa0gh\xe2\x82\xa4jl", -1);
146 : 1 : g_assert_cmpstr (r, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl");
147 : 1 : g_free (r);
148 : :
149 : : /* invalid UTF8 */
150 : 1 : r = g_utf8_make_valid ("\xe2\x82\xa0gh\xe2\xffjl", -1);
151 : 1 : g_assert_cmpstr (r, ==, "\xe2\x82\xa0gh\xef\xbf\xbd\xef\xbf\xbdjl");
152 : 1 : g_free (r);
153 : :
154 : : /* invalid UTF8 without nul terminator followed by something unfortunate */
155 : 1 : r = g_utf8_make_valid ("Bj\xc3\xb8", 3);
156 : 1 : g_assert_cmpstr (r, ==, "Bj\xef\xbf\xbd");
157 : 1 : g_free (r);
158 : :
159 : : /* invalid UTF8 with embedded nul */
160 : 1 : r = g_utf8_make_valid ("\xe2\x82\xa0gh\xe2\x00jl", 9);
161 : 1 : g_assert_cmpstr (r, ==, "\xe2\x82\xa0gh\xef\xbf\xbd\xef\xbf\xbdjl");
162 : 1 : g_free (r);
163 : 1 : }
164 : :
165 : : static void
166 : 34 : truncate_middle_helper (const char *in_str,
167 : : gsize truncate_len,
168 : : const char *out_str)
169 : : {
170 : 34 : gchar *string = g_utf8_truncate_middle (in_str, truncate_len);
171 : 34 : g_assert_cmpstr (string, ==, out_str);
172 : 34 : g_free (string);
173 : 34 : }
174 : :
175 : : static void
176 : 1 : test_utf8_truncate_middle (void)
177 : : {
178 : 1 : truncate_middle_helper ("foo", 0, "");
179 : 1 : truncate_middle_helper ("foo", 1, "…");
180 : 1 : truncate_middle_helper ("foo", 2, "…o");
181 : 1 : truncate_middle_helper ("foo", 3, "foo");
182 : 1 : truncate_middle_helper ("foo", 4, "foo");
183 : 1 : truncate_middle_helper ("foo", 5, "foo");
184 : 1 : truncate_middle_helper ("foo", 6, "foo");
185 : 1 : truncate_middle_helper ("foo", 7, "foo");
186 : :
187 : 1 : truncate_middle_helper ("a_much_longer_foo", 0, "");
188 : 1 : truncate_middle_helper ("a_much_longer_foo", 1, "…");
189 : 1 : truncate_middle_helper ("a_much_longer_foo", 2, "…o");
190 : 1 : truncate_middle_helper ("a_much_longer_foo", 3, "a…o");
191 : 1 : truncate_middle_helper ("a_much_longer_foo", 4, "a…oo");
192 : 1 : truncate_middle_helper ("a_much_longer_foo", 5, "a_…oo");
193 : 1 : truncate_middle_helper ("a_much_longer_foo", 6, "a_…foo");
194 : 1 : truncate_middle_helper ("a_much_longer_foo", 7, "a_m…foo");
195 : 1 : truncate_middle_helper ("a_much_longer_foo", 8, "a_m…_foo");
196 : 1 : truncate_middle_helper ("a_much_longer_foo", 9, "a_mu…_foo");
197 : :
198 : 1 : truncate_middle_helper ("something_even", 8, "som…even");
199 : 1 : truncate_middle_helper ("something_odd", 8, "som…_odd");
200 : 1 : truncate_middle_helper ("something_even", 9, "some…even");
201 : 1 : truncate_middle_helper ("something_odd", 9, "some…_odd");
202 : 1 : truncate_middle_helper ("something_even", 10, "some…_even");
203 : 1 : truncate_middle_helper ("something_odd", 10, "some…g_odd");
204 : 1 : truncate_middle_helper ("something_even", 11, "somet…_even");
205 : 1 : truncate_middle_helper ("something_odd", 11, "somet…g_odd");
206 : 1 : truncate_middle_helper ("something_even", 12, "somet…g_even");
207 : 1 : truncate_middle_helper ("something_odd", 12, "somet…ng_odd");
208 : 1 : truncate_middle_helper ("something_even", 13, "someth…g_even");
209 : 1 : truncate_middle_helper ("something_odd", 13, "something_odd");
210 : 1 : truncate_middle_helper ("something_even", 14, "something_even");
211 : 1 : truncate_middle_helper ("something_odd", 13, "something_odd");
212 : :
213 : 1 : truncate_middle_helper ("ääääääääää", 5, "ää…ää");
214 : 1 : truncate_middle_helper ("あぃいぅうぇえぉ", 7, "あぃい…ぇえぉ");
215 : 1 : }
216 : :
217 : : int
218 : 1 : main (int argc,
219 : : char *argv[])
220 : : {
221 : 1 : g_test_init (&argc, &argv, NULL);
222 : :
223 : 1 : g_test_add_func ("/utf8/strlen", test_utf8_strlen);
224 : 1 : g_test_add_func ("/utf8/strncpy", test_utf8_strncpy);
225 : 1 : g_test_add_func ("/utf8/strrchr", test_utf8_strrchr);
226 : 1 : g_test_add_func ("/utf8/reverse", test_utf8_reverse);
227 : 1 : g_test_add_func ("/utf8/substring", test_utf8_substring);
228 : 1 : g_test_add_func ("/utf8/make-valid", test_utf8_make_valid);
229 : 1 : g_test_add_func ("/utf8/truncate-middle", test_utf8_truncate_middle);
230 : :
231 : 1 : return g_test_run();
232 : : }
|