#include #include #include #include "unity.h" #include "numbers.h" // ------------------------------------------------------------- // Hilfsfunktion: zählt, wie oft ein Wert im Array vorkommt // ------------------------------------------------------------- static unsigned int countOccurrences(const unsigned int *arr, unsigned int len, unsigned int value) { unsigned int count = 0; for (unsigned int i = 0; i < len; i++) if (arr[i] == value) count++; return count; } // ------------------------------------------------------------- // Test 1: Array wird korrekt erzeugt (nicht NULL) // ------------------------------------------------------------- void test_createNumbersReturnsNotNull(void) { unsigned int len = 20; unsigned int *numbers = createNumbers(len); TEST_ASSERT_NOT_NULL(numbers); free(numbers); } // ------------------------------------------------------------- // Test 2: Alle Zahlen liegen im erlaubten Bereich (1..2*len) // ------------------------------------------------------------- void test_numbersAreInCorrectRange(void) { unsigned int len = 50; unsigned int *numbers = createNumbers(len); TEST_ASSERT_NOT_NULL(numbers); for (unsigned int i = 0; i < len; i++) { TEST_ASSERT_TRUE(numbers[i] >= 1); TEST_ASSERT_TRUE(numbers[i] <= 2 * len); } free(numbers); } // ------------------------------------------------------------- // Test 3: Es gibt GENAU EIN Duplikat // ------------------------------------------------------------- void test_exactlyOneDuplicateExists(void) { unsigned int len = 80; unsigned int *numbers = createNumbers(len); TEST_ASSERT_NOT_NULL(numbers); unsigned int duplicatesFound = 0; for (unsigned int i = 0; i < len; i++) { unsigned int occurrences = countOccurrences(numbers, len, numbers[i]); if (occurrences == 2) duplicatesFound++; } // Da das Duplikat an zwei Positionen vorkommt, // erwarten wir duplicatesFound == 2 TEST_ASSERT_EQUAL_UINT(2, duplicatesFound); free(numbers); } // ------------------------------------------------------------- // Test 4: getDuplicate() findet die richtige doppelte Zahl // ------------------------------------------------------------- void test_getDuplicateFindsCorrectValue(void) { unsigned int len = 100; unsigned int *numbers = createNumbers(len); TEST_ASSERT_NOT_NULL(numbers); unsigned int duplicate = getDuplicate(numbers, len); TEST_ASSERT_TRUE(duplicate >= 1); TEST_ASSERT_TRUE(duplicate <= 2 * len); TEST_ASSERT_EQUAL_UINT(2, countOccurrences(numbers, len, duplicate)); free(numbers); } // ------------------------------------------------------------- // Test 5: createNumbers() erzeugt len Elemente // ------------------------------------------------------------- void test_arrayLengthIsCorrect(void) { unsigned int len = 30; unsigned int *numbers = createNumbers(len); TEST_ASSERT_NOT_NULL(numbers); // Unity-Funktion prüft nicht direkt Länge, aber wir können checken, // ob Zugriff auf alle Elemente möglich ist (Segfault würde Test crashen). for (unsigned int i = 0; i < len; i++) TEST_ASSERT_TRUE(numbers[i] >= 1); free(numbers); } // ------------------------------------------------------------- // Leere setUp/tearDown // ------------------------------------------------------------- void setUp(void) {} void tearDown(void) {} // ------------------------------------------------------------- // Hauptprogramm für Unity-Tests // ------------------------------------------------------------- int main(void) { UNITY_BEGIN(); printf("\n============================\nNumbers tests\n============================\n"); RUN_TEST(test_createNumbersReturnsNotNull); RUN_TEST(test_numbersAreInCorrectRange); RUN_TEST(test_exactlyOneDuplicateExists); RUN_TEST(test_getDuplicateFindsCorrectValue); RUN_TEST(test_arrayLengthIsCorrect); return UNITY_END(); }