diff --git a/makefile b/makefile index 1f15f75..e0626fb 100644 --- a/makefile +++ b/makefile @@ -35,8 +35,11 @@ $(program_obj_filesobj_files): %.o: %.c # -------------------------- # Unit Tests # -------------------------- -unitTests: - echo "needs to be implemented" +TEST_STACK_SOURCES = stack.c test_stack.c $(unityfolder)/unity.c + +stackTests: $(TEST_STACK_SOURCES) stack.h + $(CC) $(FLAGS) -I$(unityfolder) $(TEST_STACK_SOURCES) -o runStackTests + ./runStackTests # -------------------------- # Clean diff --git a/stack.c b/stack.c index e3a90d4..21bc819 100644 --- a/stack.c +++ b/stack.c @@ -1,33 +1,55 @@ #include #include "stack.h" -//TODO: grundlegende Stackfunktionen implementieren: +// TODO: grundlegende Stackfunktionen implementieren: /* * `push`: legt ein Element oben auf den Stack, - * `pop`: entfernt das oberste Element, - * `top`: liefert das oberste Element zurück, - * `clearStack`: gibt den gesamten Speicher frei. */ + * `pop`: entfernt das oberste Element, + * `top`: liefert das oberste Element zurück, + * `clearStack`: gibt den gesamten Speicher frei. */ // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { + // this is the new top node + StackNode *newTopNode = malloc(sizeof(StackNode)); + if (newTopNode == NULL) + { + return NULL; + } + + newTopNode->data = data; + newTopNode->next = stack; + + return newTopNode; } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) StackNode *pop(StackNode *stack) { - + if (!stack) + { + return NULL; + } + StackNode *nextNode = stack->next; + free(stack); + return nextNode; } // Returns the data of the top element. void *top(StackNode *stack) { - + if (!stack) + { + return NULL; + } + return stack->data; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { - + while (pop(stack)) + ; } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..83dc6be 100644 --- a/stack.h +++ b/stack.h @@ -1,13 +1,17 @@ #ifndef STACK_H #define STACK_H -/* A stack is a special type of queue which uses the LIFO (last in, first out) principle. -This means that with each new element all other elements are pushed deeper into the stack. +/* A stack is a special type of queue which uses the LIFO (last in, first out) principle. +This means that with each new element all other elements are pushed deeper into the stack. The latest element is taken from the stack. */ #include -//TODO: passenden Datentyp als struct anlegen +typedef struct StackNode +{ + struct StackNode *next; + void *data; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..e9843ab --- /dev/null +++ b/test_stack.c @@ -0,0 +1,47 @@ +#include "unity.h" +#include "stack.h" + +int data1 = 10; +int data2 = 20; +int data3 = 30; + +StackNode *stack = NULL; + +void setUp(void) +{ + // set stuff up here +} + +void tearDown(void) +{ + clearStack(stack); +} + +void test_push_and_pop(void) +{ + stack = push(stack, &data1); + stack = push(stack, &data2); + stack = push(stack, &data3); + + TEST_ASSERT_EQUAL_PTR(top(stack), &data3); + stack = pop(stack); + TEST_ASSERT_EQUAL_PTR(top(stack), &data2); + stack = pop(stack); + TEST_ASSERT_EQUAL_PTR(top(stack), &data1); + stack = pop(stack); +} + +void test_handle_NULL(void) +{ + TEST_ASSERT_NULL(pop(stack)); + TEST_ASSERT_NULL(top(stack)); +} + +int main(void) +{ + printf("============================\nStack tests\n============================\n"); + UNITY_BEGIN(); + RUN_TEST(test_push_and_pop); + RUN_TEST(test_handle_NULL); + return UNITY_END(); +} \ No newline at end of file