121 lines
2.9 KiB
C
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;
|
|
} |