LinkedListTests.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "../Tests.h"
  2. #include "core/LinkedList.h"
  3. #include "core/ToString.h"
  4. #include "core/Utility.h"
  5. static void testAdd() {
  6. CoreLinkedList list = CORE_LINKED_LIST;
  7. coreLinkedListAdd(&list, size_t, 5);
  8. CoreLinkedListNode* current = list.first;
  9. if(CORE_TEST_NOT_NULL(current)) {
  10. CORE_TEST_SIZE(5, coreLinkedListGet(current, size_t));
  11. }
  12. CORE_TEST_SIZE(1, list.length);
  13. coreDestroyLinkedList(&list);
  14. }
  15. static void testMultipleAdd() {
  16. CoreLinkedList list = CORE_LINKED_LIST;
  17. coreLinkedListAdd(&list, size_t, 4);
  18. coreLinkedListAdd(&list, size_t, 3);
  19. coreLinkedListAdd(&list, size_t, 2);
  20. CoreLinkedListNode* current = list.first;
  21. CORE_TEST_SIZE(4, coreLinkedListGet(current, size_t));
  22. current = current->next;
  23. CORE_TEST_SIZE(3, coreLinkedListGet(current, size_t));
  24. current = current->next;
  25. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  26. CORE_TEST_SIZE(3, list.length);
  27. coreDestroyLinkedList(&list);
  28. }
  29. static void testClear() {
  30. CoreLinkedList list = CORE_LINKED_LIST;
  31. coreLinkedListAdd(&list, size_t, 5);
  32. coreLinkedListAdd(&list, size_t, 4);
  33. coreClearLinkedList(&list);
  34. CORE_TEST_SIZE(0, list.length);
  35. CORE_TEST_NULL(list.first);
  36. CORE_TEST_NULL(list.last);
  37. coreDestroyLinkedList(&list);
  38. }
  39. static void testBigAdd(bool light) {
  40. size_t limit = light ? 10000 : 100000;
  41. CoreLinkedList list = CORE_LINKED_LIST;
  42. for(size_t i = 0; i < limit; i++) {
  43. coreLinkedListAdd(&list, size_t, i);
  44. }
  45. CoreLinkedListNode* current = list.first;
  46. for(size_t i = 0; i < list.length; i++) {
  47. CORE_TEST_SIZE(i, coreLinkedListGet(current, size_t));
  48. current = current->next;
  49. }
  50. CORE_TEST_SIZE(limit, list.length);
  51. coreDestroyLinkedList(&list);
  52. }
  53. static void testToString1() {
  54. CoreLinkedList list = CORE_LINKED_LIST;
  55. coreLinkedListAdd(&list, size_t, 1);
  56. coreLinkedListAdd(&list, size_t, 243);
  57. coreLinkedListAdd(&list, size_t, 423);
  58. char buffer[128];
  59. size_t n =
  60. coreToStringLinkedList(&list, buffer, sizeof(buffer), coreToStringSize);
  61. CORE_TEST_SIZE(13, n);
  62. CORE_TEST_STRING("[1, 243, 423]", buffer);
  63. coreDestroyLinkedList(&list);
  64. }
  65. static void testToString2() {
  66. CoreLinkedList list = CORE_LINKED_LIST;
  67. coreLinkedListAdd(&list, size_t, 1);
  68. char buffer[128];
  69. size_t n =
  70. coreToStringLinkedList(&list, buffer, sizeof(buffer), coreToStringSize);
  71. CORE_TEST_SIZE(3, n);
  72. CORE_TEST_STRING("[1]", buffer);
  73. coreDestroyLinkedList(&list);
  74. }
  75. static void testToString3() {
  76. CoreLinkedList list = CORE_LINKED_LIST;
  77. char buffer[128];
  78. size_t n =
  79. coreToStringLinkedList(&list, buffer, sizeof(buffer), coreToStringSize);
  80. CORE_TEST_SIZE(2, n);
  81. CORE_TEST_STRING("[]", buffer);
  82. coreDestroyLinkedList(&list);
  83. }
  84. static void testRemove() {
  85. CoreLinkedList list = CORE_LINKED_LIST;
  86. CoreLinkedListNode* a = coreLinkedListAdd(&list, size_t, 4u);
  87. CoreLinkedListNode* b = coreLinkedListAdd(&list, size_t, 3u);
  88. CoreLinkedListNode* c = coreLinkedListAdd(&list, size_t, 2u);
  89. CoreLinkedListNode* d = coreLinkedListAdd(&list, size_t, 1u);
  90. CORE_TEST_NOT_NULL(a);
  91. CORE_TEST_NOT_NULL(b);
  92. CORE_TEST_NOT_NULL(c);
  93. CORE_TEST_NOT_NULL(d);
  94. coreLinkedListRemove(&list, b);
  95. CoreLinkedListNode* current = list.first;
  96. CORE_TEST_SIZE(4, coreLinkedListGet(current, size_t));
  97. current = current->next;
  98. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  99. current = current->next;
  100. CORE_TEST_SIZE(1, coreLinkedListGet(current, size_t));
  101. CORE_TEST_SIZE(3, list.length);
  102. coreLinkedListRemove(&list, a);
  103. current = list.first;
  104. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  105. current = current->next;
  106. CORE_TEST_SIZE(1, coreLinkedListGet(current, size_t));
  107. CORE_TEST_SIZE(2, list.length);
  108. coreLinkedListRemove(&list, d);
  109. current = list.first;
  110. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  111. CORE_TEST_SIZE(1, list.length);
  112. coreLinkedListRemove(&list, c);
  113. CORE_TEST_NULL(list.first);
  114. CORE_TEST_NULL(list.last);
  115. CORE_TEST_SIZE(0, list.length);
  116. coreDestroyLinkedList(&list);
  117. }
  118. static void testRemoveFirst() {
  119. CoreLinkedList list = CORE_LINKED_LIST;
  120. coreLinkedListAdd(&list, size_t, 4u);
  121. coreLinkedListAdd(&list, size_t, 3u);
  122. coreLinkedListAdd(&list, size_t, 2u);
  123. coreLinkedListAdd(&list, size_t, 1u);
  124. coreLinkedListRemoveFirst(&list);
  125. CoreLinkedListNode* current = list.first;
  126. if(CORE_TEST_NOT_NULL(current)) {
  127. CORE_TEST_SIZE(3, coreLinkedListGet(current, size_t));
  128. current = current->next;
  129. }
  130. if(CORE_TEST_NOT_NULL(current)) {
  131. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  132. current = current->next;
  133. }
  134. if(CORE_TEST_NOT_NULL(current)) {
  135. CORE_TEST_SIZE(1, coreLinkedListGet(current, size_t));
  136. }
  137. CORE_TEST_SIZE(3, list.length);
  138. coreLinkedListRemoveFirst(&list);
  139. current = list.first;
  140. if(CORE_TEST_NOT_NULL(current)) {
  141. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  142. current = current->next;
  143. }
  144. if(CORE_TEST_NOT_NULL(current)) {
  145. CORE_TEST_SIZE(1, coreLinkedListGet(current, size_t));
  146. }
  147. CORE_TEST_SIZE(2, list.length);
  148. coreLinkedListRemoveFirst(&list);
  149. current = list.first;
  150. if(CORE_TEST_NOT_NULL(current)) {
  151. CORE_TEST_SIZE(1, coreLinkedListGet(current, size_t));
  152. }
  153. CORE_TEST_SIZE(1, list.length);
  154. coreLinkedListRemoveFirst(&list);
  155. CORE_TEST_NULL(list.first);
  156. CORE_TEST_NULL(list.last);
  157. CORE_TEST_SIZE(0, list.length);
  158. coreDestroyLinkedList(&list);
  159. }
  160. static void testRemoveLast() {
  161. CoreLinkedList list = CORE_LINKED_LIST;
  162. coreLinkedListAdd(&list, size_t, 4u);
  163. coreLinkedListAdd(&list, size_t, 3u);
  164. coreLinkedListAdd(&list, size_t, 2u);
  165. coreLinkedListAdd(&list, size_t, 1u);
  166. coreLinkedListRemoveLast(&list);
  167. CoreLinkedListNode* current = list.first;
  168. if(CORE_TEST_NOT_NULL(current)) {
  169. CORE_TEST_SIZE(4, coreLinkedListGet(current, size_t));
  170. current = current->next;
  171. }
  172. if(CORE_TEST_NOT_NULL(current)) {
  173. CORE_TEST_SIZE(3, coreLinkedListGet(current, size_t));
  174. current = current->next;
  175. }
  176. if(CORE_TEST_NOT_NULL(current)) {
  177. CORE_TEST_SIZE(2, coreLinkedListGet(current, size_t));
  178. }
  179. CORE_TEST_SIZE(3, list.length);
  180. coreLinkedListRemoveLast(&list);
  181. current = list.first;
  182. if(CORE_TEST_NOT_NULL(current)) {
  183. CORE_TEST_SIZE(4, coreLinkedListGet(current, size_t));
  184. current = current->next;
  185. }
  186. if(CORE_TEST_NOT_NULL(current)) {
  187. CORE_TEST_SIZE(3, coreLinkedListGet(current, size_t));
  188. }
  189. CORE_TEST_SIZE(2, list.length);
  190. coreLinkedListRemoveLast(&list);
  191. current = list.first;
  192. if(CORE_TEST_NOT_NULL(current)) {
  193. CORE_TEST_SIZE(4, coreLinkedListGet(current, size_t));
  194. }
  195. CORE_TEST_SIZE(1, list.length);
  196. coreLinkedListRemoveLast(&list);
  197. CORE_TEST_NULL(list.first);
  198. CORE_TEST_NULL(list.last);
  199. CORE_TEST_SIZE(0, list.length);
  200. coreDestroyLinkedList(&list);
  201. }
  202. static void testSwap() {
  203. CoreLinkedList list = CORE_LINKED_LIST;
  204. coreLinkedListAdd(&list, size_t, 5);
  205. CoreLinkedList swap = CORE_LINKED_LIST;
  206. coreSwapLinkedList(&list, &swap);
  207. CoreLinkedListNode* current = swap.first;
  208. if(CORE_TEST_NOT_NULL(current)) {
  209. CORE_TEST_SIZE(5, coreLinkedListGet(current, size_t));
  210. }
  211. CORE_TEST_SIZE(0, list.length);
  212. CORE_TEST_SIZE(1, swap.length);
  213. coreDestroyLinkedList(&swap);
  214. coreDestroyLinkedList(&list);
  215. }
  216. void testLinkedList(bool light) {
  217. testAdd();
  218. testMultipleAdd();
  219. testClear();
  220. testBigAdd(light);
  221. testToString1();
  222. testToString2();
  223. testToString3();
  224. testRemove();
  225. testRemoveFirst();
  226. testRemoveLast();
  227. testSwap();
  228. }