119 lines
3.2 KiB
C
119 lines
3.2 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h> // 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;
|
|
} |