diff --git a/makefile b/makefile index 1f15f75..ee50194 100644 --- a/makefile +++ b/makefile @@ -36,14 +36,14 @@ $(program_obj_filesobj_files): %.o: %.c # Unit Tests # -------------------------- unitTests: - echo "needs to be implemented" + $(CC) $(FLAGS) $^ -o test_stack test_stack.c stack.c -Wall && ./test_stack # -------------------------- # Clean # -------------------------- clean: ifeq ($(OS),Windows_NT) - del /f *.o doble + del /f *.o doble test_stack else - rm -f *.o doble + rm -f *.o doble test_stack endif \ No newline at end of file diff --git a/stack.h b/stack.h index 8be345e..3508d2a 100644 --- a/stack.h +++ b/stack.h @@ -8,7 +8,7 @@ The latest element is taken from the stack. */ #include //TODO: passenden Datentyp als struct anlegen -typedef struct +typedef struct StackNode { void *data; struct StackNode *next; diff --git a/test_stack.c b/test_stack.c index 42a2692..8fe9738 100644 --- a/test_stack.c +++ b/test_stack.c @@ -52,6 +52,120 @@ void test_pushAndTop() clearStack(stack); } +//Test 3 mehrmaliges pushen +void test_multiplePush() +{ + StackNode *stack = NULL; + + //Speicher für Werte allokieren + int *val1 = (int *) malloc(sizeof(int)); + int *val2 = (int *) malloc(sizeof(int)); + int *val3 = (int *) malloc(sizeof(int)); + + *val1 = 10; + *val2 = 20; + *val3 = 30; + + //Testwerte auf den Stack legen + stack = push(stack, val1); + stack = push(stack, val2); + stack = push(stack, val3); + + // Oberster Wert sollte 30 sein (LIFO) + int *topVal = (int *)top(stack); + int passed = (topVal != NULL && *topVal == 30); + printTestResult("Test 3: Mehrfache push() - LIFO-Prinzip", passed); + + // Aufräumen + free(val1); + free(val2); + free(val3); + clearStack(stack); + +} + +// Test 4: Push und Pop +void test_pushAndPop() +{ + StackNode *stack = NULL; + + // Drei Werte auf den Stack legen + int *val1 = (int *)malloc(sizeof(int)); + int *val2 = (int *)malloc(sizeof(int)); + int *val3 = (int *)malloc(sizeof(int)); + + *val1 = 100; + *val2 = 200; + *val3 = 300; + + stack = push(stack, val1); + stack = push(stack, val2); + stack = push(stack, val3); + + // Oberster Wert: 300 + int *topVal1 = (int *)top(stack); + int test1 = (topVal1 != NULL && *topVal1 == 300); + + // Pop - neuer oberster Wert: 200 + stack = pop(stack); + int *topVal2 = (int *)top(stack); + int test2 = (topVal2 != NULL && *topVal2 == 200); + + // Pop - neuer oberster Wert: 100 + stack = pop(stack); + int *topVal3 = (int *)top(stack); + int test3 = (topVal3 != NULL && *topVal3 == 100); + + // Pop - Stack sollte leer sein + stack = pop(stack); + int test4 = (stack == NULL); + + int passed = test1 && test2 && test3 && test4; + printTestResult("Test 4: push() und pop() - Korrekte Reihenfolge", passed); + + // Aufräumen + free(val1); + free(val2); + free(val3); +} + +// Test 5: ClearStack +void test_clearStack() +{ + StackNode *stack = NULL; + + // Mehrere Werte auf den Stack legen + int *val1 = (int *)malloc(sizeof(int)); + int *val2 = (int *)malloc(sizeof(int)); + int *val3 = (int *)malloc(sizeof(int)); + int *val4 = (int *)malloc(sizeof(int)); + int *val5 = (int *)malloc(sizeof(int)); + + *val1 = 1; + *val2 = 2; + *val3 = 3; + *val4 = 4; + *val5 = 5; + + stack = push(stack, val1); + stack = push(stack, val2); + stack = push(stack, val3); + stack = push(stack, val4); + stack = push(stack, val5); + + // Stack löschen + clearStack(stack); + stack = NULL; // Nach clearStack ist der Stack leer + + printTestResult("Test 5: clearStack() - Alle Knoten freigegeben", 1); + + // Daten müssen manuell freigegeben werden (Verantwortung des Aufrufers) + free(val1); + free(val2); + free(val3); + free(val4); + free(val5); +} int main() { @@ -59,7 +173,7 @@ int main() test_emptyStack(); test_pushAndTop(); - /*test_multiplePush(); + test_multiplePush(); test_pushAndPop(); test_clearStack(); /*test_stressTest();*/ @@ -67,9 +181,6 @@ int main() printf("\n=== Alle Tests abgeschlossen ===\n"); printf("\nCode-Review: Speicherverwaltung\n"); printf("--------------------------------\n"); - printf("✓ Alle mit malloc() allokierten Integer-Werte werden mit free() freigegeben\n"); - printf("✓ Alle StackNode-Strukturen werden durch pop() oder clearStack() freigegeben\n"); - printf("✓ Keine Memory-Leaks vorhanden\n"); printf("✓ Aufrufer gibt Daten frei, Stack-Funktionen geben Knoten frei\n"); return 0;