| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /*******************************************************************************
- * Copyright (c) 2017, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
- #include <CppUTest/TestHarness.h>
- #include <stdint.h>
- #include <string.h>
- extern "C" {
- #include <doublylinkedlist.h>
- }
- TEST_GROUP(DoublyLinkedList){
- };
- const size_t kNodesAmount = 5;
- static DoublyLinkedListNode nodes[kNodesAmount] = { 0 };
- DoublyLinkedListNode* CallocAllocator() {
- return (DoublyLinkedListNode*)calloc(1, sizeof(DoublyLinkedListNode));
- }
- void CallocDeallocator(DoublyLinkedListNode** node) {
- free(*node);
- *node = NULL;
- }
- DoublyLinkedListNode* ArrayAllocator() {
- for (size_t i = 0; i < kNodesAmount; ++i) {
- if (nodes[i].previous == NULL && nodes[i].next == NULL &&
- nodes[i].data == NULL) {
- return &nodes[i];
- }
- }
- return NULL;
- }
- void ArrayFree(DoublyLinkedListNode** node) {
- if (*node != NULL) {
- memset(*node, 0, sizeof(DoublyLinkedListNode));
- *node = NULL;
- }
- }
- TEST(DoublyLinkedList, CallocAllocatorCreateTest) {
- int test_data = 8;
- DoublyLinkedListNode* node =
- DoublyLinkedListNodeCreate(&test_data, CallocAllocator);
- CHECK_EQUAL(test_data, *((int*)node->data));
- CallocDeallocator(&node);
- }
- TEST(DoublyLinkedList, CallocFreeTest) {
- int test_data = 8;
- DoublyLinkedListNode* node =
- DoublyLinkedListNodeCreate(&test_data, CallocAllocator);
- CallocDeallocator(&node);
- POINTERS_EQUAL(NULL, node);
- }
- TEST(DoublyLinkedList, ArrayAllocatorCreateTest) {
- int test_data = 8;
- DoublyLinkedListNode* node =
- DoublyLinkedListNodeCreate(&test_data, ArrayAllocator);
- CHECK_EQUAL(test_data, *((int*)node->data));
- ArrayFree(&node);
- }
- TEST(DoublyLinkedList, ArrayAllocatorDeleteTest) {
- int test_data = 8;
- DoublyLinkedListNode* node =
- DoublyLinkedListNodeCreate(&test_data, ArrayAllocator);
- DoublyLinkedListNode* assigned_array_slot = node;
- ArrayFree(&node);
- CHECK_EQUAL(8, test_data);
- POINTERS_EQUAL(NULL, assigned_array_slot->data);
- POINTERS_EQUAL(NULL, assigned_array_slot->previous);
- POINTERS_EQUAL(NULL, assigned_array_slot->next);
- POINTERS_EQUAL(NULL, node);
- }
- TEST(DoublyLinkedList, InitializeList) {
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- POINTERS_EQUAL(CallocAllocator, list.allocator);
- POINTERS_EQUAL(CallocDeallocator, list.deallocator);
- }
- TEST(DoublyLinkedList, CheckDestroyListCleansInteralVaribles) {
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListDestroy(&list);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- POINTERS_EQUAL(NULL, list.allocator);
- POINTERS_EQUAL(NULL, list.deallocator);
- }
- TEST(DoublyLinkedList, InsertFirstAtHead) {
- int test_data = 42;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data);
- CHECK_EQUAL(42, *(int*)(list.first->data));
- CHECK_EQUAL(42, *(int*)(list.last->data));
- DoublyLinkedListDestroy(&list);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- }
- TEST(DoublyLinkedList, InsertSecondAtHead) {
- int test_data = 42;
- int test_data_2 = 42 * 2;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- CHECK_EQUAL(84, *(int*)(list.first->data));
- CHECK_EQUAL(42, *(int*)(list.last->data));
- DoublyLinkedListDestroy(&list);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- }
- TEST(DoublyLinkedList, CheckDestroyListRemovesAllNodes) {
- int test_data = 42;
- int test_data_2 = 84;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- DoublyLinkedListDestroy(&list);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- }
- TEST(DoublyLinkedList, InsertFirstAtTail) {
- int test_data = 42;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtTail(&list, &test_data);
- CHECK_EQUAL(42, *(int*)(list.first->data));
- CHECK_EQUAL(42, *(int*)(list.last->data));
- DoublyLinkedListDestroy(&list);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- }
- TEST(DoublyLinkedList, InsertSecondAtTail) {
- int test_data = 42;
- int test_data_2 = 84;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtTail(&list, &test_data);
- DoublyLinkedListInsertAtTail(&list, &test_data_2);
- CHECK_EQUAL(42, *(int*)(list.first->data));
- CHECK_EQUAL(84, *(int*)(list.last->data));
- DoublyLinkedListDestroy(&list);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- }
- TEST(DoublyLinkedList, InsertAfterNode) {
- int test_data_1 = 2;
- int test_data_2 = 4;
- int test_data_3 = 8;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data_1);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- DoublyLinkedListInsertAfterNode(&list, list.first, &test_data_3);
- CHECK_EQUAL(8, *((int*)list.first->next->data));
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, InsertAfterLastNode) {
- int test_data_1 = 2;
- int test_data_2 = 4;
- int test_data_3 = 8;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data_1);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- DoublyLinkedListInsertAfterNode(&list, list.last, &test_data_3);
- CHECK_EQUAL(8, *((int*)list.last->data));
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, InsertBeforeNode) {
- int test_data_1 = 2;
- int test_data_2 = 4;
- int test_data_3 = 8;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data_1);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- DoublyLinkedListInsertBeforeNode(&list, list.last, &test_data_3);
- CHECK_EQUAL(8, *((int*)list.last->previous->data));
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, InsertBeforeFirstNode) {
- int test_data_1 = 2;
- int test_data_2 = 4;
- int test_data_3 = 8;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data_1);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- DoublyLinkedListInsertBeforeNode(&list, list.first, &test_data_3);
- CHECK_EQUAL(8, *((int*)list.first->data));
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, RemoveFirstElementInList) {
- int test_data_1 = 2;
- int test_data_2 = 4;
- int test_data_3 = 8;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtTail(&list, &test_data_1);
- DoublyLinkedListInsertAtTail(&list, &test_data_2);
- DoublyLinkedListInsertAtTail(&list, &test_data_3);
- DoublyLinkedListNode* node_to_be_deleted = list.first;
- DoublyLinkedListRemoveNode(&list, &node_to_be_deleted);
- CHECK_EQUAL(2, test_data_1);
- CHECK_EQUAL(4, *((int*)list.first->data));
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, RemoveFirstElementInOtherwiseEmptyList) {
- int test_data_1 = 2;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtTail(&list, &test_data_1);
- DoublyLinkedListNode* node_to_be_deleted = list.first;
- DoublyLinkedListRemoveNode(&list, &node_to_be_deleted);
- CHECK_EQUAL(2, test_data_1);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, RemoveLastElementInOtherwiseEmptyList) {
- int test_data_1 = 2;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtTail(&list, &test_data_1);
- DoublyLinkedListNode* node_to_be_deleted = list.last;
- DoublyLinkedListRemoveNode(&list, &node_to_be_deleted);
- CHECK_EQUAL(2, test_data_1);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- DoublyLinkedListDestroy(&list);
- }
- TEST(DoublyLinkedList, CheckDeleteAllNodesResultsInEmptyList) {
- int test_data = 42;
- int test_data_2 = 84;
- DoublyLinkedList list;
- DoublyLinkedListInitialize(&list, CallocAllocator, CallocDeallocator);
- DoublyLinkedListInsertAtHead(&list, &test_data);
- DoublyLinkedListInsertAtHead(&list, &test_data_2);
- DoublyLinkedListNode* node_to_delete = list.first;
- DoublyLinkedListRemoveNode(&list, &node_to_delete);
- POINTERS_EQUAL(NULL, node_to_delete);
- node_to_delete = list.first;
- DoublyLinkedListRemoveNode(&list, &node_to_delete);
- POINTERS_EQUAL(NULL, list.first);
- POINTERS_EQUAL(NULL, list.last);
- DoublyLinkedListDestroy(&list);
- }
|