From 75a227eae0372e34ed34f61808245fa642e23a30 Mon Sep 17 00:00:00 2001 From: Jakob Date: Sun, 7 Dec 2025 15:01:12 +0100 Subject: [PATCH] stack sowie die unit tests mit nicole und lena gemacht --- .vscode/settings.json | 6 ++++ makefile | 5 ++- stack.c | 54 +++++++++++++++++++++++-------- stack.h | 5 +++ test__numbers.c => test_numbers.c | 0 test_stack.c | 38 ++++++++++++++++++++++ 6 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 .vscode/settings.json rename test__numbers.c => test_numbers.c (100%) create mode 100644 test_stack.c diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0a23ac1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "stdio.h": "c", + "unity.h": "c" + } +} \ No newline at end of file diff --git a/makefile b/makefile index 1a598d8..d71611b 100644 --- a/makefile +++ b/makefile @@ -36,8 +36,11 @@ $(program_obj_filesobj_files): %.o: %.c # Unit Tests # -------------------------- test_numbers: - $(CC) -o test_numbers test__numbers.c numbers.c $(unityfolder)/unity.c $(FLAGS) + $(CC) -o test_numbers test_numbers.c numbers.c $(unityfolder)/unity.c $(FLAGS) +test_stack: + $(CC) -o test_stack test_stack.c stack.c $(unityfolder)/unity.c $(FLAGS) + # -------------------------- # Clean # -------------------------- diff --git a/stack.c b/stack.c index c517cb0..efc8a30 100644 --- a/stack.c +++ b/stack.c @@ -1,39 +1,65 @@ #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. */ + +static StackNode *createNewElement() +{ + return malloc(sizeof(StackNode)); +} // Pushes data as pointer onto the stack. -typedef struct stackNode -{ - void *data; - struct stackNode *next; -} StackNode; - StackNode *push(StackNode *stack, void *data) { - + StackNode *node = createNewElement(); + if (node != NULL) + { + node->data = data; + node->next = stack; + return node; + } + return stack; } // 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 != NULL) + { + StackNode *currentElement = stack; + stack = stack->next; + + free(currentElement); + } + return stack; } // Returns the data of the top element. void *top(StackNode *stack) { - + if (stack != NULL) + { + return stack->data; + } + return NULL; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { + StackNode *nextElement = stack; -} \ No newline at end of file + while (stack != NULL) + { + nextElement = stack->next; + + free(stack); + + stack = nextElement; + } +} diff --git a/stack.h b/stack.h index f7d542d..2ce0246 100644 --- a/stack.h +++ b/stack.h @@ -8,6 +8,11 @@ The latest element is taken from the stack. */ #include //TODO: passenden Datentyp als struct anlegen +typedef struct stackNode +{ + void *data; + struct stackNode *next; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); diff --git a/test__numbers.c b/test_numbers.c similarity index 100% rename from test__numbers.c rename to test_numbers.c diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..691335d --- /dev/null +++ b/test_stack.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include "unity/unity.h" +#include "stack.h" + +void test_stackOrderIsCorrect() +{ + int expectedValues[] = {1, 2, 3, 4}; + const unsigned int exprectedLen = sizeof(expectedValues) / sizeof(expectedValues[0]); + unsigned int observedLen = 0; + StackNode *stack = NULL; + + for(int i = 0; i < exprectedLen; i++) + { + stack = push(stack, &expectedValues[i]); + } + + for(int i = exprectedLen-1; i >= 0 && stack != NULL; i--) + { + TEST_ASSERT_EQUAL(expectedValues[i], *(int *)top(stack)); + observedLen++; + stack = pop(stack); + } + TEST_ASSERT_EQUAL_UINT32(exprectedLen, observedLen); + + clearStack(stack); +} + +void setUp(void) {} +void tearDown(void) {} + +int main(void) +{ + UNITY_BEGIN(); + RUN_TEST(test_stackOrderIsCorrect); + return UNITY_END(); +} \ No newline at end of file