DString_tests.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <cmocka.h>
  4. #include "scufcont/DString.h"
  5. #include "scufcont/scufcont.h"
  6. void test_SCDString_alloc(void **state) {
  7. (void) state;
  8. const char *c_str = "Hello";
  9. const size_t c_str_len = strlen(c_str);
  10. SCDString dstr;
  11. assert_true(SCDString_alloc(&dstr, c_str, c_str_len) == SCUFCONT_SUCCESS);
  12. assert_memory_equal(dstr.data, c_str, c_str_len + 1);
  13. assert_true(dstr.len == c_str_len);
  14. assert_true(dstr.capacity == c_str_len + 1);
  15. free(dstr.data);
  16. }
  17. void test_SCDString_free(void **state) {
  18. (void) state;
  19. SCDString dstr;
  20. assert_true(SCDString_alloc(&dstr, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  21. SCDString_free(&dstr);
  22. assert_null(dstr.data);
  23. assert_true(dstr.len == 0);
  24. assert_true(dstr.capacity == 0);
  25. }
  26. void test_SCDString_copy(void **state) {
  27. (void) state;
  28. SCDString dstr1;
  29. assert_true(SCDString_alloc(&dstr1, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  30. assert_string_equal(SCDString_c_str(&dstr1), "Hello");
  31. SCDString dstr2;
  32. assert_true(SCDString_alloc(&dstr2, "foo", strlen("foo")) == SCUFCONT_SUCCESS);
  33. assert_string_equal(SCDString_c_str(&dstr2), "foo");
  34. assert_true(SCDString_copy(&dstr1, &dstr2) == SCUFCONT_SUCCESS);
  35. assert_string_equal(SCDString_c_str(&dstr2), "Hello");
  36. assert_uint_equal(dstr2.len, dstr1.len);
  37. assert_uint_equal(dstr2.capacity, dstr1.len + 1);
  38. SCDString_free(&dstr1);
  39. SCDString_free(&dstr2);
  40. }
  41. void test_SCDString_equal(void **state) {
  42. (void) state;
  43. SCDString s1;
  44. assert_true(SCDString_alloc(&s1, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  45. SCDString s2;
  46. assert_true(SCDString_alloc(&s2, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  47. assert_true(SCDString_equal(&s1, &s2));
  48. SCDString_free(&s1);
  49. SCDString_free(&s2);
  50. assert_true(SCDString_alloc(&s1, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  51. assert_true(SCDString_alloc(&s2, "Hell0", strlen("Hell0")) == SCUFCONT_SUCCESS);
  52. assert_false(SCDString_equal(&s1, &s2));
  53. SCDString_free(&s1);
  54. SCDString_free(&s2);
  55. assert_true(SCDString_alloc(&s1, "Hello World", strlen("Hello World")) == SCUFCONT_SUCCESS);
  56. assert_true(SCDString_alloc(&s2, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  57. assert_false(SCDString_equal(&s1, &s2));
  58. SCDString_free(&s1);
  59. SCDString_free(&s2);
  60. }
  61. void test_SCDString_equal_c_str(void **state) {
  62. (void) state;
  63. SCDString s1;
  64. assert_true(SCDString_alloc(&s1, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  65. char *s2 = "Hello";
  66. assert_true(SCDString_equal_c_str(&s1, s2));
  67. SCDString_free(&s1);
  68. assert_true(SCDString_alloc(&s1, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  69. s2 = "Hell0";
  70. assert_false(SCDString_equal_c_str(&s1, s2));
  71. SCDString_free(&s1);
  72. assert_true(SCDString_alloc(&s1, "Hello World", strlen("Hello World")) == SCUFCONT_SUCCESS);
  73. s2 = "Hello";
  74. assert_false(SCDString_equal_c_str(&s1, s2));
  75. SCDString_free(&s1);
  76. }
  77. void test_SCDString_equal_next_chars_c_str(void **state) {
  78. (void) state;
  79. SCDString dstr;
  80. assert_true(SCDString_alloc(&dstr, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
  81. char *str = "ll";
  82. size_t str_len = strlen(str);
  83. assert_true(SCDString_equal_next_chars_c_str(&dstr, str, str_len, 2));
  84. assert_false(SCDString_equal_next_chars_c_str(&dstr, str, str_len, 1));
  85. SCDString_free(&dstr);
  86. }
  87. void test_SCDString_concat_char(void **state) {
  88. (void) state;
  89. SCDString dstr;
  90. assert_true(SCDString_alloc(&dstr, "World", strlen("World")) == SCUFCONT_SUCCESS);
  91. assert_string_equal(dstr.data, "World");
  92. SCDString_concat_char(&dstr, 'l');
  93. assert_string_equal(dstr.data, "Worldl");
  94. SCDString_concat_char(&dstr, 'y');
  95. assert_string_equal(dstr.data, "Worldly");
  96. SCDString_free(&dstr);
  97. }
  98. void test_SCDString_concat_c_str(void **state) {
  99. (void) state;
  100. const char *dstr_c_str = "Hello";
  101. const char *c_str = " World";
  102. const size_t combined_length = strlen(dstr_c_str) + strlen(c_str);
  103. SCDString dstr;
  104. assert_true(SCDString_alloc(&dstr, dstr_c_str, strlen("Hello")) == SCUFCONT_SUCCESS);
  105. SCDString_concat_c_str(&dstr, c_str, strlen(c_str));
  106. assert_memory_equal(dstr.data, (void *) "Hello World\0", strlen("Hello World") + 1);
  107. assert_true(dstr.len == combined_length);
  108. assert_true(dstr.capacity == combined_length + 1);
  109. SCDString_free(&dstr);
  110. }
  111. void test_SCDString_c_str(void **state) {
  112. (void) state;
  113. const char *c_str = "Hello";
  114. SCDString dstr;
  115. assert_true(SCDString_alloc(&dstr, c_str, strlen(c_str)) == SCUFCONT_SUCCESS);
  116. assert_string_equal(c_str, SCDString_c_str(&dstr));
  117. SCDString_concat_c_str(&dstr, " World", strlen(" World"));
  118. assert_string_equal("Hello World", SCDString_c_str(&dstr));
  119. }
  120. void test_SCDString_split(void **state) {
  121. (void) state;
  122. SCDString dstr;
  123. assert_true(SCDString_alloc(&dstr, "Hello World", strlen("Hello World")) == SCUFCONT_SUCCESS);
  124. size_t arr_len = 0;
  125. SCDString *arr = NULL;
  126. ScufContResult res = SCDString_split(&dstr, " ", &arr, &arr_len);
  127. assert_true(res == SCUFCONT_SUCCESS);
  128. assert_true(arr_len == 2);
  129. assert_string_equal(SCDString_c_str(arr), "Hello");
  130. assert_string_equal(SCDString_c_str(arr + 1), "World");
  131. SCDString_free(&dstr);
  132. SCDString_split_arr_free(&arr, arr_len);
  133. assert_true(arr == NULL);
  134. assert_true(SCDString_alloc(&dstr, " Hello World", strlen(" Hello World")) == SCUFCONT_SUCCESS);
  135. arr_len = 0;
  136. res = SCDString_split(&dstr, " ", &arr, &arr_len);
  137. assert_true(arr_len == 3);
  138. assert_string_equal(SCDString_c_str(arr), "");
  139. assert_string_equal(SCDString_c_str(arr + 1), "Hello");
  140. assert_string_equal(SCDString_c_str(arr + 2), "World");
  141. SCDString_free(&dstr);
  142. SCDString_split_arr_free(&arr, arr_len);
  143. assert_true(arr == NULL);
  144. }
  145. void test_SCDString_char_mod(void **state) {
  146. (void) state;
  147. SCDString dstr;
  148. assert_true(SCDString_alloc(&dstr, "foo", strlen("foo")) == SCUFCONT_SUCCESS);
  149. assert_string_equal(SCDString_c_str(&dstr), "foo");
  150. assert_true(SCDString_char_mod(&dstr, 0, 'h') == SCUFCONT_SUCCESS);
  151. assert_string_equal(SCDString_c_str(&dstr), "hoo");
  152. assert_true(SCDString_char_mod(&dstr, 1, 'a') == SCUFCONT_SUCCESS);
  153. assert_string_equal(SCDString_c_str(&dstr), "hao");
  154. assert_true(SCDString_char_mod(&dstr, 2, 'b') == SCUFCONT_SUCCESS);
  155. assert_string_equal(SCDString_c_str(&dstr), "hab");
  156. assert_true(SCDString_char_mod(&dstr, 3, 'b') == SCUFCONT_OUT_OF_BOUNDS);
  157. assert_string_equal(SCDString_c_str(&dstr), "hab");
  158. SCDString_free(&dstr);
  159. }
  160. void test_SCDString_char_remove(void **state) {
  161. (void) state;
  162. char *text = "World";
  163. SCDString dstr;
  164. assert_true(SCDString_alloc(&dstr, text, strlen(text)) == SCUFCONT_SUCCESS);
  165. assert_string_equal(SCDString_c_str(&dstr), text);
  166. assert_uint_equal(dstr.len, strlen(text));
  167. text = "Worl";
  168. assert_true(SCDString_char_remove(&dstr, dstr.len - 1) == SCUFCONT_SUCCESS);
  169. assert_string_equal(SCDString_c_str(&dstr), text);
  170. assert_uint_equal(dstr.len, strlen(text));
  171. text = "Wol";
  172. assert_true(SCDString_char_remove(&dstr, 2) == SCUFCONT_SUCCESS);
  173. assert_string_equal(SCDString_c_str(&dstr), text);
  174. assert_uint_equal(dstr.len, strlen(text));
  175. text = "ol";
  176. assert_true(SCDString_char_remove(&dstr, 0) == SCUFCONT_SUCCESS);
  177. assert_string_equal(SCDString_c_str(&dstr), text);
  178. assert_uint_equal(dstr.len, strlen(text));
  179. assert_true(SCDString_char_remove(&dstr, dstr.len) == SCUFCONT_OUT_OF_BOUNDS);
  180. assert_string_equal(SCDString_c_str(&dstr), text);
  181. assert_uint_equal(dstr.len, strlen(text));
  182. SCDString_free(&dstr);
  183. }
  184. int DString_tests_run(void) {
  185. const struct CMUnitTest tests[] = {
  186. cmocka_unit_test(test_SCDString_alloc),
  187. cmocka_unit_test(test_SCDString_free),
  188. cmocka_unit_test(test_SCDString_copy),
  189. cmocka_unit_test(test_SCDString_equal),
  190. cmocka_unit_test(test_SCDString_equal_c_str),
  191. cmocka_unit_test(test_SCDString_equal_next_chars_c_str),
  192. cmocka_unit_test(test_SCDString_concat_char),
  193. cmocka_unit_test(test_SCDString_concat_c_str),
  194. cmocka_unit_test(test_SCDString_c_str),
  195. cmocka_unit_test(test_SCDString_split),
  196. cmocka_unit_test(test_SCDString_char_mod),
  197. cmocka_unit_test(test_SCDString_char_remove),
  198. };
  199. return cmocka_run_group_tests_name("DString", tests, NULL, NULL);
  200. }