New test.
[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
258         i = g_ascii_xdigit_value ('9' + 1);
259         if (i != -1)
260                 return FAILED ("'9' + 1");
261         i = g_ascii_xdigit_value ('0' - 1);
262         if (i != -1)
263                 return FAILED ("'0' - 1");
264         i = g_ascii_xdigit_value ('a' - 1);
265         if (i != -1)
266                 return FAILED ("'a' - 1");
267         i = g_ascii_xdigit_value ('f' + 1);
268         if (i != -1)
269                 return FAILED ("'f' + 1");
270         i = g_ascii_xdigit_value ('A' - 1);
271         if (i != -1)
272                 return FAILED ("'A' - 1");
273         i = g_ascii_xdigit_value ('F' + 1);
274         if (i != -1)
275                 return FAILED ("'F' + 1");
276
277         for (i = '0'; i < '9'; i++) {
278                 int c = g_ascii_xdigit_value (i);
279                 if (c  != (i - '0'))
280                         return FAILED ("Digits %c -> %d", i, c);
281         }
282         for (i = 'a'; i < 'f'; i++) {
283                 int c = g_ascii_xdigit_value (i);
284                 if (c  != (i - 'a' + 10))
285                         return FAILED ("Lower %c -> %d", i, c);
286         }
287         for (i = 'A'; i < 'F'; i++) {
288                 int c = g_ascii_xdigit_value (i);
289                 if (c  != (i - 'A' + 10))
290                         return FAILED ("Upper %c -> %d", i, c);
291         }
292         return OK;
293 }
294
295 RESULT
296 test_strdelimit ()
297 {
298         gchar *str;
299
300         str = g_strdup (G_STR_DELIMITERS);
301         str = g_strdelimit (str, NULL, 'a');
302         if (0 != strcmp ("aaaaaaa", str))
303                 return FAILED ("All delimiters: '%s'", str);
304         g_free (str);
305         str = g_strdup ("hola");
306         str = g_strdelimit (str, "ha", '+');
307         if (0 != strcmp ("+ol+", str))
308                 return FAILED ("2 delimiters: '%s'", str);
309         g_free (str);
310         return OK;
311 }
312
313 #define TEXT "0123456789"
314
315 RESULT
316 test_strlcpy ()
317 {
318         const gchar *src = "onetwothree";
319         gchar *dest;
320         int i;
321
322         dest = g_malloc (strlen (src) + 1);
323         memset (dest, 0, strlen (src) + 1);
324         i = g_strlcpy (dest, src, -1);
325         if (i != strlen (src))
326                 return FAILED ("Test1 got %d", i);
327
328         if (0 != strcmp (dest, src))
329                 return FAILED ("Src and dest not equal");
330
331         i = g_strlcpy (dest, src, 3);
332         if (i != strlen (src))
333                 return FAILED ("Test1 got %d", i);
334         if (0 != strcmp (dest, "on"))
335                 return FAILED ("Test2");
336
337         i = g_strlcpy (dest, src, 1);
338         if (i != strlen (src))
339                 return FAILED ("Test3 got %d", i);
340         if (*dest != '\0')
341                 return FAILED ("Test4");
342
343         i = g_strlcpy (dest, src, 12345);
344         if (i != strlen (src))
345                 return FAILED ("Test4 got %d", i);
346         if (0 != strcmp (dest, src))
347                 return FAILED ("Src and dest not equal 2");
348         g_free (dest);
349
350         /* This is a test for g_filename_from_utf8, even if it does not look like it */
351         dest = g_filename_from_utf8 (TEXT, strlen (TEXT), NULL, NULL, NULL);
352         if (0 != strcmp (dest, TEXT))
353                 return FAILED ("problem [%s] and [%s]", dest, TEXT);
354         g_free (dest);
355         
356         return OK;
357 }
358
359 RESULT
360 test_strescape ()
361 {
362         gchar *str;
363
364         str = g_strescape ("abc", NULL);
365         if (strcmp ("abc", str))
366                 return FAILED ("#1");
367         str = g_strescape ("\t\b\f\n\r\\\"abc", NULL);
368         if (strcmp ("\\t\\b\\f\\n\\r\\\\\\\"abc", str))
369                 return FAILED ("#2 %s", str);
370         str = g_strescape ("\001abc", NULL);
371         if (strcmp ("\\001abc", str))
372                 return FAILED ("#3 %s", str);
373         str = g_strescape ("\001abc", "\001");
374         if (strcmp ("\001abc", str))
375                 return FAILED ("#3 %s", str);
376         return OK;
377 }
378
379 RESULT
380 test_ascii_strncasecmp ()
381 {
382         int n;
383
384         n = g_ascii_strncasecmp ("123", "123", 1);
385         if (n != 0)
386                 return FAILED ("Should have been 0");
387         
388         n = g_ascii_strncasecmp ("423", "123", 1);
389         if (n != 3)
390                 return FAILED ("Should have been 3, got %d", n);
391
392         n = g_ascii_strncasecmp ("123", "423", 1);
393         if (n != -3)
394                 return FAILED ("Should have been -3, got %d", n);
395
396         n = g_ascii_strncasecmp ("1", "1", 10);
397         if (n != 0)
398                 return FAILED ("Should have been 0, got %d", n);
399         return OK;
400 }
401
402 static Test strutil_tests [] = {
403         {"g_strfreev", test_strfreev},
404         {"g_strconcat", test_concat},
405         {"g_strsplit", test_split},
406         {"g_strreverse", test_strreverse},
407         {"g_strjoin", test_strjoin},
408         {"g_strchug", test_strchug},
409         {"g_strchomp", test_strchomp},
410         {"g_strstrip", test_strstrip},
411         {"g_filename_to_uri", test_filename_to_uri},
412         {"g_filename_from_uri", test_filename_from_uri},
413         {"g_ascii_xdigit_value", test_ascii_xdigit_value},
414         {"g_strdelimit", test_strdelimit},
415         {"g_strlcpy", test_strlcpy},
416         {"g_strescape", test_strescape},
417         {"g_ascii_strncasecmp", test_ascii_strncasecmp },
418         {NULL, NULL}
419 };
420
421 DEFINE_TEST_GROUP_INIT(strutil_tests_init, strutil_tests)
422