diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e813ee4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +doble_initial.exe +highscores.txt +runStackTest.exe +stack.o diff --git a/makefile b/makefile index 1f15f75..5076d63 100644 --- a/makefile +++ b/makefile @@ -35,8 +35,8 @@ $(program_obj_filesobj_files): %.o: %.c # -------------------------- # Unit Tests # -------------------------- -unitTests: - echo "needs to be implemented" +unitTests: stack.o test_stack.c $(unityfolder)/unity.c + $(CC) $(FLAGS) -I$(unityfolder) -o runStackTest test_stack.c stack.o $(unityfolder)/unity.c # -------------------------- # Clean diff --git a/stack.c b/stack.c index e3a90d4..2315722 100644 --- a/stack.c +++ b/stack.c @@ -1,33 +1,91 @@ #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. */ // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { + StackNode *tempNode, *newNode; + newNode = malloc(sizeof(StackNode)); + newNode->value = *(int *)data; + newNode->next = NULL; + + if (stack == NULL) + { + stack = newNode; + return stack; + } + + tempNode = stack; + while (tempNode->next != NULL) + { + tempNode = tempNode->next; + } + tempNode->next = newNode; + + 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) { + StackNode *tempNode; + if (stack == NULL) + { + return stack; + } + + tempNode = stack; + while (tempNode->next->next != NULL) + { + tempNode = tempNode->next; + } + free(tempNode->next); + tempNode->next = NULL; + + return stack; } // Returns the data of the top element. void *top(StackNode *stack) { + StackNode *tempNode; + if (stack == NULL) + { + return NULL; + } + + tempNode = stack; + while (tempNode->next != NULL) + { + tempNode = tempNode->next; + } + + return &tempNode->value; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { + StackNode *tempNode; + if (stack == NULL) + { + return; + } + + tempNode = stack; + while (tempNode != NULL) + { + tempNode = pop(tempNode); + } } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..7019034 100644 --- a/stack.h +++ b/stack.h @@ -8,6 +8,10 @@ The latest element is taken from the stack. */ #include //TODO: passenden Datentyp als struct anlegen +typedef struct Node { + int value; + struct Node* next; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..c9b71cf --- /dev/null +++ b/test_stack.c @@ -0,0 +1,67 @@ +#include +#include +#include "stack.h" +#include "unity.h" + +void test_push(void) +{ + StackNode *testNode; + int data = 1; + + // Test für leeren Stack + testNode = push(NULL, &data); + TEST_ASSERT_NOT_NULL(&testNode); + TEST_ASSERT_NULL(testNode->next); + TEST_ASSERT_EQUAL_INT(1, testNode->value); + + data = 2; + + // Test für nicht leeren Stack + testNode = push(testNode, &data); + TEST_ASSERT_NOT_NULL(&testNode); + TEST_ASSERT_NOT_NULL(testNode->next); + TEST_ASSERT_NULL(testNode->next->next); + TEST_ASSERT_EQUAL_INT(1, testNode->value); + TEST_ASSERT_EQUAL_INT(2, testNode->next->value); +} + +void test_pop(void) +{ + + TEST_ASSERT_NULL(pop(NULL)); + +} + +void test_top(void) +{ + + TEST_ASSERT_NULL(top(NULL)); +} + +void test_clear(void) +{ + + // TEST_ASSERT_NULL(clearStack(NULL)); +} + +void setUp(void) { + // Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden +} + +void tearDown(void) { + // Hier kann Bereinigungsarbeit nach jedem Test durchgeführt werden +} + +int main() +{ + UNITY_BEGIN(); + + printf("============================\nStack tests\n============================\n"); + + RUN_TEST(test_push); + RUN_TEST(test_pop); + RUN_TEST(test_top); + RUN_TEST(test_clear); + + return UNITY_END(); +} \ No newline at end of file diff --git a/unittest.h b/unittest.h new file mode 100644 index 0000000..fc327ca --- /dev/null +++ b/unittest.h @@ -0,0 +1,10 @@ +#ifndef UNITTTESTS_H +#define UNITTTESTS_H + +#include + +typedef int (*UnitTestType)(void); + +#define RUN_UNIT_TEST(fct) printf("%80s: %d\n", #fct, fct()) + +#endif