#include #include #include #include "stack.h" /* * Einfache Unit-Tests für den Stack: * - push/pop: LIFO-Verhalten * - top: richtiges Element * - Verhalten bei leerem Stack */ static void test_push_pop_lifo(void) { printf("test_push_pop_lifo...\n"); StackNode *stack = NULL; int a = 1; int b = 2; int c = 3; stack = push(stack, &a); stack = push(stack, &b); stack = push(stack, &c); // LIFO: zuerst c assert(top(stack) == &c); stack = pop(stack); // dann b assert(top(stack) == &b); stack = pop(stack); // dann a assert(top(stack) == &a); stack = pop(stack); // jetzt leer assert(stack == NULL); assert(top(stack) == NULL); printf("...OK\n"); } static void test_empty_stack_operations(void) { printf("test_empty_stack_operations...\n"); StackNode *stack = NULL; // pop auf leerem Stack sollte einfach NULL liefern stack = pop(stack); assert(stack == NULL); // top auf leerem Stack sollte NULL liefern assert(top(stack) == NULL); // clearStack auf leerem Stack darf nicht crashen clearStack(stack); printf("...OK\n"); } static void test_clearStack(void) { printf("test_clearStack...\n"); StackNode *stack = NULL; int values[10]; int i; // Wir legen 10 Elemente auf den Stack for (i = 0; i < 10; ++i) { values[i] = i; stack = push(stack, &values[i]); } // Stack leeren – clearStack muss alle StackNodes freigeben clearStack(stack); stack = NULL; // Pointer selbst auf NULL setzen // Auf leerem Stack dürfen die Operationen nicht crashen assert(top(stack) == NULL); stack = pop(stack); assert(stack == NULL); printf("...OK\n"); } int main(void) { printf("Running stack unit tests...\n\n"); test_push_pop_lifo(); test_empty_stack_operations(); test_clearStack(); printf("\nAll stack tests passed.\n"); return 0; }