Newer
Older
libkc / modules / test / src / test_map.c
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #include <kc.h>
  5. #include <kc_ut.h>
  6. #include <kc_assert.h>
  7. #include <kc_map.h>
  8. #include <kc_memory.h>
  9.  
  10. #include "ut.h"
  11.  
  12. // プロトタイプ宣言
  13. static void test_map_new(void);
  14. static void test_map_put(void);
  15. static void test_map_remove(void);
  16. static void test_map_entries(void);
  17. static void test_map_malloc_error(void);
  18.  
  19. /**
  20. * KcMap 単体テストスイート
  21. */
  22. void suite_map(void)
  23. {
  24. KcUt *ut = KcUt_get_instance();
  25. ut->add(ut, UT_TESTCASE, "map new/delete", test_map_new);
  26. ut->add(ut, UT_TESTCASE, "map put/get", test_map_put);
  27. ut->add(ut, UT_TESTCASE, "map remove", test_map_remove);
  28. ut->add(ut, UT_TESTCASE, "map entries", test_map_entries);
  29. ut->add(ut, UT_TESTCASE, "map malloc error", test_map_malloc_error);
  30. }
  31.  
  32. /**
  33. * Map 生成/破棄。
  34. *
  35. * @process KcMap_new を実行する。。
  36. * @result KcMap が生成されること。
  37. *
  38. * @process KcMap_delete にて Map を破棄する。
  39. * @result Map が破棄されること。
  40. */
  41. static void test_map_new(void)
  42. {
  43. KcMap *map = KcMap_new(0);
  44. assert_not_null(map);
  45. KcMap_delete(map);
  46.  
  47. map = KcMap_new(65538);
  48. assert_not_null(map);
  49. KcMap_delete(map);
  50.  
  51. // map にデータが残った状態での削除
  52. map = KcMap_new(10);
  53. assert_not_null(map);
  54. map->put(map, "key1", "value1", 7);
  55. KcMap_delete(map);
  56. }
  57.  
  58. /**
  59. * Map への追加/取得。
  60. */
  61. static void test_map_put(void)
  62. {
  63. KcMap *map = KcMap_new(5);
  64. assert_not_null(map);
  65.  
  66. const char *keys[] = {
  67. "key1", "key2", "key3", "key4", "key5",
  68. "key6", "key7", "key8", "key9", "key10",
  69. "key11", "key12", "key13", "key14", "key15"};
  70. const char *vals[] = {
  71. "val1", "val2", "val3", "val4", "val5",
  72. "val6", "val7", "val8", "val9", "val10",
  73. "val11", "val12", "val13", "val14", "val15"};
  74.  
  75. char *res;
  76. for (int i = 0; i < (int)(sizeof(keys) / sizeof(const char *)); i++)
  77. {
  78. res = (char *)map->put(map, keys[i], vals[i], strlen(vals[i]) + 1);
  79. assert_equals(vals[i], (const char *)res);
  80. }
  81.  
  82. // 値取得
  83. for (int i = 0; i < (int)(sizeof(keys) / sizeof(const char *)); i++)
  84. {
  85. size_t size;
  86. const char *value = (const char *)map->get(map, keys[i], &size);
  87. assert_equals(vals[i], value);
  88. }
  89.  
  90. // 存在しないキーの値取得
  91. void *ptr = map->get(map, "ABC", NULL);
  92. assert_null(ptr);
  93.  
  94. // キー上書き登録
  95. res = (char *)map->put(map, "key10", "abcdefg", strlen("abcdefg") + 1);
  96. assert_equals("abcdefg", (const char *)res);
  97. res = (char *)map->get(map, "key10", NULL);
  98. assert_equals("abcdefg", (const char *)res);
  99.  
  100. KcMap_delete(map);
  101. }
  102.  
  103. /**
  104. * Map からの削除/サイズ確認。
  105. */
  106. static void test_map_remove(void)
  107. {
  108. KcMap *map = KcMap_new(3);
  109. assert_not_null(map);
  110.  
  111. const char *keys[] = {
  112. "key1", "key2", "key3", "key4", "key5",
  113. "key6", "key7", "key8", "key9", "key10",
  114. "key11", "key12", "key13", "key14", "key15"};
  115. const char *vals[] = {
  116. "val1", "val2", "val3", "val4", "val5",
  117. "val6", "val7", "val8", "val9", "val10",
  118. "val11", "val12", "val13", "val14", "val15"};
  119.  
  120. char *res;
  121. for (int i = 0; i < (int)(sizeof(keys) / sizeof(const char *)); i++)
  122. {
  123. res = (char *)map->put(map, keys[i], vals[i], strlen(vals[i]) + 1);
  124. assert_equals(vals[i], (const char *)res);
  125. }
  126.  
  127. int size_counter = 14;
  128. map->remove(map, "key15");
  129. size_t size = map->size(map);
  130. assert_equals(size_counter, size);
  131. size_counter--;
  132. res = (char *)map->get(map, "key15", NULL);
  133. assert_null(res);
  134.  
  135. map->remove(map, "key7");
  136. size = map->size(map);
  137. assert_equals(size_counter, size);
  138. size_counter--;
  139. res = (char *)map->get(map, "key7", NULL);
  140. assert_null(res);
  141.  
  142. map->remove(map, "key13");
  143. size = map->size(map);
  144. assert_equals(size_counter, size);
  145. size_counter--;
  146. res = (char *)map->get(map, "key13", NULL);
  147. assert_null(res);
  148.  
  149. map->remove(map, "key1");
  150. size = map->size(map);
  151. assert_equals(size_counter, size);
  152. size_counter--;
  153. res = (char *)map->get(map, "key1", NULL);
  154. assert_null(res);
  155.  
  156. map->remove(map, "key2");
  157. size = map->size(map);
  158. assert_equals(size_counter, size);
  159. size_counter--;
  160. res = (char *)map->get(map, "key2", NULL);
  161. assert_null(res);
  162.  
  163. map->remove(map, "key3");
  164. size = map->size(map);
  165. assert_equals(size_counter, size);
  166. size_counter--;
  167. res = (char *)map->get(map, "key3", NULL);
  168. assert_null(res);
  169.  
  170. // 存在しないキー削除
  171. map->remove(map, "abc");
  172. size = map->size(map);
  173. assert_equals(9, size);
  174.  
  175. KcMap_delete(map);
  176.  
  177. // パターン2
  178. map = KcMap_new(3);
  179. assert_not_null(map);
  180.  
  181. size_counter = 3;
  182. for (int i = 0; i < size_counter; i++)
  183. {
  184. res = (char *)map->put(map, keys[i], vals[i], strlen(vals[i]) + 1);
  185. assert_equals(vals[i], (const char *)res);
  186. }
  187. size_counter--;
  188.  
  189. map->remove(map, "key1");
  190. size = map->size(map);
  191. assert_equals(size_counter, size);
  192. size_counter--;
  193. res = (char *)map->get(map, "key1", NULL);
  194. assert_null(res);
  195.  
  196. map->remove(map, "key2");
  197. size = map->size(map);
  198. assert_equals(size_counter, size);
  199. size_counter--;
  200. res = (char *)map->get(map, "key2", NULL);
  201. assert_null(res);
  202.  
  203. map->remove(map, "key3");
  204. size = map->size(map);
  205. assert_equals(size_counter, size);
  206. size_counter--;
  207. res = (char *)map->get(map, "key3", NULL);
  208. assert_null(res);
  209.  
  210. KcMap_delete(map);
  211. }
  212.  
  213. // エントリ
  214. typedef struct UserData_
  215. {
  216. int value;
  217. } UserData;
  218. static bool test_map_entries_handler(const char *key, const void *val, size_t size, void *args)
  219. {
  220. UserData *user_data = (UserData *)args;
  221. user_data->value--;
  222. printf("key=%-5s, value=%-5s, size=%zu\n", key, (const char *)val, size);
  223. return (user_data->value >= 0);
  224. }
  225.  
  226. /**
  227. * Map エントリ取得
  228. */
  229. static void test_map_entries(void)
  230. {
  231. KcMap *map = KcMap_new(5);
  232. assert_not_null(map);
  233.  
  234. const char *keys[] = {
  235. "key1", "key2", "key3", "key4", "key5",
  236. "key6", "key7", "key8", "key9", "key10",
  237. "key11", "key12", "key13", "key14", "key15"};
  238. const char *vals[] = {
  239. "val1", "val2", "val3", "val4", "val5",
  240. "val6", "val7", "val8", "val9", "val10",
  241. "val11", "val12", "val13", "val14", "val15"};
  242.  
  243. char *res;
  244. for (int i = 0; i < (int)(sizeof(keys) / sizeof(const char *)); i++)
  245. {
  246. res = (char *)map->put(map, keys[i], vals[i], strlen(vals[i]) + 1);
  247. assert_equals(vals[i], (const char *)res);
  248. }
  249.  
  250. // entries
  251. UserData args = {
  252. .value = 10000};
  253. map->entries(map, test_map_entries_handler, &args);
  254.  
  255. // entries [途中中断]
  256. UserData args2 = {
  257. .value = 5};
  258. map->entries(map, test_map_entries_handler, &args2);
  259.  
  260. KcMap_delete(map);
  261. }
  262.  
  263. /**
  264. * メモリ確保失敗
  265. */
  266. static void test_map_malloc_error(void)
  267. {
  268. // 生成時失敗
  269. ut_alloc_control(0)
  270. {
  271. KcMap *map = KcMap_new(5);
  272. assert_null(map);
  273. }
  274.  
  275. // put 時失敗
  276. KcMap *map = KcMap_new(5);
  277. const char *keys[] = {
  278. "key1", "key2", "key3", "key4", "key5",
  279. "key6", "key7", "key8", "key9", "key10",
  280. "key11", "key12", "key13", "key14", "key15"};
  281. const char *vals[] = {
  282. "val1", "val2", "val3", "val4", "val5",
  283. "val6", "val7", "val8", "val9", "val10",
  284. "val11", "val12", "val13", "val14", "val15"};
  285. char *res;
  286. for (int i = 0; i < (int)(sizeof(keys) / sizeof(const char *)); i++)
  287. {
  288. res = (char *)map->put(map, keys[i], vals[i], strlen(vals[i]) + 1);
  289. assert_equals(vals[i], (const char *)res);
  290. }
  291.  
  292. ut_alloc_control(0)
  293. {
  294. res = (char *)map->put(map, "abc", "def", 4);
  295. assert_null(res);
  296. }
  297. KcMap_delete(map);
  298. }