2007-06-13 Jonathan Chambers <joncham@gmail.com>
[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
73         v = g_strsplit ("/home/miguel/dingus", "/", 0);
74         if (v [0][0] != 0)
75                 return FAILED ("Got a non-empty first element");
76         g_strfreev (v);
77
78         v = g_strsplit ("appdomain1, Version=0.0.0.0, Culture=neutral", ",", 4);
79         if (strcmp (v [0], "appdomain1") != 0)
80                 return FAILED ("Invalid value");
81         
82         if (strcmp (v [1], " Version=0.0.0.0") != 0)
83                 return FAILED ("Invalid value");
84         
85         if (strcmp (v [2], " Culture=neutral") != 0)
86                 return FAILED ("Invalid value");
87
88         if (v [3] != NULL)
89                 return FAILED ("Expected only 3 elements");
90         
91         g_strfreev (v);
92
93         return OK;
94 }
95
96 RESULT
97 test_strreverse ()
98 {
99         gchar *a = g_strdup ("onetwothree");
100         gchar *a_target = "eerhtowteno";
101         gchar *b = g_strdup ("onetwothre");
102         gchar *b_target = "erhtowteno";
103
104         g_strreverse (a);
105         if (strcmp (a, a_target)) {
106                 g_free (b);
107                 g_free (a);
108                 return FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", a, a_target);
109         }
110
111         g_strreverse (b);
112         if (strcmp (b, b_target)) {
113                 g_free (b);
114                 g_free (a);
115                 return FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", b, b_target);
116         }
117         g_free (b);
118         g_free (a);
119         return OK;
120 }
121
122 RESULT
123 test_strjoin ()
124 {
125         char *s;
126         
127         s = g_strjoin (NULL, "a", "b", NULL);
128         if (strcmp (s, "ab") != 0)
129                 return FAILED ("Join of two strings with no separator fails");
130         g_free (s);
131
132         s = g_strjoin ("", "a", "b", NULL);
133         if (strcmp (s, "ab") != 0)
134                 return FAILED ("Join of two strings with empty separator fails");
135         g_free (s);
136
137         s = g_strjoin ("-", "a", "b", NULL);
138         if (strcmp (s, "a-b") != 0)
139                 return FAILED ("Join of two strings with separator fails");
140         g_free (s);
141
142         s = g_strjoin ("-", "aaaa", "bbbb", "cccc", "dddd", NULL);
143         if (strcmp (s, "aaaa-bbbb-cccc-dddd") != 0)
144                 return FAILED ("Join of multiple strings fails");
145         g_free (s);
146
147         s = g_strjoin ("-", NULL);
148         if (s == NULL || (strcmp (s, "") != 0))
149                 return FAILED ("Failed to join empty arguments");
150         g_free (s);
151
152         return OK;
153 }
154
155 RESULT
156 test_strchug ()
157 {
158         char *str = g_strdup (" \t\n hola");
159
160         g_strchug (str);
161         if (strcmp ("hola", str)) {
162                 fprintf (stderr, "%s\n", str);
163                 g_free (str);
164                 return FAILED ("Failed.");
165         }
166         g_free (str);
167         return OK;
168 }
169
170 RESULT
171 test_strchomp ()
172 {
173         char *str = g_strdup ("hola  \t");
174
175         g_strchomp (str);
176         if (strcmp ("hola", str)) {
177                 fprintf (stderr, "%s\n", str);
178                 g_free (str);
179                 return FAILED ("Failed.");
180         }
181         g_free (str);
182         return OK;
183 }
184
185 RESULT
186 test_strstrip ()
187 {
188         char *str = g_strdup (" \t hola   ");
189
190         g_strstrip (str);
191         if (strcmp ("hola", str)) {
192                 fprintf (stderr, "%s\n", str);
193                 g_free (str);
194                 return FAILED ("Failed.");
195         }
196         g_free (str);
197         return OK;
198 }
199
200 #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);
201
202 #define errit(so) do { s = g_filename_to_uri (so, NULL, NULL); if (s != NULL) return FAILED ("got %s, expected NULL", s); } while (0);
203
204 RESULT
205 test_filename_to_uri ()
206 {
207         char *s;
208
209         urit ("/a", "file:///a");
210         urit ("/home/miguel", "file:///home/miguel");
211         urit ("/home/mig uel", "file:///home/mig%20uel");
212         urit ("/\303\241", "file:///%C3%A1");
213         urit ("/\303\241/octal", "file:///%C3%A1/octal");
214         urit ("/%", "file:///%25");
215         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");
216         urit ("/!$&'()*+,-./", "file:///!$&'()*+,-./");
217         urit ("/\042\043\045", "file:///%22%23%25");
218         urit ("/0123456789:=", "file:///0123456789:=");
219         urit ("/\073\074\076\077", "file:///%3B%3C%3E%3F");
220         urit ("/\133\134\135\136_\140\173\174\175", "file:///%5B%5C%5D%5E_%60%7B%7C%7D");
221         urit ("/\173\174\175\176\177\200", "file:///%7B%7C%7D~%7F%80");
222         urit ("/@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "file:///@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
223         errit ("a");
224         errit ("./hola");
225         
226         return OK;
227 }
228
229 #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);
230
231 #define ferrit(so) do { s = g_filename_from_uri (so, NULL, NULL); if (s != NULL) return FAILED ("got %s, expected NULL", s); } while (0);
232
233 RESULT
234 test_filename_from_uri ()
235 {
236         char *s;
237
238         fileit ("file:///a", "/a");
239         fileit ("file:///%41", "/A");
240         fileit ("file:///home/miguel", "/home/miguel");
241         fileit ("file:///home/mig%20uel", "/home/mig uel");
242         ferrit ("/a");
243         ferrit ("a");
244         ferrit ("file://a");
245         ferrit ("file:a");
246         ferrit ("file:///%");
247         ferrit ("file:///%0");
248         ferrit ("file:///%jj");
249         
250         return OK;
251 }
252
253 RESULT
254 test_ascii_xdigit_value ()
255 {
256         int i;
257         gchar j;
258
259         i = g_ascii_xdigit_value ('9' + 1);
260         if (i != -1)
261                 return FAILED ("'9' + 1");
262         i = g_ascii_xdigit_value ('0' - 1);
263         if (i != -1)
264                 return FAILED ("'0' - 1");
265         i = g_ascii_xdigit_value ('a' - 1);
266         if (i != -1)
267                 return FAILED ("'a' - 1");
268         i = g_ascii_xdigit_value ('f' + 1);
269         if (i != -1)
270                 return FAILED ("'f' + 1");
271         i = g_ascii_xdigit_value ('A' - 1);
272         if (i != -1)
273                 return FAILED ("'A' - 1");
274         i = g_ascii_xdigit_value ('F' + 1);
275         if (i != -1)
276                 return FAILED ("'F' + 1");
277
278         for (j = '0'; j < '9'; j++) {
279                 int c = g_ascii_xdigit_value (j);
280                 if (c  != (j - '0'))
281                         return FAILED ("Digits %c -> %d", j, c);
282         }
283         for (j = 'a'; j < 'f'; j++) {
284                 int c = g_ascii_xdigit_value (j);
285                 if (c  != (j - 'a' + 10))
286                         return FAILED ("Lower %c -> %d", j, c);
287         }
288         for (j = 'A'; j < 'F'; j++) {
289                 int c = g_ascii_xdigit_value (j);
290                 if (c  != (j - 'A' + 10))
291                         return FAILED ("Upper %c -> %d", j, c);
292         }
293         return OK;
294 }
295
296 RESULT
297 test_strdelimit ()
298 {
299         gchar *str;
300
301         str = g_strdup (G_STR_DELIMITERS);
302         str = g_strdelimit (str, NULL, 'a');
303         if (0 != strcmp ("aaaaaaa", str))
304                 return FAILED ("All delimiters: '%s'", str);
305         g_free (str);
306         str = g_strdup ("hola");
307         str = g_strdelimit (str, "ha", '+');
308         if (0 != strcmp ("+ol+", str))
309                 return FAILED ("2 delimiters: '%s'", str);
310         g_free (str);
311         return OK;
312 }
313
314 #define NUMBERS "0123456789"
315
316 RESULT
317 test_strlcpy ()
318 {
319         const gchar *src = "onetwothree";
320         gchar *dest;
321         gsize i;
322
323         dest = g_malloc (strlen (src) + 1);
324         memset (dest, 0, strlen (src) + 1);
325         i = g_strlcpy (dest, src, (gsize)-1);
326         if (i != strlen (src))
327                 return FAILED ("Test1 got %d", i);
328
329         if (0 != strcmp (dest, src))
330                 return FAILED ("Src and dest not equal");
331
332         i = g_strlcpy (dest, src, 3);
333         if (i != strlen (src))
334                 return FAILED ("Test1 got %d", i);
335         if (0 != strcmp (dest, "on"))
336                 return FAILED ("Test2");
337
338         i = g_strlcpy (dest, src, 1);
339         if (i != strlen (src))
340                 return FAILED ("Test3 got %d", i);
341         if (*dest != '\0')
342                 return FAILED ("Test4");
343
344         i = g_strlcpy (dest, src, 12345);
345         if (i != strlen (src))
346                 return FAILED ("Test4 got %d", i);
347         if (0 != strcmp (dest, src))
348                 return FAILED ("Src and dest not equal 2");
349         g_free (dest);
350
351         /* This is a test for g_filename_from_utf8, even if it does not look like it */
352         dest = g_filename_from_utf8 (NUMBERS, strlen (NUMBERS), NULL, NULL, NULL);
353         if (0 != strcmp (dest, NUMBERS))
354                 return FAILED ("problem [%s] and [%s]", dest, NUMBERS);
355         g_free (dest);
356         
357         return OK;
358 }
359
360 RESULT
361 test_strescape ()
362 {
363         gchar *str;
364
365         str = g_strescape ("abc", NULL);
366         if (strcmp ("abc", str))
367                 return FAILED ("#1");
368         str = g_strescape ("\t\b\f\n\r\\\"abc", NULL);
369         if (strcmp ("\\t\\b\\f\\n\\r\\\\\\\"abc", str))
370                 return FAILED ("#2 %s", str);
371         str = g_strescape ("\001abc", NULL);
372         if (strcmp ("\\001abc", str))
373                 return FAILED ("#3 %s", str);
374         str = g_strescape ("\001abc", "\001");
375         if (strcmp ("\001abc", str))
376                 return FAILED ("#3 %s", str);
377         return OK;
378 }
379
380 RESULT
381 test_ascii_strncasecmp ()
382 {
383         int n;
384
385         n = g_ascii_strncasecmp ("123", "123", 1);
386         if (n != 0)
387                 return FAILED ("Should have been 0");
388         
389         n = g_ascii_strncasecmp ("423", "123", 1);
390         if (n != 3)
391                 return FAILED ("Should have been 3, got %d", n);
392
393         n = g_ascii_strncasecmp ("123", "423", 1);
394         if (n != -3)
395                 return FAILED ("Should have been -3, got %d", n);
396
397         n = g_ascii_strncasecmp ("1", "1", 10);
398         if (n != 0)
399                 return FAILED ("Should have been 0, got %d", n);
400         return OK;
401 }
402
403 RESULT
404 test_ascii_strdown ()
405 {
406         const gchar *a = "~09+AaBcDeFzZ$0909EmPAbCdEEEEEZZZZAAA";
407         const gchar *b = "~09+aabcdefzz$0909empabcdeeeeezzzzaaa";
408         gchar *c;
409         gint n, l;
410
411         l = (gint)strlen (b);
412         c = g_ascii_strdown (a, l);
413         n = g_ascii_strncasecmp (b, c, l);
414
415         if (n != 0) {
416                 g_free (c);
417                 return FAILED ("Should have been 0, got %d", n);
418         }
419
420         g_free (c);
421         return OK;
422 }
423
424 static Test strutil_tests [] = {
425         {"g_strfreev", test_strfreev},
426         {"g_strconcat", test_concat},
427         {"g_strsplit", test_split},
428         {"g_strreverse", test_strreverse},
429         {"g_strjoin", test_strjoin},
430         {"g_strchug", test_strchug},
431         {"g_strchomp", test_strchomp},
432         {"g_strstrip", test_strstrip},
433         {"g_filename_to_uri", test_filename_to_uri},
434         {"g_filename_from_uri", test_filename_from_uri},
435         {"g_ascii_xdigit_value", test_ascii_xdigit_value},
436         {"g_strdelimit", test_strdelimit},
437         {"g_strlcpy", test_strlcpy},
438         {"g_strescape", test_strescape},
439         {"g_ascii_strncasecmp", test_ascii_strncasecmp },
440         {"g_ascii_strdown", test_ascii_strdown },
441         {NULL, NULL}
442 };
443
444 DEFINE_TEST_GROUP_INIT(strutil_tests_init, strutil_tests)
445
446