aa39a9c9042f130d38b8d2d98f4066d789f39ec2
[mono.git] / eglib / test / string-util.c
1 #include <glib.h>
2 #include <string.h>
3 #include <stdio.h>
4 #include "test.h"
5
6 /* This test is just to be used with valgrind */
7 RESULT
8 test_strfreev ()
9 {
10         gchar **array = g_new (gchar *, 4);
11         array [0] = g_strdup ("one");
12         array [1] = g_strdup ("two");
13         array [2] = g_strdup ("three");
14         array [3] = NULL;
15         
16         g_strfreev (array);
17         g_strfreev (NULL);
18
19         return OK;
20 }
21
22 RESULT
23 test_concat ()
24 {
25         gchar *x = g_strconcat ("Hello", ", ", "world", NULL);
26         if (strcmp (x, "Hello, world") != 0)
27                 return FAILED("concat failed, got: %s", x);
28         g_free (x);
29         return OK;
30 }
31
32 RESULT
33 test_split ()
34 {
35         const gchar *to_split = "Hello world, how are we doing today?";
36         gint i;
37         gchar **v;
38         
39         v= g_strsplit(to_split, " ", 0);
40         
41         if(v == NULL) {
42                 return FAILED("split failed, got NULL vector (1)");
43         }
44         
45         for(i = 0; v[i] != NULL; i++);
46         if(i != 7) {
47                 return FAILED("split failed, expected 7 tokens, got %d", i);
48         }
49         
50         g_strfreev(v);
51
52         v = g_strsplit(to_split, ":", -1);
53         if(v == NULL) {
54                 return FAILED("split failed, got NULL vector (2)");
55         }
56
57         for(i = 0; v[i] != NULL; i++);
58         if(i != 1) {
59                 return FAILED("split failed, expected 1 token, got %d", i);
60         }
61
62         if(strcmp(v[0], to_split) != 0) {
63                 return FAILED("expected vector[0] to be '%s' but it was '%s'",
64                         to_split, v[0]);
65         }
66         g_strfreev(v);
67
68         v = g_strsplit ("", ":", 0);
69         if (v == NULL)
70                 return FAILED ("g_strsplit returned NULL");
71         g_strfreev (v);
72         return OK;
73 }
74
75 RESULT
76 test_strreverse ()
77 {
78         gchar *a = g_strdup ("onetwothree");
79         gchar *a_target = "eerhtowteno";
80         gchar *b = g_strdup ("onetwothre");
81         gchar *b_target = "erhtowteno";
82
83         g_strreverse (a);
84         if (strcmp (a, a_target)) {
85                 g_free (b);
86                 g_free (a);
87                 return FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", a, a_target);
88         }
89
90         g_strreverse (b);
91         if (strcmp (b, b_target)) {
92                 g_free (b);
93                 g_free (a);
94                 return FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", b, b_target);
95         }
96         g_free (b);
97         g_free (a);
98         return OK;
99 }
100
101 RESULT
102 test_strjoin ()
103 {
104         char *s;
105         
106         s = g_strjoin (NULL, "a", "b", NULL);
107         if (strcmp (s, "ab") != 0)
108                 return FAILED ("Join of two strings with no separator fails");
109         g_free (s);
110
111         s = g_strjoin ("", "a", "b", NULL);
112         if (strcmp (s, "ab") != 0)
113                 return FAILED ("Join of two strings with empty separator fails");
114         g_free (s);
115
116         s = g_strjoin ("-", "a", "b", NULL);
117         if (strcmp (s, "a-b") != 0)
118                 return FAILED ("Join of two strings with separator fails");
119         g_free (s);
120
121         s = g_strjoin ("-", "aaaa", "bbbb", "cccc", "dddd", NULL);
122         if (strcmp (s, "aaaa-bbbb-cccc-dddd") != 0)
123                 return FAILED ("Join of multiple strings fails");
124         g_free (s);
125
126         s = g_strjoin ("-", NULL);
127         if (s == NULL || (strcmp (s, "") != 0))
128                 return FAILED ("Failed to join empty arguments");
129         g_free (s);
130
131         return OK;
132 }
133
134 RESULT
135 test_strchug ()
136 {
137         char *str = g_strdup (" \t\n hola");
138
139         g_strchug (str);
140         if (strcmp ("hola", str)) {
141                 fprintf (stderr, "%s\n", str);
142                 g_free (str);
143                 return FAILED ("Failed.");
144         }
145         g_free (str);
146         return OK;
147 }
148
149 RESULT
150 test_strchomp ()
151 {
152         char *str = g_strdup ("hola  \t");
153
154         g_strchomp (str);
155         if (strcmp ("hola", str)) {
156                 fprintf (stderr, "%s\n", str);
157                 g_free (str);
158                 return FAILED ("Failed.");
159         }
160         g_free (str);
161         return OK;
162 }
163
164 RESULT
165 test_strstrip ()
166 {
167         char *str = g_strdup (" \t hola   ");
168
169         g_strstrip (str);
170         if (strcmp ("hola", str)) {
171                 fprintf (stderr, "%s\n", str);
172                 g_free (str);
173                 return FAILED ("Failed.");
174         }
175         g_free (str);
176         return OK;
177 }
178
179 #define urit(so,j) do { s = g_filename_to_uri (so, NULL, NULL); if (strcmp (s, j) != 0) return FAILED("Got %s expected %s", s, j); g_free (s); } while (0);
180
181 #define errit(so) do { s = g_filename_to_uri (so, NULL, NULL); if (s != NULL) return FAILED ("got %s, expected NULL", s); } while (0);
182
183 RESULT
184 test_filename_to_uri ()
185 {
186         char *s;
187
188         urit ("/a", "file:///a");
189         urit ("/home/miguel", "file:///home/miguel");
190         urit ("/home/mig uel", "file:///home/mig%20uel");
191         urit ("/\303\241", "file:///%C3%A1");
192         urit ("/\303\241/octal", "file:///%C3%A1/octal");
193         urit ("/%", "file:///%25");
194         urit ("/\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040", "file:///%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20");
195         urit ("/!$&'()*+,-./", "file:///!$&'()*+,-./");
196         urit ("/\042\043\045", "file:///%22%23%25");
197         urit ("/0123456789:=", "file:///0123456789:=");
198         urit ("/\073\074\076\077", "file:///%3B%3C%3E%3F");
199         urit ("/\133\134\135\136_\140\173\174\175", "file:///%5B%5C%5D%5E_%60%7B%7C%7D");
200         urit ("/\173\174\175\176\177\200", "file:///%7B%7C%7D~%7F%80");
201         urit ("/@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "file:///@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
202         errit ("a");
203         errit ("./hola");
204         
205         return OK;
206 }
207
208 #define fileit(so,j) do { s = g_filename_from_uri (so, NULL, NULL); if (strcmp (s, j) != 0) return FAILED("Got %s expected %s", s, j); g_free (s); } while (0);
209
210 #define ferrit(so) do { s = g_filename_from_uri (so, NULL, NULL); if (s != NULL) return FAILED ("got %s, expected NULL", s); } while (0);
211
212 RESULT
213 test_filename_from_uri ()
214 {
215         char *s;
216
217         fileit ("file:///a", "/a");
218         fileit ("file:///%41", "/A");
219         fileit ("file:///home/miguel", "/home/miguel");
220         fileit ("file:///home/mig%20uel", "/home/mig uel");
221         ferrit ("/a");
222         ferrit ("a");
223         ferrit ("file://a");
224         ferrit ("file:a");
225         ferrit ("file:///%");
226         ferrit ("file:///%0");
227         ferrit ("file:///%jj");
228         
229         return OK;
230 }
231
232 RESULT
233 test_ascii_xdigit_value ()
234 {
235         int i;
236
237         i = g_ascii_xdigit_value ('9' + 1);
238         if (i != -1)
239                 return FAILED ("'9' + 1");
240         i = g_ascii_xdigit_value ('0' - 1);
241         if (i != -1)
242                 return FAILED ("'0' - 1");
243         i = g_ascii_xdigit_value ('a' - 1);
244         if (i != -1)
245                 return FAILED ("'a' - 1");
246         i = g_ascii_xdigit_value ('f' + 1);
247         if (i != -1)
248                 return FAILED ("'f' + 1");
249         i = g_ascii_xdigit_value ('A' - 1);
250         if (i != -1)
251                 return FAILED ("'A' - 1");
252         i = g_ascii_xdigit_value ('F' + 1);
253         if (i != -1)
254                 return FAILED ("'F' + 1");
255
256         for (i = '0'; i < '9'; i++) {
257                 int c = g_ascii_xdigit_value (i);
258                 if (c  != (i - '0'))
259                         return FAILED ("Digits %c -> %d", i, c);
260         }
261         for (i = 'a'; i < 'f'; i++) {
262                 int c = g_ascii_xdigit_value (i);
263                 if (c  != (i - 'a' + 10))
264                         return FAILED ("Lower %c -> %d", i, c);
265         }
266         for (i = 'A'; i < 'F'; i++) {
267                 int c = g_ascii_xdigit_value (i);
268                 if (c  != (i - 'A' + 10))
269                         return FAILED ("Upper %c -> %d", i, c);
270         }
271         return OK;
272 }
273
274 RESULT
275 test_strdelimit ()
276 {
277         gchar *str;
278
279         str = g_strdup (G_STR_DELIMITERS);
280         str = g_strdelimit (str, NULL, 'a');
281         if (0 != strcmp ("aaaaaaa", str))
282                 return FAILED ("All delimiters: '%s'", str);
283         g_free (str);
284         str = g_strdup ("hola");
285         str = g_strdelimit (str, "ha", '+');
286         if (0 != strcmp ("+ol+", str))
287                 return FAILED ("2 delimiters: '%s'", str);
288         g_free (str);
289         return OK;
290 }
291
292 RESULT
293 test_strlcpy ()
294 {
295         const gchar *src = "onetwothree";
296         gchar *dest;
297         int i;
298
299         dest = g_malloc (strlen (src) + 1);
300         memset (dest, 0, strlen (src) + 1);
301         i = g_strlcpy (dest, src, -1);
302         if (i != strlen (src))
303                 return FAILED ("Test1 got %d", i);
304
305         if (0 != strcmp (dest, src))
306                 return FAILED ("Src and dest not equal");
307
308         i = g_strlcpy (dest, src, 3);
309         if (i != strlen (src))
310                 return FAILED ("Test1 got %d", i);
311         if (0 != strcmp (dest, "on"))
312                 return FAILED ("Test2");
313
314         i = g_strlcpy (dest, src, 1);
315         if (i != strlen (src))
316                 return FAILED ("Test3 got %d", i);
317         if (*dest != '\0')
318                 return FAILED ("Test4");
319
320         i = g_strlcpy (dest, src, 12345);
321         if (i != strlen (src))
322                 return FAILED ("Test4 got %d", i);
323         if (0 != strcmp (dest, src))
324                 return FAILED ("Src and dest not equal 2");
325         g_free (dest);
326         return OK;
327 }
328
329 RESULT
330 test_strescape ()
331 {
332         gchar *str;
333
334         str = g_strescape ("abc", NULL);
335         if (strcmp ("abc", str))
336                 return FAILED ("#1");
337         str = g_strescape ("\t\b\f\n\r\\\"abc", NULL);
338         if (strcmp ("\\t\\b\\f\\n\\r\\\\\\\"abc", str))
339                 return FAILED ("#2 %s", str);
340         str = g_strescape ("\001abc", NULL);
341         if (strcmp ("\\001abc", str))
342                 return FAILED ("#3 %s", str);
343         str = g_strescape ("\001abc", "\001");
344         if (strcmp ("\001abc", str))
345                 return FAILED ("#3 %s", str);
346         return OK;
347 }
348
349 RESULT
350 test_ascii_strncasecmp ()
351 {
352         int n;
353
354         n = g_ascii_strncasecmp ("123", "123", 1);
355         if (n != 0)
356                 return FAILED ("Should have been 0");
357         
358         n = g_ascii_strncasecmp ("423", "123", 1);
359         if (n != 3)
360                 return FAILED ("Should have been 3, got %d", n);
361
362         n = g_ascii_strncasecmp ("123", "423", 1);
363         if (n != -3)
364                 return FAILED ("Should have been -3, got %d", n);
365
366         n = g_ascii_strncasecmp ("1", "1", 10);
367         if (n != 0)
368                 return FAILED ("Should have been 0, got %d", n);
369         return OK;
370 }
371
372 static Test strutil_tests [] = {
373         {"g_strfreev", test_strfreev},
374         {"g_strconcat", test_concat},
375         {"g_strsplit", test_split},
376         {"g_strreverse", test_strreverse},
377         {"g_strjoin", test_strjoin},
378         {"g_strchug", test_strchug},
379         {"g_strchomp", test_strchomp},
380         {"g_strstrip", test_strstrip},
381         {"g_filename_to_uri", test_filename_to_uri},
382         {"g_filename_from_uri", test_filename_from_uri},
383         {"g_ascii_xdigit_value", test_ascii_xdigit_value},
384         {"g_strdelimit", test_strdelimit},
385         {"g_strlcpy", test_strlcpy},
386         {"g_strescape", test_strescape},
387         {"g_ascii_strncasecmp", test_ascii_strncasecmp },
388         {NULL, NULL}
389 };
390
391 DEFINE_TEST_GROUP_INIT(strutil_tests_init, strutil_tests)
392