#include #include #include // Abbruch bei unerfüllter Bedingung #include "numbers.h" #include "bintree.h" // Vergleichsfunktion für unsigned int (für BST-Test) static int compareUInt(const void *a, const void *b) // nur in dieser Datei sichtbar { unsigned int x = *(const unsigned int *)a; // in unsigned in umwandeln unsigned int y = *(const unsigned int *)b; if (x < y) return -1; // Vergleichsrückgabe für Binärbaum if (x > y) return 1; return 0; } void test_createNumbers_basic() { printf("Running test_createNumbers_basic...\n"); unsigned int len = 20; // Anlegen eines Arrays unsigned int *arr = createNumbers(len); assert(arr != NULL); // Fehler -> Abbruch assert(len >= 2); // für ein Duplikat min 2 // Prüfen: Array hat länge len unsigned int size = len; (void)size; // vermeidet warnings free(arr); // Speicher wird freigegeben printf(" test_createNumbers_basic passed\n"); } void test_createNumbers_unique_except_one() { printf("Running test_createNumbers_unique_except_one...\n"); unsigned int len = 100; // Erzeugen eines Arrays unsigned int *arr = createNumbers(len); assert(arr != NULL); // Prüfen, dass genau EIN Duplikat existiert TreeNode *root = NULL; // neuer Binärbaum int isDup; // zeigt ob Wert doppelt unsigned int duplicateCount = 0; // zählt gefundene Duplikate for (unsigned int i = 0; i < len; i++) // Array in BST eingefügt { root = addToTree(root, &arr[i], sizeof(unsigned int), compareUInt, &isDup); if (isDup) duplicateCount++; // sollte 1 sein } // Es muss genau 1 doppelter Wert existieren assert(duplicateCount == 1); clearTree(root); // Baum und Array freigeben free(arr); printf(" test_createNumbers_unique_except_one passed\n"); } void test_getDuplicate() { printf("Running test_getDuplicate...\n"); unsigned int len = 50; // Erzeugen eines Arrays unsigned int *arr = createNumbers(len); assert(arr != NULL); unsigned int duplicate = getDuplicate(arr, len); // soll Duplikat finden unsigned int countInArray = 0; for (unsigned int i = 0; i < len; i++) // Durchlauf des Arrays { if (arr[i] == duplicate) countInArray++; // Zählt wie oft die gefundene Zahl vorkommt } assert(countInArray == 2); // alle anderen Werte einzigartig free(arr); // Array freigeben printf(" test_getDuplicate passed\n"); } // Testet große Arrays (Stress-Test) void test_large_input() // testes zufällige Kollision { printf("Running test_large_input...\n"); unsigned int len = 20000; // Erzeugen eines Arrays unsigned int *arr = createNumbers(len); assert(arr != NULL); unsigned int d = getDuplicate(arr, len); // doppelter Wert sollte existieren assert(d != 0); free(arr); // Array freigeben printf(" test_large_input passed\n"); } int main() { printf("=== Running numbers Tests ===\n"); test_createNumbers_basic(); // alle Test nacheinander ausführen test_createNumbers_unique_except_one(); test_getDuplicate(); test_large_input(); printf("=== All tests passed successfully! ===\n"); return 0; }