info2Praktikum-DobleSpiel/test_numbers.c
2025-12-09 14:41:22 +01:00

121 lines
2.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "numbers.h"
/*
* Unit-Tests für createNumbers und getDuplicate:
* - createNumbers liefert ein gültiges Array
* - alle Zahlen liegen im Bereich [1, 2*len]
* - genau eine Zahl kommt doppelt vor
* - getDuplicate findet genau diese doppelte Zahl
* - Fehlerfälle (NULL-Pointer, zu kleine Länge)
*/
static void check_numbers_array(unsigned int *numbers, unsigned int len)
{
unsigned int maxValue = 2 * len;
unsigned int *counts;
unsigned int i;
unsigned int duplicatesCount = 0;
assert(numbers != NULL);
counts = (unsigned int *)calloc(maxValue + 1, sizeof(unsigned int));
assert(counts != NULL);
// Werte zählen und Bereich prüfen
for (i = 0; i < len; ++i)
{
unsigned int v = numbers[i];
assert(v >= 1 && v <= maxValue);
counts[v]++;
}
// Prüfen: genau eine Zahl kommt zweimal vor, alle anderen höchstens einmal
for (i = 1; i <= maxValue; ++i)
{
if (counts[i] == 2)
duplicatesCount++;
else
assert(counts[i] == 0 || counts[i] == 1);
}
assert(duplicatesCount == 1);
free(counts);
}
static void test_createNumbers_and_getDuplicate(unsigned int len)
{
printf("test_createNumbers_and_getDuplicate(len=%u)...\n", len);
unsigned int *numbers = createNumbers(len);
assert(numbers != NULL);
// Arraystruktur überprüfen
check_numbers_array(numbers, len);
// Nochmal zählen, um das Duplikat zu kennen
unsigned int maxValue = 2 * len;
unsigned int *counts = (unsigned int *)calloc(maxValue + 1, sizeof(unsigned int));
assert(counts != NULL);
for (unsigned int i = 0; i < len; ++i)
{
unsigned int v = numbers[i];
counts[v]++;
}
unsigned int expectedDuplicate = 0;
for (unsigned int v = 1; v <= maxValue; ++v)
{
if (counts[v] == 2)
{
expectedDuplicate = v;
break;
}
}
assert(expectedDuplicate != 0);
// getDuplicate testen
unsigned int found = getDuplicate(numbers, len);
assert(found == expectedDuplicate);
free(counts);
free(numbers);
printf("...OK\n");
}
static void test_getDuplicate_error_cases(void)
{
printf("test_getDuplicate_error_cases...\n");
// NULL-Array
unsigned int dup = getDuplicate(NULL, 10);
assert(dup == 0);
// Länge < 2
unsigned int dummy[1] = {42};
dup = getDuplicate(dummy, 1);
assert(dup == 0);
printf("...OK\n");
}
int main(void)
{
printf("Running numbers unit tests...\n\n");
// Typische Testfälle mit verschiedenen Längen
test_createNumbers_and_getDuplicate(5);
test_createNumbers_and_getDuplicate(10);
test_createNumbers_and_getDuplicate(20);
// Fehlerfälle
test_getDuplicate_error_cases();
printf("\nAll numbers tests passed.\n");
return 0;
}