73efd13f4de91ecfbbe8a8139f139d2e56cc795e
[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         v = g_strsplit ("abcXYdefXghiXYjklYmno", "XY", 4);
94         if (strcmp (v [0], "abc") != 0)
95                 return FAILED ("Invalid value 0");
96         
97         if (strcmp (v [1], "defXghi") != 0)
98                 return FAILED ("Invalid value 1");
99
100         if (strcmp (v [2], "jklYmno") != 0)
101                 return FAILED ("Invalid value 2");
102
103         if (v [3] != NULL)
104                 return FAILED ("Expected only 3 elements (1)");
105         
106         g_strfreev (v);
107
108         v = g_strsplit ("abcXYdefXghiXYjklYmno", "XY", 2);
109         if (strcmp (v [0], "abc") != 0)
110                 return FAILED ("Invalid value 3");
111         
112         if (strcmp (v [1], "defXghiXYjklYmno") != 0)
113                 return FAILED ("Invalid value 4");
114
115         if (v [2] != NULL)
116                 return FAILED ("Expected only 2 elements (2)");
117         
118         g_strfreev (v);
119
120         v = g_strsplit ("abcXYdefXghiXYjklYmnoXY", "XY", 3);
121         if (strcmp (v [0], "abc") != 0)
122                 return FAILED ("Invalid value 5");
123         
124         if (strcmp (v [1], "defXghi") != 0)
125                 return FAILED ("Invalid value 6");
126
127         if (strcmp (v [2], "jklYmnoXY") != 0)
128                 return FAILED ("Invalid value 7");
129
130         if (v [3] != NULL)
131                 return FAILED ("Expected only 3 elements (3)");
132         
133         g_strfreev (v);
134
135         v = g_strsplit ("abcXYXYXYdefXY", "XY", -1);
136         if (strcmp (v [0], "abc") != 0)
137                 return FAILED ("Invalid value 8");
138
139         if (strcmp (v [1], "") != 0)
140                 return FAILED ("Invalid value 9");
141
142         if (strcmp (v [2], "") != 0)
143                 return FAILED ("Invalid value 10");
144         
145         if (strcmp (v [3], "def") != 0)
146                 return FAILED ("Invalid value 11");
147
148         if (strcmp (v [4], "") != 0)
149                 return FAILED ("Invalid value 12");
150
151         if (v [5] != NULL)
152                 return FAILED ("Expected only 5 elements (4)");
153         
154         g_strfreev (v);
155
156         v = g_strsplit ("XYXYXYabcXYdef", "XY", -1);
157         if (strcmp (v [0], "") != 0)
158                 return FAILED ("Invalid value 13");
159         
160         if (strcmp (v [1], "") != 0)
161                 return FAILED ("Invalid value 14");
162         
163         if (strcmp (v [2], "") != 0)
164                 return FAILED ("Invalid value 15");
165         
166         if (strcmp (v [3], "abc") != 0)
167                 return FAILED ("Invalid value 16");
168         
169         if (strcmp (v [4], "def") != 0)
170                 return FAILED ("Invalid value 17");
171
172         if (v [5] != NULL)
173                 return FAILED ("Expected only 5 elements (5)");
174         
175         g_strfreev (v);
176
177         v = g_strsplit ("value=", "=", 2);
178         if (strcmp (v [0], "value") != 0)
179                 return FAILED ("Invalid value 18; expected 'value', got '%s'", v [0]);
180         if (strcmp (v [1], "") != 0)
181                 return FAILED ("Invalid value 19; expected '', got '%s'", v [1]);
182         if (v [2] != NULL)
183                 return FAILED ("Expected only 2 elements (6)");
184
185         g_strfreev (v);
186
187         return OK;
188 }
189
190 RESULT
191 test_split_set ()
192 {
193         gchar **v;
194         
195         v = g_strsplit_set ("abcXYdefXghiXYjklYmno", "XY", 6);
196         if (strcmp (v [0], "abc") != 0)
197                 return FAILED ("Invalid value 0");
198
199         if (strcmp (v [1], "") != 0)
200                 return FAILED ("Invalid value 1");
201         
202         if (strcmp (v [2], "def") != 0)
203                 return FAILED ("Invalid value 2");
204
205         if (strcmp (v [3], "ghi") != 0)
206                 return FAILED ("Invalid value 3");
207
208         if (strcmp (v [4], "") != 0)
209                 return FAILED ("Invalid value 4");
210
211         if (strcmp (v [5], "jklYmno") != 0)
212                 return FAILED ("Invalid value 5");
213
214         if (v [6] != NULL)
215                 return FAILED ("Expected only 6 elements (1)");
216
217         g_strfreev (v);
218
219         v = g_strsplit_set ("abcXYdefXghiXYjklYmno", "XY", 3);
220         if (strcmp (v [0], "abc") != 0)
221                 return FAILED ("Invalid value 6");
222
223         if (strcmp (v [1], "") != 0)
224                 return FAILED ("Invalid value 7");
225         
226         if (strcmp (v [2], "defXghiXYjklYmno") != 0)
227                 return FAILED ("Invalid value 8");
228
229         if (v [3] != NULL)
230                 return FAILED ("Expected only 3 elements (2)");
231         
232         g_strfreev (v);
233
234         v = g_strsplit_set ("abcXdefYghiXjklYmnoX", "XY", 5);
235         if (strcmp (v [0], "abc") != 0)
236                 return FAILED ("Invalid value 9");
237         
238         if (strcmp (v [1], "def") != 0)
239                 return FAILED ("Invalid value 10");
240
241         if (strcmp (v [2], "ghi") != 0)
242                 return FAILED ("Invalid value 11");
243
244         if (strcmp (v [3], "jkl") != 0)
245                 return FAILED ("Invalid value 12");
246
247         if (strcmp (v [4], "mnoX") != 0)
248                 return FAILED ("Invalid value 13");
249
250         if (v [5] != NULL)
251                 return FAILED ("Expected only 5 elements (5)");
252         
253         g_strfreev (v);
254
255         v = g_strsplit_set ("abcXYXdefXY", "XY", -1);
256         if (strcmp (v [0], "abc") != 0)
257                 return FAILED ("Invalid value 14");
258
259         if (strcmp (v [1], "") != 0)
260                 return FAILED ("Invalid value 15");
261
262         if (strcmp (v [2], "") != 0)
263                 return FAILED ("Invalid value 16");
264         
265         if (strcmp (v [3], "def") != 0)
266                 return FAILED ("Invalid value 17");
267
268         if (strcmp (v [4], "") != 0)
269                 return FAILED ("Invalid value 18");
270
271         if (strcmp (v [5], "") != 0)
272                 return FAILED ("Invalid value 19");
273
274         if (v [6] != NULL)
275                 return FAILED ("Expected only 6 elements (4)");
276         
277         g_strfreev (v);
278
279         v = g_strsplit_set ("XYXabcXYdef", "XY", -1);
280         if (strcmp (v [0], "") != 0)
281                 return FAILED ("Invalid value 20");
282         
283         if (strcmp (v [1], "") != 0)
284                 return FAILED ("Invalid value 21");
285         
286         if (strcmp (v [2], "") != 0)
287                 return FAILED ("Invalid value 22");
288         
289         if (strcmp (v [3], "abc") != 0)
290                 return FAILED ("Invalid value 23");
291
292         if (strcmp (v [4], "") != 0)
293                 return FAILED ("Invalid value 24");
294         
295         if (strcmp (v [5], "def") != 0)
296                 return FAILED ("Invalid value 25");
297
298         if (v [6] != NULL)
299                 return FAILED ("Expected only 6 elements (5)");
300         
301         g_strfreev (v);
302
303         return OK;
304 }
305
306 RESULT
307 test_strreverse ()
308 {
309         RESULT res = OK;
310         gchar *a = g_strdup ("onetwothree");
311         gchar *a_target = "eerhtowteno";
312         gchar *b = g_strdup ("onetwothre");
313         gchar *b_target = "erhtowteno";
314         gchar *c = g_strdup ("");
315         gchar *c_target = "";
316
317         g_strreverse (a);
318         if (strcmp (a, a_target)) {
319                 res = FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", a, a_target);
320                 goto cleanup;
321         }
322
323         g_strreverse (b);
324         if (strcmp (b, b_target)) {
325                 res = FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", b, b_target);
326                 goto cleanup;
327         }
328
329         g_strreverse (c);
330         if (strcmp (c, c_target)) {
331                 res = FAILED("strreverse failed. Expecting: '%s' and got '%s'\n", b, b_target);
332                 goto cleanup;
333         }
334
335 cleanup:
336         g_free (c);
337         g_free (b);
338         g_free (a);
339         return res;
340 }
341
342 RESULT
343 test_strjoin ()
344 {
345         char *s;
346         
347         s = g_strjoin (NULL, "a", "b", NULL);
348         if (strcmp (s, "ab") != 0)
349                 return FAILED ("Join of two strings with no separator fails");
350         g_free (s);
351
352         s = g_strjoin ("", "a", "b", NULL);
353         if (strcmp (s, "ab") != 0)
354                 return FAILED ("Join of two strings with empty separator fails");
355         g_free (s);
356
357         s = g_strjoin ("-", "a", "b", NULL);
358         if (strcmp (s, "a-b") != 0)
359                 return FAILED ("Join of two strings with separator fails");
360         g_free (s);
361
362         s = g_strjoin ("-", "aaaa", "bbbb", "cccc", "dddd", NULL);
363         if (strcmp (s, "aaaa-bbbb-cccc-dddd") != 0)
364                 return FAILED ("Join of multiple strings fails");
365         g_free (s);
366
367         s = g_strjoin ("-", NULL);
368         if (s == NULL || (strcmp (s, "") != 0))
369                 return FAILED ("Failed to join empty arguments");
370         g_free (s);
371
372         return OK;
373 }
374
375 RESULT
376 test_strchug ()
377 {
378         char *str = g_strdup (" \t\n hola");
379
380         g_strchug (str);
381         if (strcmp ("hola", str)) {
382                 fprintf (stderr, "%s\n", str);
383                 g_free (str);
384                 return FAILED ("Failed.");
385         }
386         g_free (str);
387         return OK;
388 }
389
390 RESULT
391 test_strchomp ()
392 {
393         char *str = g_strdup ("hola  \t");
394
395         g_strchomp (str);
396         if (strcmp ("hola", str)) {
397                 fprintf (stderr, "%s\n", str);
398                 g_free (str);
399                 return FAILED ("Failed.");
400         }
401         g_free (str);
402         return OK;
403 }
404
405 RESULT
406 test_strstrip ()
407 {
408         char *str = g_strdup (" \t hola   ");
409
410         g_strstrip (str);
411         if (strcmp ("hola", str)) {
412                 fprintf (stderr, "%s\n", str);
413                 g_free (str);
414                 return FAILED ("Failed.");
415         }
416         g_free (str);
417         return OK;
418 }
419
420 #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);
421
422 #define errit(so) do { s = g_filename_to_uri (so, NULL, NULL); if (s != NULL) return FAILED ("got %s, expected NULL", s); } while (0);
423
424 RESULT
425 test_filename_to_uri ()
426 {
427 #ifdef G_OS_WIN32
428 #else
429         char *s;
430
431         urit ("/a", "file:///a");
432         urit ("/home/miguel", "file:///home/miguel");
433         urit ("/home/mig uel", "file:///home/mig%20uel");
434         urit ("/\303\241", "file:///%C3%A1");
435         urit ("/\303\241/octal", "file:///%C3%A1/octal");
436         urit ("/%", "file:///%25");
437         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");
438         urit ("/!$&'()*+,-./", "file:///!$&'()*+,-./");
439         urit ("/\042\043\045", "file:///%22%23%25");
440         urit ("/0123456789:=", "file:///0123456789:=");
441         urit ("/\073\074\076\077", "file:///%3B%3C%3E%3F");
442         urit ("/\133\134\135\136_\140\173\174\175", "file:///%5B%5C%5D%5E_%60%7B%7C%7D");
443         urit ("/\173\174\175\176\177\200", "file:///%7B%7C%7D~%7F%80");
444         urit ("/@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "file:///@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
445         errit ("a");
446         errit ("./hola");
447 #endif
448         
449         return OK;
450 }
451
452 #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);
453
454 #define ferrit(so) do { s = g_filename_from_uri (so, NULL, NULL); if (s != NULL) return FAILED ("got %s, expected NULL", s); } while (0);
455
456 RESULT
457 test_filename_from_uri ()
458 {
459 #ifdef G_OS_WIN32
460 #else
461         char *s;
462
463         fileit ("file:///a", "/a");
464         fileit ("file:///%41", "/A");
465         fileit ("file:///home/miguel", "/home/miguel");
466         fileit ("file:///home/mig%20uel", "/home/mig uel");
467         ferrit ("/a");
468         ferrit ("a");
469         ferrit ("file://a");
470         ferrit ("file:a");
471         ferrit ("file:///%");
472         ferrit ("file:///%0");
473         ferrit ("file:///%jj");
474 #endif
475         
476         return OK;
477 }
478
479 RESULT
480 test_ascii_xdigit_value ()
481 {
482         int i;
483         gchar j;
484
485         i = g_ascii_xdigit_value ('9' + 1);
486         if (i != -1)
487                 return FAILED ("'9' + 1");
488         i = g_ascii_xdigit_value ('0' - 1);
489         if (i != -1)
490                 return FAILED ("'0' - 1");
491         i = g_ascii_xdigit_value ('a' - 1);
492         if (i != -1)
493                 return FAILED ("'a' - 1");
494         i = g_ascii_xdigit_value ('f' + 1);
495         if (i != -1)
496                 return FAILED ("'f' + 1");
497         i = g_ascii_xdigit_value ('A' - 1);
498         if (i != -1)
499                 return FAILED ("'A' - 1");
500         i = g_ascii_xdigit_value ('F' + 1);
501         if (i != -1)
502                 return FAILED ("'F' + 1");
503
504         for (j = '0'; j < '9'; j++) {
505                 int c = g_ascii_xdigit_value (j);
506                 if (c  != (j - '0'))
507                         return FAILED ("Digits %c -> %d", j, c);
508         }
509         for (j = 'a'; j < 'f'; j++) {
510                 int c = g_ascii_xdigit_value (j);
511                 if (c  != (j - 'a' + 10))
512                         return FAILED ("Lower %c -> %d", j, c);
513         }
514         for (j = 'A'; j < 'F'; j++) {
515                 int c = g_ascii_xdigit_value (j);
516                 if (c  != (j - 'A' + 10))
517                         return FAILED ("Upper %c -> %d", j, c);
518         }
519         return OK;
520 }
521
522 RESULT
523 test_strdelimit ()
524 {
525         gchar *str;
526
527         str = g_strdup (G_STR_DELIMITERS);
528         str = g_strdelimit (str, NULL, 'a');
529         if (0 != strcmp ("aaaaaaa", str))
530                 return FAILED ("All delimiters: '%s'", str);
531         g_free (str);
532         str = g_strdup ("hola");
533         str = g_strdelimit (str, "ha", '+');
534         if (0 != strcmp ("+ol+", str))
535                 return FAILED ("2 delimiters: '%s'", str);
536         g_free (str);
537         return OK;
538 }
539
540 #define NUMBERS "0123456789"
541
542 RESULT
543 test_strlcpy ()
544 {
545         const gchar *src = "onetwothree";
546         gchar *dest;
547         gsize i;
548
549         dest = g_malloc (strlen (src) + 1);
550         memset (dest, 0, strlen (src) + 1);
551         i = g_strlcpy (dest, src, (gsize)-1);
552         if (i != strlen (src))
553                 return FAILED ("Test1 got %d", i);
554
555         if (0 != strcmp (dest, src))
556                 return FAILED ("Src and dest not equal");
557
558         i = g_strlcpy (dest, src, 3);
559         if (i != strlen (src))
560                 return FAILED ("Test1 got %d", i);
561         if (0 != strcmp (dest, "on"))
562                 return FAILED ("Test2");
563
564         i = g_strlcpy (dest, src, 1);
565         if (i != strlen (src))
566                 return FAILED ("Test3 got %d", i);
567         if (*dest != '\0')
568                 return FAILED ("Test4");
569
570         i = g_strlcpy (dest, src, 12345);
571         if (i != strlen (src))
572                 return FAILED ("Test4 got %d", i);
573         if (0 != strcmp (dest, src))
574                 return FAILED ("Src and dest not equal 2");
575         g_free (dest);
576
577         /* This is a test for g_filename_from_utf8, even if it does not look like it */
578         dest = g_filename_from_utf8 (NUMBERS, strlen (NUMBERS), NULL, NULL, NULL);
579         if (0 != strcmp (dest, NUMBERS))
580                 return FAILED ("problem [%s] and [%s]", dest, NUMBERS);
581         g_free (dest);
582         
583         return OK;
584 }
585
586 RESULT
587 test_strescape ()
588 {
589         gchar *str;
590
591         str = g_strescape ("abc", NULL);
592         if (strcmp ("abc", str))
593                 return FAILED ("#1");
594         str = g_strescape ("\t\b\f\n\r\\\"abc", NULL);
595         if (strcmp ("\\t\\b\\f\\n\\r\\\\\\\"abc", str))
596                 return FAILED ("#2 %s", str);
597         str = g_strescape ("\001abc", NULL);
598         if (strcmp ("\\001abc", str))
599                 return FAILED ("#3 %s", str);
600         str = g_strescape ("\001abc", "\001");
601         if (strcmp ("\001abc", str))
602                 return FAILED ("#3 %s", str);
603         return OK;
604 }
605
606 RESULT
607 test_ascii_strncasecmp ()
608 {
609         int n;
610
611         n = g_ascii_strncasecmp ("123", "123", 1);
612         if (n != 0)
613                 return FAILED ("Should have been 0");
614         
615         n = g_ascii_strncasecmp ("423", "123", 1);
616         if (n != 3)
617                 return FAILED ("Should have been 3, got %d", n);
618
619         n = g_ascii_strncasecmp ("123", "423", 1);
620         if (n != -3)
621                 return FAILED ("Should have been -3, got %d", n);
622
623         n = g_ascii_strncasecmp ("1", "1", 10);
624         if (n != 0)
625                 return FAILED ("Should have been 0, got %d", n);
626         return OK;
627 }
628
629 RESULT
630 test_ascii_strdown ()
631 {
632         const gchar *a = "~09+AaBcDeFzZ$0909EmPAbCdEEEEEZZZZAAA";
633         const gchar *b = "~09+aabcdefzz$0909empabcdeeeeezzzzaaa";
634         gchar *c;
635         gint n, l;
636
637         l = (gint)strlen (b);
638         c = g_ascii_strdown (a, l);
639         n = g_ascii_strncasecmp (b, c, l);
640
641         if (n != 0) {
642                 g_free (c);
643                 return FAILED ("Should have been 0, got %d", n);
644         }
645
646         g_free (c);
647         return OK;
648 }
649
650 RESULT
651 test_strdupv ()
652 {
653         gchar **one;
654         gchar **two;
655         gint len;
656
657         one = g_strdupv (NULL);
658         if (one)
659                 return FAILED ("Should have been NULL");
660
661         one = g_malloc (sizeof (gchar *));
662         *one = NULL;
663         two = g_strdupv (one);
664         if (!two)
665                 FAILED ("Should have been not NULL");
666         len = g_strv_length (two);
667         if (len)
668                 FAILED ("Should have been 0");
669         g_strfreev (two);
670         g_strfreev (one);
671         return NULL;
672 }
673
674 static Test strutil_tests [] = {
675         {"g_strfreev", test_strfreev},
676         {"g_strconcat", test_concat},
677         {"g_strsplit", test_split},
678         {"g_strsplit_set", test_split_set},
679         {"g_strreverse", test_strreverse},
680         {"g_strjoin", test_strjoin},
681         {"g_strchug", test_strchug},
682         {"g_strchomp", test_strchomp},
683         {"g_strstrip", test_strstrip},
684         {"g_filename_to_uri", test_filename_to_uri},
685         {"g_filename_from_uri", test_filename_from_uri},
686         {"g_ascii_xdigit_value", test_ascii_xdigit_value},
687         {"g_strdelimit", test_strdelimit},
688         {"g_strlcpy", test_strlcpy},
689         {"g_strescape", test_strescape},
690         {"g_ascii_strncasecmp", test_ascii_strncasecmp },
691         {"g_ascii_strdown", test_ascii_strdown },
692         {"g_strdupv", test_strdupv },
693         {NULL, NULL}
694 };
695
696 DEFINE_TEST_GROUP_INIT(strutil_tests_init, strutil_tests)
697
698