/** * @file test_list.c * @author rick * @date 09.07.21 * @brief Test for the List implementation */ #include "waitui/list.h" #include "../../bdd-for-c.h" typedef struct value { int count; int i; } value; static value *value_new(int i) { value *this = calloc(1, sizeof(*this)); if (!this) { return NULL; } this->i = i; return this; } static void value_destroy(value **this) { if (!this || !(*this)) { return; } free(*this); *this = NULL; } CREATE_LIST_TYPE(INTERFACE, value) CREATE_LIST_TYPE(IMPLEMENTATION, value) spec("list") { context("use as a stack") { static value_list *stack = NULL; before() { stack = value_list_new(); } after() { value_list_destroy(&stack); } it("should have a stack") { check(stack != NULL, "stack should not be NULL"); } it("should allow to push a value onto the stack") { value *value1 = value_new(1); check(value1 != NULL, "value1 should not be NULL"); check(value_list_push(stack, value1) == true, "value1 should be added to the stack"); } it("should allow to push a second value onto the stack") { value *value2 = value_new(2); check(value2 != NULL, "value2 should not be NULL"); check(value_list_push(stack, value2) == true, "value1 should be added to the stack"); } it("should return the last added element on pop") { value *test = value_list_pop(stack); check(test != NULL, "value_list_pop should not return NULL"); check(test->i == 2, "test should be 2"); value_destroy(&test); } it("should be able to peek the top element") { value *test = value_list_peek(stack); check(test != NULL, "value_list_peek should not return NULL"); check(test->i == 1, "test should be 1"); } it("should return the first added element on pop") { value *test = value_list_pop(stack); check(test != NULL, "value_list_pop should not return NULL"); check(test->i == 1, "test should be 1"); value_destroy(&test); } it("should return NULL if peek with an empty stack") { value *test = value_list_peek(stack); check(test == NULL, "value_list_peek should return NULL"); } } }