#include <bits/types/stack_t.h>
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

void inspectStack(StackNode *stack)
{    
    if (stack != NULL)
    {
        printf("Der Stack enthält die folgenden Elemente: %d", *(int*)stack->value);
        while (stack->next != NULL)
        {
            printf(" %d", *(int*)stack->next->value);
            stack = stack->next;
        }
        putchar('\n');
    }
    else
    {
        printf("Der Stack ist leer\n");
    }
}

int main()
{
    StackNode *stack;
    stack = NULL; // initialisierung mit NULL -> leere Liste
    
    printf("...ein Element wird eingefügt...\n");
    int toBeRemoved = 42;
    stack = push(stack, &toBeRemoved);
    
    inspectStack(stack);

    printf("...das Element wird wieder entfernt...\n");
    stack = pop(stack);
    
    inspectStack(stack);
    
    printf("...pop auf leeren Stack...\n");
    stack = pop(stack);
    
    inspectStack(stack);
    putchar('\n');

    int data[5] = {1, 2, 3, 4, 5};

    // alle 5 werte der reihe nach auf den Satck legen - 1 unten ... 5 oben
    for (int i = 0; i < 5; i++)
    {
        stack = push(stack, &data[i]);
    }

    
    //alle Elemente mit Test-Funktion ausgeben
    inspectStack(stack);
    
    // Elemente stück für Stück ausgeben und entfernen
    printf("1. Element war: %d\n", *(int*)top(stack));
    stack = pop(stack);
    printf("2. Element war: %d\n", *(int*)top(stack));
    stack = pop(stack);
    printf("3. Element war: %d\n", *(int*)top(stack));
    stack = pop(stack);
    printf("4. Element war: %d\n", *(int*)top(stack));
    stack = pop(stack);
    printf("5. Element war: %d\n", *(int*)top(stack));
}

/*
int main()
{
    UNITY_BEGIN();

    printf("============================\n Stack tests\n============================\n");
    RUN_TEST(test_createNodeFailsOnZeroData);

    return UNITY_END();
}
*/
