doublylinkedlistTests.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /*******************************************************************************
  2. * Copyright (c) 2017, Rockwell Automation, Inc.
  3. * All rights reserved.
  4. *
  5. ******************************************************************************/
  6. #include <CppUTest/TestHarness.h>
  7. #include <stdint.h>
  8. #include <string.h>
  9. extern "C" {
  10. #include <doublylinkedlist.h>
  11. }
  12. TEST_GROUP(DoublyLinkedList){
  13. };
  14. const size_t kNodesAmount = 5;
  15. static DoublyLinkedListNode nodes[kNodesAmount] = { 0 };
  16. DoublyLinkedListNode* CallocAllocator() {
  17. return (DoublyLinkedListNode*)calloc(1, sizeof(DoublyLinkedListNode));
  18. }
  19. void CallocDeallocator(DoublyLinkedListNode** node) {
  20. free(*node);
  21. *node = NULL;
  22. }
  23. DoublyLinkedListNode* ArrayAllocator() {
  24. for (size_t i = 0; i < kNodesAmount; ++i) {
  25. if (nodes[i].previous == NULL && nodes[i].next == NULL &&
  26. nodes[i].data == NULL) {
  27. return &nodes[i];
  28. }
  29. }
  30. return NULL;
  31. }
  32. void ArrayFree(DoublyLinkedListNode** node) {
  33. if (*node != NULL) {
  34. memset(*node, 0, sizeof(DoublyLinkedListNode));
  35. *node = NULL;
  36. }
  37. }
  38. TEST(DoublyLinkedList, CallocAllocatorCreateTest) {
  39. int test_data = 8;
  40. DoublyLinkedListNode* node =
  41. DoublyLinkedListNodeCreate(&test_data, CallocAllocator);
  42. CHECK_EQUAL(test_data, *((int*)node->data));
  43. CallocDeallocator(&node);
  44. }
  45. TEST(DoublyLinkedList, CallocFreeTest) {
  46. int test_data = 8;
  47. DoublyLinkedListNode* node =
  48. DoublyLinkedListNodeCreate(&test_data, CallocAllocator);
  49. CallocDeallocator(&node);
  50. POINTERS_EQUAL(NULL, node);
  51. }
  52. TEST(DoublyLinkedList, ArrayAllocatorCreateTest) {
  53. int test_data = 8;
  54. DoublyLinkedListNode* node =
  55. DoublyLinkedListNodeCreate(&test_data, ArrayAllocator);
  56. CHECK_EQUAL(test_data, *((int*)node->data));
  57. ArrayFree(&node);
  58. }
  59. TEST(DoublyLinkedList, ArrayAllocatorDeleteTest) {
  60. int test_data = 8;
  61. DoublyLinkedListNode* node =
  62. DoublyLinkedListNodeCreate(&test_data, ArrayAllocator);
  63. DoublyLinkedListNode* assigned_array_slot = node;
  64. ArrayFree(&node);
  65. CHECK_EQUAL(8, test_data);
  66. POINTERS_EQUAL(NULL, assigned_array_slot->data);
  67. POINTERS_EQUAL(NULL, assigned_array_slot->previous);
  68. POINTERS_EQUAL(NULL, assigned_array_slot->next);
  69. POINTERS_EQUAL(NULL, node);
  70. }
  71. TEST(DoublyLinkedList, InitializeList) {
  72. DoublyLinkedList list;
  73. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  74. POINTERS_EQUAL(NULL, list.first);
  75. POINTERS_EQUAL(NULL, list.last);
  76. POINTERS_EQUAL(CallocAllocator, list.allocator);
  77. POINTERS_EQUAL(CallocDeallocator, list.deallocator);
  78. }
  79. TEST(DoublyLinkedList, CheckDestroyListCleansInteralVaribles) {
  80. DoublyLinkedList list;
  81. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  82. DoublyLinkedListDestroy(&list);
  83. POINTERS_EQUAL(NULL, list.first);
  84. POINTERS_EQUAL(NULL, list.last);
  85. POINTERS_EQUAL(NULL, list.allocator);
  86. POINTERS_EQUAL(NULL, list.deallocator);
  87. }
  88. TEST(DoublyLinkedList, InsertFirstAtHead) {
  89. int test_data = 42;
  90. DoublyLinkedList list;
  91. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  92. DoublyLinkedListInsertAtHead(&list, &test_data);
  93. CHECK_EQUAL(42, *(int*)(list.first->data));
  94. CHECK_EQUAL(42, *(int*)(list.last->data));
  95. DoublyLinkedListDestroy(&list);
  96. POINTERS_EQUAL(NULL, list.first);
  97. POINTERS_EQUAL(NULL, list.last);
  98. }
  99. TEST(DoublyLinkedList, InsertSecondAtHead) {
  100. int test_data = 42;
  101. int test_data_2 = 42 * 2;
  102. DoublyLinkedList list;
  103. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  104. DoublyLinkedListInsertAtHead(&list, &test_data);
  105. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  106. CHECK_EQUAL(84, *(int*)(list.first->data));
  107. CHECK_EQUAL(42, *(int*)(list.last->data));
  108. DoublyLinkedListDestroy(&list);
  109. POINTERS_EQUAL(NULL, list.first);
  110. POINTERS_EQUAL(NULL, list.last);
  111. }
  112. TEST(DoublyLinkedList, CheckDestroyListRemovesAllNodes) {
  113. int test_data = 42;
  114. int test_data_2 = 84;
  115. DoublyLinkedList list;
  116. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  117. DoublyLinkedListInsertAtHead(&list, &test_data);
  118. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  119. DoublyLinkedListDestroy(&list);
  120. POINTERS_EQUAL(NULL, list.first);
  121. POINTERS_EQUAL(NULL, list.last);
  122. }
  123. TEST(DoublyLinkedList, InsertFirstAtTail) {
  124. int test_data = 42;
  125. DoublyLinkedList list;
  126. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  127. DoublyLinkedListInsertAtTail(&list, &test_data);
  128. CHECK_EQUAL(42, *(int*)(list.first->data));
  129. CHECK_EQUAL(42, *(int*)(list.last->data));
  130. DoublyLinkedListDestroy(&list);
  131. POINTERS_EQUAL(NULL, list.first);
  132. POINTERS_EQUAL(NULL, list.last);
  133. }
  134. TEST(DoublyLinkedList, InsertSecondAtTail) {
  135. int test_data = 42;
  136. int test_data_2 = 84;
  137. DoublyLinkedList list;
  138. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  139. DoublyLinkedListInsertAtTail(&list, &test_data);
  140. DoublyLinkedListInsertAtTail(&list, &test_data_2);
  141. CHECK_EQUAL(42, *(int*)(list.first->data));
  142. CHECK_EQUAL(84, *(int*)(list.last->data));
  143. DoublyLinkedListDestroy(&list);
  144. POINTERS_EQUAL(NULL, list.first);
  145. POINTERS_EQUAL(NULL, list.last);
  146. }
  147. TEST(DoublyLinkedList, InsertAfterNode) {
  148. int test_data_1 = 2;
  149. int test_data_2 = 4;
  150. int test_data_3 = 8;
  151. DoublyLinkedList list;
  152. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  153. DoublyLinkedListInsertAtHead(&list, &test_data_1);
  154. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  155. DoublyLinkedListInsertAfterNode(&list, list.first, &test_data_3);
  156. CHECK_EQUAL(8, *((int*)list.first->next->data));
  157. DoublyLinkedListDestroy(&list);
  158. }
  159. TEST(DoublyLinkedList, InsertAfterLastNode) {
  160. int test_data_1 = 2;
  161. int test_data_2 = 4;
  162. int test_data_3 = 8;
  163. DoublyLinkedList list;
  164. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  165. DoublyLinkedListInsertAtHead(&list, &test_data_1);
  166. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  167. DoublyLinkedListInsertAfterNode(&list, list.last, &test_data_3);
  168. CHECK_EQUAL(8, *((int*)list.last->data));
  169. DoublyLinkedListDestroy(&list);
  170. }
  171. TEST(DoublyLinkedList, InsertBeforeNode) {
  172. int test_data_1 = 2;
  173. int test_data_2 = 4;
  174. int test_data_3 = 8;
  175. DoublyLinkedList list;
  176. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  177. DoublyLinkedListInsertAtHead(&list, &test_data_1);
  178. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  179. DoublyLinkedListInsertBeforeNode(&list, list.last, &test_data_3);
  180. CHECK_EQUAL(8, *((int*)list.last->previous->data));
  181. DoublyLinkedListDestroy(&list);
  182. }
  183. TEST(DoublyLinkedList, InsertBeforeFirstNode) {
  184. int test_data_1 = 2;
  185. int test_data_2 = 4;
  186. int test_data_3 = 8;
  187. DoublyLinkedList list;
  188. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  189. DoublyLinkedListInsertAtHead(&list, &test_data_1);
  190. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  191. DoublyLinkedListInsertBeforeNode(&list, list.first, &test_data_3);
  192. CHECK_EQUAL(8, *((int*)list.first->data));
  193. DoublyLinkedListDestroy(&list);
  194. }
  195. TEST(DoublyLinkedList, RemoveFirstElementInList) {
  196. int test_data_1 = 2;
  197. int test_data_2 = 4;
  198. int test_data_3 = 8;
  199. DoublyLinkedList list;
  200. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  201. DoublyLinkedListInsertAtTail(&list, &test_data_1);
  202. DoublyLinkedListInsertAtTail(&list, &test_data_2);
  203. DoublyLinkedListInsertAtTail(&list, &test_data_3);
  204. DoublyLinkedListNode* node_to_be_deleted = list.first;
  205. DoublyLinkedListRemoveNode(&list, &node_to_be_deleted);
  206. CHECK_EQUAL(2, test_data_1);
  207. CHECK_EQUAL(4, *((int*)list.first->data));
  208. DoublyLinkedListDestroy(&list);
  209. }
  210. TEST(DoublyLinkedList, RemoveFirstElementInOtherwiseEmptyList) {
  211. int test_data_1 = 2;
  212. DoublyLinkedList list;
  213. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  214. DoublyLinkedListInsertAtTail(&list, &test_data_1);
  215. DoublyLinkedListNode* node_to_be_deleted = list.first;
  216. DoublyLinkedListRemoveNode(&list, &node_to_be_deleted);
  217. CHECK_EQUAL(2, test_data_1);
  218. POINTERS_EQUAL(NULL, list.first);
  219. POINTERS_EQUAL(NULL, list.last);
  220. DoublyLinkedListDestroy(&list);
  221. }
  222. TEST(DoublyLinkedList, RemoveLastElementInOtherwiseEmptyList) {
  223. int test_data_1 = 2;
  224. DoublyLinkedList list;
  225. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  226. DoublyLinkedListInsertAtTail(&list, &test_data_1);
  227. DoublyLinkedListNode* node_to_be_deleted = list.last;
  228. DoublyLinkedListRemoveNode(&list, &node_to_be_deleted);
  229. CHECK_EQUAL(2, test_data_1);
  230. POINTERS_EQUAL(NULL, list.first);
  231. POINTERS_EQUAL(NULL, list.last);
  232. DoublyLinkedListDestroy(&list);
  233. }
  234. TEST(DoublyLinkedList, CheckDeleteAllNodesResultsInEmptyList) {
  235. int test_data = 42;
  236. int test_data_2 = 84;
  237. DoublyLinkedList list;
  238. DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
  239. DoublyLinkedListInsertAtHead(&list, &test_data);
  240. DoublyLinkedListInsertAtHead(&list, &test_data_2);
  241. DoublyLinkedListNode* node_to_delete = list.first;
  242. DoublyLinkedListRemoveNode(&list, &node_to_delete);
  243. POINTERS_EQUAL(NULL, node_to_delete);
  244. node_to_delete = list.first;
  245. DoublyLinkedListRemoveNode(&list, &node_to_delete);
  246. POINTERS_EQUAL(NULL, list.first);
  247. POINTERS_EQUAL(NULL, list.last);
  248. DoublyLinkedListDestroy(&list);
  249. }