#include #include // für malloc und free #include // für assert() - Programm stoppt bei Fehlern #include "stack.h" // Hilfsfunktion: beendet Programm bei malloc-Fehler int *make_int(int value) { int *p = malloc(sizeof(int)); //Reserviert Speicherplatz für eine Zahl und gibt dessen Adresse zurück assert(p != NULL); // Programm stoppt wenn Speicher zu knapp *p = value; // Speichert Wert in neuen Speicherplatz return p; // Gibt Zeiger zurück } // Test: Push und Top. void test_push_and_top() { printf("Running test_push_and_top...\n"); StackNode *stack = NULL; // Stack beginnt leer int *a = make_int(10); // zwei Zeiger int *b = make_int(20); stack = push(stack, a); // Erst 10 auf Stack gelegt stack = push(stack, b); // Dann 20 (oben) int *topValue = (int *)top(stack); // Datentyp in int umgewandelt assert(topValue != NULL); // Stack darf nicht leer sein assert(*topValue == 20); // Kopf muss 20 sein clearStack(stack); // Entfernt alle Knoten free(a); // Löscht die Daten free(b); printf(" test_push_and_top passed\n"); } // Test: Pop in korrekter Reihenfolge void test_push_pop_sequence() { printf("Running test_push_pop_sequence...\n"); StackNode *stack = NULL; // Stack muss leer sein int *a = make_int(1); // Definieren der Testwerte int *b = make_int(2); int *c = make_int(3); stack = push(stack, a); // Werte auf den Stack legen (C oben) stack = push(stack, b); stack = push(stack, c); // Pop 3 int *v = (int *)top(stack); //Top muss 3 sein assert(*v == 3); stack = pop(stack); // 3 entfernen // Pop 2 v = (int *)top(stack); //analog zur 3 assert(*v == 2); stack = pop(stack); // Pop 1 v = (int *)top(stack); assert(*v == 1); stack = pop(stack); // Stack sollte leer sein assert(stack == NULL); free(a); // Freigeben des Speichers free(b); free(c); printf(" test_push_pop_sequence passed\n"); } // Test: clearStack void test_clearStack() { printf("Running test_clearStack...\n"); StackNode *stack = NULL; // Stack muss leer sein for (int i = 0; i < 5; i++) // 5 Elemente auf dem Stack (O bis 4) stack = push(stack, make_int(i)); clearStack(stack); //Knoten freigeben // danach ist Stack nur als "gelöscht" markiert, // aber Pointer ist nicht automatisch NULL → das prüft man so: stack = NULL; //Stackzeiger manuell auf NULL setzen printf(" test_clearStack passed\n"); } int main() { printf("=== Running Stack Unit Tests ===\n"); test_push_and_top(); // Ausführen aller Tests test_push_pop_sequence(); test_clearStack(); printf("=== All tests passed successfully! ===\n"); return 0; }