/* * This file is part of the PCEPlib, a PCEP protocol library. * * Copyright (C) 2020 Volta Networks https://voltanet.io/ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author : Brady Johnson * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "pcep_utils_double_linked_list.h" #include "pcep_utils_double_linked_list_test.h" typedef struct dll_node_data_ { int int_data; } dll_node_data; void test_empty_dl_list() { double_linked_list *handle = dll_initialize(); CU_ASSERT_PTR_NULL(dll_delete_first_node(handle)); CU_ASSERT_PTR_NULL(dll_delete_last_node(handle)); CU_ASSERT_PTR_NULL(dll_delete_node(handle, NULL)); dll_destroy(handle); } void test_null_dl_list_handle() { dll_destroy(NULL); CU_ASSERT_PTR_NULL(dll_prepend(NULL, NULL)); CU_ASSERT_PTR_NULL(dll_append(NULL, NULL)); CU_ASSERT_PTR_NULL(dll_delete_first_node(NULL)); CU_ASSERT_PTR_NULL(dll_delete_last_node(NULL)); CU_ASSERT_PTR_NULL(dll_delete_node(NULL, NULL)); } void test_dll_prepend_data() { dll_node_data data1, data2, data3; data1.int_data = 1; data2.int_data = 2; data3.int_data = 3; double_linked_list *handle = dll_initialize(); CU_ASSERT_PTR_NOT_NULL(dll_prepend(handle, &data3)); CU_ASSERT_PTR_NOT_NULL(dll_prepend(handle, &data2)); CU_ASSERT_PTR_NOT_NULL(dll_prepend(handle, &data1)); CU_ASSERT_EQUAL(handle->num_entries, 3); double_linked_list_node *node = handle->head; CU_ASSERT_PTR_NOT_NULL(node); assert(node != NULL); CU_ASSERT_PTR_EQUAL(node->data, &data1); CU_ASSERT_PTR_NULL(node->prev_node); CU_ASSERT_PTR_NOT_NULL(node->next_node); node = node->next_node; CU_ASSERT_PTR_NOT_NULL(node); assert(node != NULL); CU_ASSERT_PTR_EQUAL(node->data, &data2); CU_ASSERT_PTR_NOT_NULL(node->prev_node); CU_ASSERT_PTR_NOT_NULL(node->next_node); node = node->next_node; CU_ASSERT_PTR_NOT_NULL(node); assert(node != NULL); CU_ASSERT_PTR_EQUAL(node->data, &data3); CU_ASSERT_PTR_NOT_NULL(node->prev_node); CU_ASSERT_PTR_NULL(node->next_node); CU_ASSERT_PTR_EQUAL(handle->tail, node); dll_destroy(handle); } void test_dll_append_data() { dll_node_data data1, data2, data3; data1.int_data = 1; data2.int_data = 2; data3.int_data = 3; double_linked_list *handle = dll_initialize(); CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data1)); CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data2)); CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data3)); CU_ASSERT_EQUAL(handle->num_entries, 3); double_linked_list_node *node = handle->head; CU_ASSERT_PTR_EQUAL(node->data, &data1); CU_ASSERT_PTR_NULL(node->prev_node); CU_ASSERT_PTR_NOT_NULL(node->next_node); node = node->next_node; CU_ASSERT_PTR_NOT_NULL(node); assert(node != NULL); CU_ASSERT_PTR_EQUAL(node->data, &data2); CU_ASSERT_PTR_NOT_NULL(node->prev_node); CU_ASSERT_PTR_NOT_NULL(node->next_node); node = node->next_node; CU_ASSERT_PTR_NOT_NULL(node); assert(node != NULL); CU_ASSERT_PTR_EQUAL(node->data, &data3); CU_ASSERT_PTR_NOT_NULL(node->prev_node); CU_ASSERT_PTR_NULL(node->next_node); CU_ASSERT_PTR_EQUAL(handle->tail, node); dll_destroy(handle); } void test_dll_delete_first_node() { dll_node_data data1, data2; data1.int_data = 1; data2.int_data = 2; double_linked_list *handle = dll_initialize(); /* Test deleting with just 1 node in the list */ CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data1)); CU_ASSERT_EQUAL(handle->num_entries, 1); void *deleted_data = dll_delete_first_node(handle); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data1, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 0); CU_ASSERT_PTR_NULL(handle->head); CU_ASSERT_PTR_NULL(handle->tail); /* Test deleting with 2 nodes in the list */ CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data1)); CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data2)); CU_ASSERT_EQUAL(handle->num_entries, 2); deleted_data = dll_delete_first_node(handle); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data1, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 1); CU_ASSERT_PTR_EQUAL(handle->head->data, &data2); CU_ASSERT_PTR_EQUAL(handle->head, handle->tail); CU_ASSERT_PTR_NULL(handle->head->prev_node); CU_ASSERT_PTR_NULL(handle->head->next_node); dll_destroy(handle); } void test_dll_delete_last_node() { dll_node_data data1, data2; data1.int_data = 1; data2.int_data = 2; double_linked_list *handle = dll_initialize(); /* Test deleting with just 1 node in the list */ CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data1)); CU_ASSERT_EQUAL(handle->num_entries, 1); void *deleted_data = dll_delete_last_node(handle); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data1, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 0); CU_ASSERT_PTR_NULL(handle->head); CU_ASSERT_PTR_NULL(handle->tail); /* Test deleting with 2 nodes in the list */ CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data1)); CU_ASSERT_PTR_NOT_NULL(dll_append(handle, &data2)); CU_ASSERT_EQUAL(handle->num_entries, 2); deleted_data = dll_delete_last_node(handle); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data2, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 1); CU_ASSERT_PTR_EQUAL(handle->head->data, &data1); CU_ASSERT_PTR_EQUAL(handle->head, handle->tail); CU_ASSERT_PTR_NULL(handle->head->prev_node); CU_ASSERT_PTR_NULL(handle->head->next_node); dll_destroy(handle); } void test_dll_delete_node() { dll_node_data data1, data2, data3; data1.int_data = 1; data2.int_data = 2; data3.int_data = 3; double_linked_list_node *node1, *node2, *node3; double_linked_list *handle; /* Test deleting with just 1 node in the list */ handle = dll_initialize(); node1 = dll_append(handle, &data1); CU_ASSERT_PTR_NOT_NULL(node1); CU_ASSERT_EQUAL(handle->num_entries, 1); void *deleted_data = dll_delete_node(handle, node1); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data1, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 0); CU_ASSERT_PTR_NULL(handle->head); CU_ASSERT_PTR_NULL(handle->tail); /* * Test deleting the head with 2 nodes in the list */ node1 = dll_append(handle, &data1); node2 = dll_append(handle, &data2); CU_ASSERT_PTR_NOT_NULL(node1); CU_ASSERT_PTR_NOT_NULL(node2); CU_ASSERT_EQUAL(handle->num_entries, 2); /* Delete the head entry */ deleted_data = dll_delete_node(handle, node1); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data1, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 1); CU_ASSERT_PTR_EQUAL(handle->head->data, &data2); CU_ASSERT_PTR_EQUAL(handle->head, handle->tail); CU_ASSERT_PTR_NULL(handle->head->prev_node); CU_ASSERT_PTR_NULL(handle->head->next_node); dll_destroy(handle); /* * Test deleting the tail with 2 nodes in the list */ handle = dll_initialize(); node1 = dll_append(handle, &data1); node2 = dll_append(handle, &data2); CU_ASSERT_PTR_NOT_NULL(node1); CU_ASSERT_PTR_NOT_NULL(node2); CU_ASSERT_EQUAL(handle->num_entries, 2); /* Delete the tail entry */ deleted_data = dll_delete_node(handle, node2); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data2, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 1); CU_ASSERT_PTR_EQUAL(handle->head->data, &data1); CU_ASSERT_PTR_EQUAL(handle->head, handle->tail); CU_ASSERT_PTR_NULL(handle->head->prev_node); CU_ASSERT_PTR_NULL(handle->head->next_node); dll_destroy(handle); /* * Test deleting in the middle with 3 nodes in the list */ handle = dll_initialize(); node1 = dll_append(handle, &data1); node2 = dll_append(handle, &data2); node3 = dll_append(handle, &data3); CU_ASSERT_PTR_NOT_NULL(node1); assert(node1 != NULL); CU_ASSERT_PTR_NOT_NULL(node2); assert(node2 != NULL); CU_ASSERT_PTR_NOT_NULL(node3); assert(node3 != NULL); CU_ASSERT_EQUAL(handle->num_entries, 3); /* Delete the middle entry */ deleted_data = dll_delete_node(handle, node2); CU_ASSERT_PTR_NOT_NULL(deleted_data); CU_ASSERT_PTR_EQUAL(&data2, deleted_data); CU_ASSERT_EQUAL(handle->num_entries, 2); CU_ASSERT_PTR_EQUAL(handle->head, node1); CU_ASSERT_PTR_EQUAL(handle->tail, node3); CU_ASSERT_PTR_EQUAL(node1->data, &data1); CU_ASSERT_PTR_EQUAL(node3->data, &data3); CU_ASSERT_PTR_EQUAL(node1->next_node, node3); CU_ASSERT_PTR_EQUAL(node3->prev_node, node1); CU_ASSERT_PTR_NULL(node1->prev_node); CU_ASSERT_PTR_NULL(node3->next_node); dll_destroy(handle); }