From 06890682f8282bb90b6c1299f35e6b5d1350894f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aileen=20M=C3=B6hrlein?= Date: Fri, 28 Nov 2025 14:58:12 +0100 Subject: [PATCH] Add unit test test_numbers.c --- test_numbers.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 test_numbers.c diff --git a/test_numbers.c b/test_numbers.c new file mode 100644 index 0000000..c713087 --- /dev/null +++ b/test_numbers.c @@ -0,0 +1,119 @@ +#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; +} \ No newline at end of file