string-util.c 10 KB

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