generated from freudenreichan/info2Praktikum-DobleSpiel
numbersTests.c verbessert
This commit is contained in:
parent
e316a4a785
commit
2edd01effb
@ -3,17 +3,33 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "numbers.h"
|
#include "numbers.h"
|
||||||
|
#include "unity.h"
|
||||||
|
|
||||||
// Makro für einfache Test-Prüfung
|
// --- UNITY FRAMEWORK NOTWENDIGKEITEN ---
|
||||||
#define ASSERT_TRUE(condition, message) \
|
// Diese Funktionen MÜSSEN existieren, damit unity.c gelinkt werden kann.
|
||||||
do { \
|
void setUp(void) {
|
||||||
if (!(condition)) { \
|
// Hier könnte Code stehen, der vor jedem Test läuft.
|
||||||
fprintf(stderr, "FEHLER in %s, Zeile %d: %s\n", __FILE__, __LINE__, message); \
|
// Wir lassen es leer.
|
||||||
return 0; \
|
}
|
||||||
} \
|
|
||||||
} while (0)
|
void tearDown(void) {
|
||||||
|
// Hier könnte Code stehen, der nach jedem Test aufräumt.
|
||||||
|
// Wir lassen es leer.
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- HILFSFUNKTIONEN ---
|
||||||
|
|
||||||
|
// WICHTIG: Diese Funktion muss VOR ihrer Verwendung definiert sein.
|
||||||
|
// Wir nennen sie "compare_helper" und machen sie "static".
|
||||||
|
static int compare_helper(const void *a, const void *b) {
|
||||||
|
unsigned int arg1 = *(const unsigned int*)a;
|
||||||
|
unsigned int arg2 = *(const unsigned int*)b;
|
||||||
|
|
||||||
|
if (arg1 < arg2) return -1;
|
||||||
|
if (arg1 > arg2) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Hilfsfunktion zum Zählen der Elemente eines Arrays, die in einem anderen enthalten sind
|
|
||||||
static unsigned int count_occurrences(const unsigned int arr[], unsigned int len, unsigned int value) {
|
static unsigned int count_occurrences(const unsigned int arr[], unsigned int len, unsigned int value) {
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
for (unsigned int i = 0; i < len; i++) {
|
for (unsigned int i = 0; i < len; i++) {
|
||||||
@ -24,40 +40,52 @@ static unsigned int count_occurrences(const unsigned int arr[], unsigned int len
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Definition der Testfunktionen
|
// Makro für einfache Test-Prüfung
|
||||||
int test_createNumbers_basic();
|
#define ASSERT_TRUE(condition, message) \
|
||||||
int test_createNumbers_edgeCases();
|
do { \
|
||||||
int test_getDuplicate_findsDuplicate();
|
if (!(condition)) { \
|
||||||
int test_getDuplicate_noDuplicateOrEdgeCases();
|
fprintf(stderr, "FEHLER in %s, Zeile %d: %s\n", __FILE__, __LINE__, message); \
|
||||||
|
return 0; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
// --- TEST FUNKTIONEN ---
|
||||||
|
|
||||||
int test_createNumbers_basic() {
|
int test_createNumbers_basic() {
|
||||||
srand(time(NULL));
|
// Setzt den Zufallszahlengenerator
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
unsigned int len = 10;
|
unsigned int len = 10;
|
||||||
unsigned int *arr = createNumbers(len);
|
unsigned int *arr = createNumbers(len);
|
||||||
|
|
||||||
ASSERT_TRUE(arr != NULL, "createNumbers sollte bei len=10 nicht NULL zurueckgeben.");
|
ASSERT_TRUE(arr != NULL, "createNumbers sollte bei len=10 nicht NULL zurueckgeben.");
|
||||||
|
|
||||||
|
// Sortiere eine Kopie
|
||||||
unsigned int *temp_copy = (unsigned int *)malloc(len * sizeof(unsigned int));
|
unsigned int *temp_copy = (unsigned int *)malloc(len * sizeof(unsigned int));
|
||||||
if (temp_copy == NULL) return 0;
|
if (temp_copy == NULL) return 0;
|
||||||
memcpy(temp_copy, arr, len * sizeof(unsigned int));
|
memcpy(temp_copy, arr, len * sizeof(unsigned int));
|
||||||
qsort(temp_copy, len, sizeof(unsigned int), compare_unsigned_int);
|
|
||||||
|
// Verwendung der lokalen compare_helper Funktion
|
||||||
|
qsort(temp_copy, len, sizeof(unsigned int), compare_helper);
|
||||||
|
|
||||||
unsigned int unique_count = 0;
|
unsigned int unique_count = 0;
|
||||||
unsigned int duplicate_value = 0;
|
unsigned int duplicate_value = 0;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < len; i++) {
|
for (unsigned int i = 0; i < len; i++) {
|
||||||
|
// Zählen der eindeutigen Werte
|
||||||
if (i == 0 || temp_copy[i] != temp_copy[i-1]) {
|
if (i == 0 || temp_copy[i] != temp_copy[i-1]) {
|
||||||
unique_count++;
|
unique_count++;
|
||||||
}
|
}
|
||||||
|
// Identifizieren des Duplikats
|
||||||
if (i > 0 && temp_copy[i] == temp_copy[i-1]) {
|
if (i > 0 && temp_copy[i] == temp_copy[i-1]) {
|
||||||
duplicate_value = temp_copy[i];
|
duplicate_value = temp_copy[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT_TRUE(unique_count == len - 1, "Array sollte genau len-1 eindeutige Werte enthalten.");
|
ASSERT_TRUE(unique_count == len - 1, "Array sollte genau len-1 eindeutige Werte enthalten.");
|
||||||
ASSERT_TRUE(duplicate_value != 0, "Es sollte genau ein Duplikat gefunden werden.");
|
ASSERT_TRUE(duplicate_value != 0, "Es sollte genau ein Duplikat gefunden werden.");
|
||||||
|
|
||||||
free(temp_copy);
|
free(temp_copy);
|
||||||
free(arr);
|
free(arr);
|
||||||
return 1;
|
return 1;
|
||||||
@ -65,12 +93,12 @@ int test_createNumbers_basic() {
|
|||||||
|
|
||||||
int test_createNumbers_edgeCases() {
|
int test_createNumbers_edgeCases() {
|
||||||
// 1. Test mit minimaler Länge (len=2)
|
// 1. Test mit minimaler Länge (len=2)
|
||||||
unsigned int len_min = 2;
|
unsigned int len_min = 2;
|
||||||
unsigned int *arr_min = createNumbers(len_min);
|
unsigned int *arr_min = createNumbers(len_min);
|
||||||
ASSERT_TRUE(arr_min != NULL, "createNumbers sollte bei len=2 nicht NULL zurueckgeben.");
|
ASSERT_TRUE(arr_min != NULL, "createNumbers sollte bei len=2 nicht NULL zurueckgeben.");
|
||||||
ASSERT_TRUE(getDuplicate(arr_min, len_min) != 0, "Bei len=2 sollte ein Duplikat gefunden werden.");
|
ASSERT_TRUE(getDuplicate(arr_min, len_min) != 0, "Bei len=2 sollte ein Duplikat gefunden werden.");
|
||||||
free(arr_min);
|
free(arr_min);
|
||||||
|
|
||||||
// 2. Test mit len=0
|
// 2. Test mit len=0
|
||||||
unsigned int *arr_zero = createNumbers(0);
|
unsigned int *arr_zero = createNumbers(0);
|
||||||
ASSERT_TRUE(arr_zero == NULL, "createNumbers sollte bei len=0 NULL zurueckgeben.");
|
ASSERT_TRUE(arr_zero == NULL, "createNumbers sollte bei len=0 NULL zurueckgeben.");
|
||||||
@ -78,7 +106,10 @@ int test_createNumbers_edgeCases() {
|
|||||||
// 3. Test mit größerer Länge (len=500)
|
// 3. Test mit größerer Länge (len=500)
|
||||||
unsigned int len_large = 500;
|
unsigned int len_large = 500;
|
||||||
unsigned int *arr_large = createNumbers(len_large);
|
unsigned int *arr_large = createNumbers(len_large);
|
||||||
|
ASSERT_TRUE(arr_large != NULL, "createNumbers sollte bei len=500 nicht NULL zurueckgeben.");
|
||||||
unsigned int duplicate_val = getDuplicate(arr_large, len_large);
|
unsigned int duplicate_val = getDuplicate(arr_large, len_large);
|
||||||
|
ASSERT_TRUE(duplicate_val != 0, "Bei len=500 sollte ein Duplikat gefunden werden.");
|
||||||
|
|
||||||
ASSERT_TRUE(count_occurrences(arr_large, len_large, duplicate_val) == 2, "Duplikat sollte genau 2-mal vorkommen.");
|
ASSERT_TRUE(count_occurrences(arr_large, len_large, duplicate_val) == 2, "Duplikat sollte genau 2-mal vorkommen.");
|
||||||
free(arr_large);
|
free(arr_large);
|
||||||
|
|
||||||
@ -90,12 +121,18 @@ int test_getDuplicate_findsDuplicate() {
|
|||||||
unsigned int len1 = 5;
|
unsigned int len1 = 5;
|
||||||
unsigned int result1 = getDuplicate(arr1, len1);
|
unsigned int result1 = getDuplicate(arr1, len1);
|
||||||
ASSERT_TRUE(result1 == 5, "Duplikat 5 sollte gefunden werden.");
|
ASSERT_TRUE(result1 == 5, "Duplikat 5 sollte gefunden werden.");
|
||||||
|
|
||||||
|
unsigned int arr2[] = {42, 1, 99, 1, 0};
|
||||||
|
unsigned int len2 = 5;
|
||||||
|
unsigned int result2 = getDuplicate(arr2, len2);
|
||||||
|
ASSERT_TRUE(result2 == 1, "Duplikat 1 sollte gefunden werden.");
|
||||||
|
|
||||||
|
// Test mit Duplikat am Anfang/Ende
|
||||||
unsigned int arr3[] = {10, 20, 30, 40, 10};
|
unsigned int arr3[] = {10, 20, 30, 40, 10};
|
||||||
unsigned int len3 = 5;
|
unsigned int len3 = 5;
|
||||||
unsigned int result3 = getDuplicate(arr3, len3);
|
unsigned int result3 = getDuplicate(arr3, len3);
|
||||||
ASSERT_TRUE(result3 == 10, "Duplikat 10 sollte gefunden werden.");
|
ASSERT_TRUE(result3 == 10, "Duplikat 10 sollte gefunden werden.");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,11 +149,17 @@ int test_getDuplicate_noDuplicateOrEdgeCases() {
|
|||||||
unsigned int result2 = getDuplicate(arr2, len2);
|
unsigned int result2 = getDuplicate(arr2, len2);
|
||||||
ASSERT_TRUE(result2 == 0, "Leeres Array sollte 0 zurueckgeben.");
|
ASSERT_TRUE(result2 == 0, "Leeres Array sollte 0 zurueckgeben.");
|
||||||
|
|
||||||
|
// 3. Array mit einem Element
|
||||||
|
unsigned int arr3[] = {5};
|
||||||
|
unsigned int len3 = 1;
|
||||||
|
unsigned int result3 = getDuplicate(arr3, len3);
|
||||||
|
ASSERT_TRUE(result3 == 0, "Array mit einem Element sollte 0 zurueckgeben.");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --- Hauptfunktion (Test Runner) ---
|
// --- HAUPTFUNKTION (Test Runner) ---
|
||||||
|
|
||||||
typedef int (*test_func)(void);
|
typedef int (*test_func)(void);
|
||||||
|
|
||||||
@ -133,18 +176,18 @@ struct {
|
|||||||
int main(void) {
|
int main(void) {
|
||||||
int total_tests = sizeof(tests) / sizeof(tests[0]);
|
int total_tests = sizeof(tests) / sizeof(tests[0]);
|
||||||
int successful_tests = 0;
|
int successful_tests = 0;
|
||||||
|
|
||||||
printf("Starte %d Unit-Tests...\n", total_tests);
|
printf("Starte %d Unit-Tests...\n", total_tests);
|
||||||
printf("------------------------------------------\n");
|
printf("------------------------------------------\n");
|
||||||
|
|
||||||
for (int i = 0; i < total_tests; i++) {
|
for (int i = 0; i < total_tests; i++) {
|
||||||
printf("Teste: %s ... ", tests[i].name);
|
printf("Teste: %s ... ", tests[i].name);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (tests[i].func()) {
|
if (tests[i].func()) {
|
||||||
printf("PASSED ✅\n");
|
printf("PASSED \n");
|
||||||
successful_tests++;
|
successful_tests++;
|
||||||
} else {
|
} else {
|
||||||
printf("FAILED ❌\n");
|
printf("FAILED \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user