From 93a20fb4dab84c0a29088e846096870360bded0e Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 16 Dec 2025 12:56:57 +0100 Subject: [PATCH] Unit Test bintree --- highscores.txt | 1 - test_bintree.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++ test_bintree.exe | Bin 0 -> 64560 bytes 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 test_bintree.c create mode 100644 test_bintree.exe diff --git a/highscores.txt b/highscores.txt index 8b13789..e69de29 100644 --- a/highscores.txt +++ b/highscores.txt @@ -1 +0,0 @@ - diff --git a/test_bintree.c b/test_bintree.c new file mode 100644 index 0000000..536414f --- /dev/null +++ b/test_bintree.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include "bintree.h" + +// Hilfsfunktion: Vergleich von int +static int compareInt(const void *a, const void *b) { + int ia = *(const int *)a; + int ib = *(const int *)b; + if (ia < ib) return -1; + if (ia > ib) return 1; + return 0; +} + +int main() { + printf("===== TEST BINTREE =====\n"); + + TreeNode *root = NULL; + int isDup; + + // Test 1: addToTree - Einfügen eindeutiger Werte + int val1 = 10, val2 = 5, val3 = 15; + root = addToTree(root, &val1, sizeof(int), compareInt, &isDup); + if (isDup != 0) { printf("FAIL: Erstes Einfügen sollte kein Duplikat sein\n"); return 1; } + root = addToTree(root, &val2, sizeof(int), compareInt, &isDup); + if (isDup != 0) { printf("FAIL: Zweites Einfügen sollte kein Duplikat sein\n"); return 1; } + root = addToTree(root, &val3, sizeof(int), compareInt, &isDup); + if (isDup != 0) { printf("FAIL: Drittes Einfügen sollte kein Duplikat sein\n"); return 1; } + printf("PASS: addToTree - eindeutige Werte\n"); + + // Test 2: addToTree - Duplikat hinzufügen + int dup = 10; + root = addToTree(root, &dup, sizeof(int), compareInt, &isDup); + if (isDup != 1) { printf("FAIL: Duplikat sollte erkannt werden\n"); return 1; } + printf("PASS: addToTree - Duplikat erkannt\n"); + + // Test 3: treeSize + unsigned int size = treeSize(root); + if (size != 3) { printf("FAIL: treeSize sollte 3 sein, ist %u\n", size); return 1; } + printf("PASS: treeSize\n"); + + // Test 4: nextTreeData - Iteration (in-order: 5, 10, 15) + void *data = nextTreeData(root); + if (data == NULL || *(int*)data != 5) { printf("FAIL: Erstes Element sollte 5 sein\n"); return 1; } + data = nextTreeData(NULL); + if (data == NULL || *(int*)data != 10) { printf("FAIL: Zweites Element sollte 10 sein\n"); return 1; } + data = nextTreeData(NULL); + if (data == NULL || *(int*)data != 15) { printf("FAIL: Drittes Element sollte 15 sein\n"); return 1; } + data = nextTreeData(NULL); + if (data != NULL) { printf("FAIL: Nach dem letzten Element sollte NULL kommen\n"); return 1; } + printf("PASS: nextTreeData - Iteration\n"); + + // Test 5: clearTree + clearTree(root); + root = NULL; + // Nach clearTree sollte treeSize 0 sein (aber da root NULL, testen wir indirekt) + printf("PASS: clearTree (no crash)\n"); + + // Test 6: Leerer Baum + size = treeSize(NULL); + if (size != 0) { printf("FAIL: Leerer Baum sollte Größe 0 haben\n"); return 1; } + data = nextTreeData(NULL); + if (data != NULL) { printf("FAIL: Leerer Baum sollte NULL zurückgeben\n"); return 1; } + printf("PASS: Leerer Baum\n"); + + printf("ALL BINTREE TESTS PASSED\n"); + return 0; +} \ No newline at end of file diff --git a/test_bintree.exe b/test_bintree.exe new file mode 100644 index 0000000000000000000000000000000000000000..16a66820ce8ba3cafdd6a919c01a79e8e595f75a GIT binary patch literal 64560 zcmeIb4SZZxoi~1FCO4flX(xT7;Y|i?F-4lDr7bB?$uyaEQYOieNlIFZH`8R249&|p znQ2o5Oi7Ex5DnrguDC`~KxH2*x>^J^rAmu0YXnxx%KB6RnOa|}qT6M`Jm24Wxp(f| zytG}O?(^S2_mi7@?(h80@BRGFx#zx2^_F4gVvOZrA0KCIKaRAO^Z!%->qGVIi@r6R zeLe5T7w>lje|&L$d#uMBPjt5>BAwpmNLN>P(z`9{O{BWKu`X|AZP?q{-4ZRCHEZS~ zNjl_btmV!^_N#y|#z63c8e=Eer7Yj+T*@v1675dF=HXa~9ilntKa~L|xoOkrgf^

`b^sLn2W!;BSY192Yu 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