diff --git a/numbersTests.c b/numbersTests.c index d3f92e2..41b3e7d 100644 --- a/numbersTests.c +++ b/numbersTests.c @@ -3,17 +3,33 @@ #include #include #include "numbers.h" +#include "unity.h" -// Makro für einfache Test-Prüfung -#define ASSERT_TRUE(condition, message) \ - do { \ - if (!(condition)) { \ - fprintf(stderr, "FEHLER in %s, Zeile %d: %s\n", __FILE__, __LINE__, message); \ - return 0; \ - } \ - } while (0) +// --- UNITY FRAMEWORK NOTWENDIGKEITEN --- +// Diese Funktionen MÜSSEN existieren, damit unity.c gelinkt werden kann. +void setUp(void) { + // Hier könnte Code stehen, der vor jedem Test läuft. + // Wir lassen es leer. +} + +void tearDown(void) { + // Hier könnte Code stehen, der nach jedem Test aufräumt. + // Wir lassen es leer. +} + +// --- HILFSFUNKTIONEN --- + +// WICHTIG: Diese Funktion muss VOR ihrer Verwendung definiert sein. +// Wir nennen sie "compare_helper" und machen sie "static". +static int compare_helper(const void *a, const void *b) { + unsigned int arg1 = *(const unsigned int*)a; + unsigned int arg2 = *(const unsigned int*)b; + + if (arg1 < arg2) return -1; + if (arg1 > arg2) return 1; + return 0; +} -// Hilfsfunktion zum Zählen der Elemente eines Arrays, die in einem anderen enthalten sind static unsigned int count_occurrences(const unsigned int arr[], unsigned int len, unsigned int value) { unsigned int count = 0; for (unsigned int i = 0; i < len; i++) { @@ -24,40 +40,52 @@ static unsigned int count_occurrences(const unsigned int arr[], unsigned int len return count; } -// Definition der Testfunktionen -int test_createNumbers_basic(); -int test_createNumbers_edgeCases(); -int test_getDuplicate_findsDuplicate(); -int test_getDuplicate_noDuplicateOrEdgeCases(); +// Makro für einfache Test-Prüfung +#define ASSERT_TRUE(condition, message) \ + do { \ + if (!(condition)) { \ + fprintf(stderr, "FEHLER in %s, Zeile %d: %s\n", __FILE__, __LINE__, message); \ + return 0; \ + } \ + } while (0) +// --- TEST FUNKTIONEN --- + int test_createNumbers_basic() { - srand(time(NULL)); + // Setzt den Zufallszahlengenerator + srand(time(NULL)); + unsigned int len = 10; unsigned int *arr = createNumbers(len); ASSERT_TRUE(arr != NULL, "createNumbers sollte bei len=10 nicht NULL zurueckgeben."); + // Sortiere eine Kopie unsigned int *temp_copy = (unsigned int *)malloc(len * sizeof(unsigned int)); if (temp_copy == NULL) return 0; memcpy(temp_copy, arr, len * sizeof(unsigned int)); - qsort(temp_copy, len, sizeof(unsigned int), compare_unsigned_int); + + // Verwendung der lokalen compare_helper Funktion + qsort(temp_copy, len, sizeof(unsigned int), compare_helper); unsigned int unique_count = 0; unsigned int duplicate_value = 0; - + for (unsigned int i = 0; i < len; i++) { + // Zählen der eindeutigen Werte if (i == 0 || temp_copy[i] != temp_copy[i-1]) { unique_count++; } + // Identifizieren des Duplikats if (i > 0 && temp_copy[i] == temp_copy[i-1]) { duplicate_value = temp_copy[i]; } } - + ASSERT_TRUE(unique_count == len - 1, "Array sollte genau len-1 eindeutige Werte enthalten."); ASSERT_TRUE(duplicate_value != 0, "Es sollte genau ein Duplikat gefunden werden."); - + free(temp_copy); free(arr); return 1; @@ -65,12 +93,12 @@ int test_createNumbers_basic() { int test_createNumbers_edgeCases() { // 1. Test mit minimaler Länge (len=2) - unsigned int len_min = 2; + unsigned int len_min = 2; unsigned int *arr_min = createNumbers(len_min); ASSERT_TRUE(arr_min != NULL, "createNumbers sollte bei len=2 nicht NULL zurueckgeben."); ASSERT_TRUE(getDuplicate(arr_min, len_min) != 0, "Bei len=2 sollte ein Duplikat gefunden werden."); free(arr_min); - + // 2. Test mit len=0 unsigned int *arr_zero = createNumbers(0); ASSERT_TRUE(arr_zero == NULL, "createNumbers sollte bei len=0 NULL zurueckgeben."); @@ -78,7 +106,10 @@ int test_createNumbers_edgeCases() { // 3. Test mit größerer Länge (len=500) unsigned int len_large = 500; unsigned int *arr_large = createNumbers(len_large); + ASSERT_TRUE(arr_large != NULL, "createNumbers sollte bei len=500 nicht NULL zurueckgeben."); unsigned int duplicate_val = getDuplicate(arr_large, len_large); + ASSERT_TRUE(duplicate_val != 0, "Bei len=500 sollte ein Duplikat gefunden werden."); + ASSERT_TRUE(count_occurrences(arr_large, len_large, duplicate_val) == 2, "Duplikat sollte genau 2-mal vorkommen."); free(arr_large); @@ -90,12 +121,18 @@ int test_getDuplicate_findsDuplicate() { unsigned int len1 = 5; unsigned int result1 = getDuplicate(arr1, len1); ASSERT_TRUE(result1 == 5, "Duplikat 5 sollte gefunden werden."); - + + unsigned int arr2[] = {42, 1, 99, 1, 0}; + unsigned int len2 = 5; + unsigned int result2 = getDuplicate(arr2, len2); + ASSERT_TRUE(result2 == 1, "Duplikat 1 sollte gefunden werden."); + + // Test mit Duplikat am Anfang/Ende unsigned int arr3[] = {10, 20, 30, 40, 10}; unsigned int len3 = 5; unsigned int result3 = getDuplicate(arr3, len3); ASSERT_TRUE(result3 == 10, "Duplikat 10 sollte gefunden werden."); - + return 1; } @@ -112,11 +149,17 @@ int test_getDuplicate_noDuplicateOrEdgeCases() { unsigned int result2 = getDuplicate(arr2, len2); ASSERT_TRUE(result2 == 0, "Leeres Array sollte 0 zurueckgeben."); + // 3. Array mit einem Element + unsigned int arr3[] = {5}; + unsigned int len3 = 1; + unsigned int result3 = getDuplicate(arr3, len3); + ASSERT_TRUE(result3 == 0, "Array mit einem Element sollte 0 zurueckgeben."); + return 1; } -// --- Hauptfunktion (Test Runner) --- +// --- HAUPTFUNKTION (Test Runner) --- typedef int (*test_func)(void); @@ -133,18 +176,18 @@ struct { int main(void) { int total_tests = sizeof(tests) / sizeof(tests[0]); int successful_tests = 0; - + printf("Starte %d Unit-Tests...\n", total_tests); printf("------------------------------------------\n"); for (int i = 0; i < total_tests; i++) { printf("Teste: %s ... ", tests[i].name); - fflush(stdout); + fflush(stdout); if (tests[i].func()) { - printf("PASSED ✅\n"); + printf("PASSED \n"); successful_tests++; } else { - printf("FAILED ❌\n"); + printf("FAILED \n"); } }