Info2Doble/test_numbers.c
2025-12-09 08:07:35 +01:00

153 lines
4.0 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#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();
}