#include #include #include #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; }