/eina/src/tests/eina_test_strbuf.c

https://github.com/kakaroto/e17 · C · 449 lines · 335 code · 97 blank · 17 comment · 66 complexity · 5d52a3231086701cfbdcf2ce2c8b02e3 MD5 · raw file

  1. /* EINA - EFL data type library
  2. * Copyright (C) 2010 Sebastian Dransfeld
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with this library;
  16. * if not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifdef HAVE_CONFIG_H
  19. # include "config.h"
  20. #endif
  21. #include <stdio.h>
  22. #include "eina_suite.h"
  23. #include "Eina.h"
  24. START_TEST(strbuf_simple)
  25. {
  26. Eina_Strbuf *buf;
  27. char *txt;
  28. #define TEXT \
  29. "This test should be so long that it is longer than the initial size of strbuf"
  30. eina_init();
  31. buf = eina_strbuf_new();
  32. fail_if(!buf);
  33. eina_strbuf_append(buf, TEXT);
  34. fail_if(strcmp(eina_strbuf_string_get(buf), TEXT));
  35. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  36. eina_strbuf_append(buf, TEXT);
  37. fail_if(strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
  38. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  39. txt = eina_strbuf_string_steal(buf);
  40. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  41. fail_if(strcmp(txt, TEXT TEXT));
  42. free(txt);
  43. fail_if(eina_strbuf_length_get(buf) != 0);
  44. fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
  45. eina_strbuf_append(buf, TEXT);
  46. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  47. eina_strbuf_reset(buf);
  48. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  49. fail_if(eina_strbuf_length_get(buf) != 0);
  50. fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT));
  51. eina_strbuf_free(buf);
  52. eina_shutdown();
  53. #undef TEXT
  54. }
  55. END_TEST
  56. START_TEST(strbuf_manage_simple)
  57. {
  58. Eina_Strbuf *buf;
  59. char *txt;
  60. #define TEXT \
  61. "This test should be so long that it is longer than the initial size of strbuf"
  62. eina_init();
  63. txt = strdup(TEXT);
  64. buf = eina_strbuf_manage_new(txt);
  65. fail_if(!buf);
  66. fail_if(strcmp(eina_strbuf_string_get(buf), TEXT));
  67. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  68. eina_strbuf_append(buf, TEXT);
  69. fail_if(strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
  70. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  71. txt = eina_strbuf_string_steal(buf);
  72. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  73. fail_if(strcmp(txt, TEXT TEXT));
  74. free(txt);
  75. fail_if(eina_strbuf_length_get(buf) != 0);
  76. fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT TEXT));
  77. eina_strbuf_append(buf, TEXT);
  78. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  79. eina_strbuf_reset(buf);
  80. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  81. fail_if(eina_strbuf_length_get(buf) != 0);
  82. fail_if(!strcmp(eina_strbuf_string_get(buf), TEXT));
  83. eina_strbuf_free(buf);
  84. eina_shutdown();
  85. #undef TEXT
  86. }
  87. END_TEST
  88. START_TEST(strbuf_remove)
  89. {
  90. Eina_Strbuf *buf;
  91. eina_init();
  92. buf = eina_strbuf_new();
  93. fail_if(!buf);
  94. eina_strbuf_append(buf, "123 456 789 abc");
  95. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  96. eina_strbuf_remove(buf, 0, 4);
  97. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  98. fail_if(strcmp(eina_strbuf_string_get(buf), "456 789 abc"));
  99. eina_strbuf_remove(buf, 8, 1000);
  100. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  101. fail_if(strcmp(eina_strbuf_string_get(buf), "456 789 "));
  102. eina_strbuf_remove(buf, 7, eina_strbuf_length_get(buf));
  103. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  104. fail_if(strcmp(eina_strbuf_string_get(buf), "456 789"));
  105. eina_strbuf_remove(buf, 2, 4);
  106. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  107. fail_if(strcmp(eina_strbuf_string_get(buf), "45789"));
  108. eina_strbuf_remove(buf, 4, 1);
  109. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  110. fail_if(strcmp(eina_strbuf_string_get(buf), "45789"));
  111. eina_strbuf_remove(buf, 0, eina_strbuf_length_get(buf));
  112. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  113. fail_if(strcmp(eina_strbuf_string_get(buf), ""));
  114. #define TEXT \
  115. "This test should be so long that it is longer than the initial size of strbuf"
  116. eina_strbuf_append(buf, TEXT TEXT);
  117. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  118. eina_strbuf_remove(buf, 0, eina_strbuf_length_get(buf) - 1);
  119. fail_if(strcmp(eina_strbuf_string_get(buf), "f"));
  120. #undef TEXT
  121. eina_strbuf_free(buf);
  122. eina_shutdown();
  123. }
  124. END_TEST
  125. START_TEST(strbuf_append)
  126. {
  127. Eina_Strbuf *buf;
  128. eina_init();
  129. buf = eina_strbuf_new();
  130. fail_if(!buf);
  131. eina_strbuf_append(buf, "abc");
  132. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  133. fail_if(strcmp(eina_strbuf_string_get(buf), "abc"));
  134. eina_strbuf_reset(buf);
  135. eina_strbuf_append_escaped(buf, "abc");
  136. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  137. fail_if(strcmp(eina_strbuf_string_get(buf), "abc"));
  138. eina_strbuf_reset(buf);
  139. eina_strbuf_append_escaped(buf, "abc '\\");
  140. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  141. fail_if(strcmp(eina_strbuf_string_get(buf), "abc\\ \\'\\\\"));
  142. eina_strbuf_reset(buf);
  143. eina_strbuf_append_n(buf, "abc", 2);
  144. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  145. fail_if(strcmp(eina_strbuf_string_get(buf), "ab"));
  146. eina_strbuf_reset(buf);
  147. eina_strbuf_append_char(buf, 'a');
  148. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  149. fail_if(strcmp(eina_strbuf_string_get(buf), "a"));
  150. eina_strbuf_reset(buf);
  151. eina_strbuf_append_length(buf, "something", strlen("something"));
  152. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  153. fail_if(strcmp(eina_strbuf_string_get(buf), "something"));
  154. eina_strbuf_reset(buf);
  155. eina_strbuf_append_length(buf, "somethingELSE", strlen("something"));
  156. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  157. fail_if(strcmp(eina_strbuf_string_get(buf), "something"));
  158. eina_strbuf_reset(buf);
  159. eina_strbuf_free(buf);
  160. eina_shutdown();
  161. }
  162. END_TEST
  163. START_TEST(strbuf_insert)
  164. {
  165. Eina_Strbuf *buf;
  166. eina_init();
  167. buf = eina_strbuf_new();
  168. fail_if(!buf);
  169. eina_strbuf_insert(buf, "abc", 10);
  170. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  171. fail_if(strcmp(eina_strbuf_string_get(buf), "abc"));
  172. eina_strbuf_insert(buf, "123", 0);
  173. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  174. fail_if(strcmp(eina_strbuf_string_get(buf), "123abc"));
  175. eina_strbuf_insert(buf, "xyz", eina_strbuf_length_get(buf));
  176. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  177. fail_if(strcmp(eina_strbuf_string_get(buf), "123abcxyz"));
  178. eina_strbuf_insert(buf, "xyz", 1);
  179. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  180. fail_if(strcmp(eina_strbuf_string_get(buf), "1xyz23abcxyz"));
  181. eina_strbuf_insert_n(buf, "ABCDEF", 2, 1);
  182. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  183. fail_if(strcmp(eina_strbuf_string_get(buf), "1ABxyz23abcxyz"));
  184. eina_strbuf_insert_n(buf, "EINA", 2, 3);
  185. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  186. fail_if(strcmp(eina_strbuf_string_get(buf), "1ABEIxyz23abcxyz"));
  187. eina_strbuf_insert_escaped(buf, "678", 3);
  188. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  189. fail_if(strncmp(eina_strbuf_string_get(buf) + 3, "678", 3));
  190. eina_strbuf_insert_escaped(buf, "089 '\\", 9);
  191. fail_if(strlen(eina_strbuf_string_get(
  192. buf)) != eina_strbuf_length_get(buf));
  193. fail_if(strncmp(eina_strbuf_string_get(buf) + 9,
  194. "089\\ \\'\\\\",
  195. strlen("089\\ \\'\\\\")));
  196. eina_strbuf_reset(buf);
  197. eina_strbuf_free(buf);
  198. eina_shutdown();
  199. }
  200. END_TEST
  201. START_TEST(strbuf_replace)
  202. {
  203. Eina_Strbuf *buf;
  204. eina_init();
  205. buf = eina_strbuf_new();
  206. fail_if(!buf);
  207. eina_strbuf_append(buf, "aaa");
  208. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  209. fail_if(strcmp(eina_strbuf_string_get(buf), "aaa"));
  210. fail_if(!eina_strbuf_replace(buf, "a", "b", 1));
  211. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  212. fail_if(strcmp(eina_strbuf_string_get(buf), "baa"));
  213. fail_if(eina_strbuf_replace_all(buf, "a", "b") != 2);
  214. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  215. fail_if(strcmp(eina_strbuf_string_get(buf), "bbb"));
  216. fail_if(!eina_strbuf_replace(buf, "b", "cc", 2));
  217. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  218. fail_if(strcmp(eina_strbuf_string_get(buf), "bccb"));
  219. fail_if(eina_strbuf_replace_all(buf, "c", "aa") != 2);
  220. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  221. fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
  222. fail_if(eina_strbuf_replace(buf, "c", "aa", 0));
  223. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  224. fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
  225. fail_if(eina_strbuf_replace(buf, "c", "aa", 2));
  226. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  227. fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
  228. fail_if(eina_strbuf_replace_all(buf, "c", "aa") != 0);
  229. fail_if(strlen(eina_strbuf_string_get(buf)) != eina_strbuf_length_get(buf));
  230. fail_if(strcmp(eina_strbuf_string_get(buf), "baaaab"));
  231. eina_strbuf_free(buf);
  232. eina_shutdown();
  233. }
  234. END_TEST
  235. START_TEST(strbuf_realloc)
  236. {
  237. Eina_Strbuf *buf;
  238. char pattern[1024 * 16];
  239. unsigned int i;
  240. size_t sz;
  241. for (i = 0; i < sizeof(pattern) - 1; i++)
  242. pattern[i] = 'a' + (i % 26);
  243. pattern[i] = '\0';
  244. eina_init();
  245. buf = eina_strbuf_new();
  246. fail_if(!buf);
  247. sz = 0;
  248. eina_strbuf_append_length(buf, pattern, 1);
  249. fail_if(eina_strbuf_length_get(buf) != sz + 1);
  250. fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 1));
  251. sz += 1;
  252. eina_strbuf_append_length(buf, pattern, 32);
  253. fail_if(eina_strbuf_length_get(buf) != sz + 32);
  254. fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 32));
  255. sz += 32;
  256. eina_strbuf_append_length(buf, pattern, 64);
  257. fail_if(eina_strbuf_length_get(buf) != sz + 64);
  258. fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 64));
  259. sz += 64;
  260. eina_strbuf_append_length(buf, pattern, 128);
  261. fail_if(eina_strbuf_length_get(buf) != sz + 128);
  262. fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 128));
  263. sz += 128;
  264. eina_strbuf_append_length(buf, pattern, 4096);
  265. fail_if(eina_strbuf_length_get(buf) != sz + 4096);
  266. fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, 4096));
  267. sz += 4096;
  268. eina_strbuf_append_length(buf, pattern, sizeof(pattern) - 1);
  269. fail_if(eina_strbuf_length_get(buf) != sz + sizeof(pattern) - 1);
  270. fail_if(memcmp(eina_strbuf_string_get(buf) + sz, pattern, sizeof(pattern) -
  271. 1));
  272. sz += sizeof(pattern) - 1;
  273. eina_strbuf_remove(buf, 1024, 1024 + 1234);
  274. fail_if(eina_strbuf_length_get(buf) != sz - 1234);
  275. sz -= 1234;
  276. eina_strbuf_remove(buf, 0, 0 + 8192);
  277. fail_if(eina_strbuf_length_get(buf) != sz - 8192);
  278. sz -= 8192;
  279. eina_strbuf_remove(buf, 0, 0 + 32);
  280. fail_if(eina_strbuf_length_get(buf) != sz - 32);
  281. sz -= 32;
  282. eina_strbuf_free(buf);
  283. eina_shutdown();
  284. }
  285. END_TEST
  286. START_TEST(strbuf_append_realloc)
  287. {
  288. Eina_Strbuf *buf;
  289. const size_t runs = 40960;
  290. const char target_pattern[] = "stringstrsstr";
  291. const char *str;
  292. size_t i, target_pattern_size;
  293. eina_init();
  294. buf = eina_strbuf_new();
  295. fail_if(!buf);
  296. for (i = 0; i < runs; i++)
  297. {
  298. fail_if(!eina_strbuf_append(buf, "string"));
  299. fail_if(!eina_strbuf_append_n(buf, "string", 3));
  300. fail_if(!eina_strbuf_append_char(buf, 's'));
  301. fail_if(!eina_strbuf_append_length(buf, "string", 3));
  302. }
  303. target_pattern_size = strlen(target_pattern);
  304. fail_if(eina_strbuf_length_get(buf) != (runs * target_pattern_size));
  305. str = eina_strbuf_string_get(buf);
  306. fail_if(str == NULL);
  307. for (i = 0; i < runs; i++, str += target_pattern_size)
  308. fail_if(memcmp(str, target_pattern, target_pattern_size));
  309. eina_strbuf_free(buf);
  310. eina_shutdown();
  311. }
  312. END_TEST
  313. START_TEST(strbuf_prepend_realloc)
  314. {
  315. Eina_Strbuf *buf;
  316. const size_t runs = 40960;
  317. const char target_pattern[] = "strsstrstring";
  318. const char *str;
  319. size_t i, target_pattern_size;
  320. eina_init();
  321. buf = eina_strbuf_new();
  322. fail_if(!buf);
  323. for (i = 0; i < runs; i++)
  324. {
  325. fail_if(!eina_strbuf_prepend(buf, "string"));
  326. fail_if(!eina_strbuf_prepend_n(buf, "string", 3));
  327. fail_if(!eina_strbuf_prepend_char(buf, 's'));
  328. fail_if(!eina_strbuf_prepend_length(buf, "string", 3));
  329. }
  330. target_pattern_size = strlen(target_pattern);
  331. fail_if(eina_strbuf_length_get(buf) != (runs * target_pattern_size));
  332. str = eina_strbuf_string_get(buf);
  333. fail_if(str == NULL);
  334. for (i = 0; i < runs; i++, str += target_pattern_size)
  335. fail_if(memcmp(str, target_pattern, target_pattern_size));
  336. eina_strbuf_free(buf);
  337. eina_shutdown();
  338. }
  339. END_TEST
  340. void
  341. eina_test_strbuf(TCase *tc)
  342. {
  343. tcase_add_test(tc, strbuf_simple);
  344. tcase_add_test(tc, strbuf_remove);
  345. tcase_add_test(tc, strbuf_append);
  346. tcase_add_test(tc, strbuf_insert);
  347. tcase_add_test(tc, strbuf_replace);
  348. tcase_add_test(tc, strbuf_realloc);
  349. tcase_add_test(tc, strbuf_append_realloc);
  350. tcase_add_test(tc, strbuf_prepend_realloc);
  351. tcase_add_test(tc, strbuf_manage_simple);
  352. }