Doble/test_numbers.c
2025-12-16 14:19:06 +01:00

113 lines
2.4 KiB
C

//
// Created by Johannes on 15.12.2025.
//
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "numbers.h"
//Framework
static int tests_run = 0;
static int tests_failed = 0;
#define RUNTEST(test) do { \
tests_run++; \
printf("Running %-30s ... ", #test); \
if (test()) { \
printf("OK\n"); \
} else { \
printf("FAIL\n"); \
tests_failed++; \
} \
} while (0)
#define ASSERT_TRUE(expr) do { \
if (!(expr)) return false; \
} while (0)
void setUp(void) {
}
void tearDown(void) {
}
static bool array_contains(const unsigned int *arr, unsigned int len, unsigned int value)
{
for (unsigned int i = 0; i < len; i++)
if (arr[i] == value)
return true;
return false;
}
// Test: createNumbers gibt gültigen Pointer zurück
bool test_createNumbers_not_null(void)
{
unsigned int len = 10;
unsigned int *nums = createNumbers(len);
ASSERT_TRUE(nums != NULL);
free(nums);
return true;
}
// Test: alle Zahlen liegen im erlaubten Bereich
bool test_createNumbers_range(void)
{
unsigned int len = 20;
unsigned int *nums = createNumbers(len);
ASSERT_TRUE(nums != NULL);
for (unsigned int i = 0; i < len; i++) {
ASSERT_TRUE(nums[i] >= 1);
ASSERT_TRUE(nums[i] <= 2 * len);
}
free(nums);
return true;
}
// Test: es existiert genau ein Duplikat
bool test_getDuplicate_finds_duplicate(void)
{
unsigned int len = 15;
unsigned int *nums = createNumbers(len);
ASSERT_TRUE(nums != NULL);
unsigned int dup = getDuplicate(nums, len);
ASSERT_TRUE(dup != 0);
ASSERT_TRUE(array_contains(nums, len, dup));
free(nums);
return true;
}
// Test: getDuplicate gibt 0 bei Fehlerfall zurück
bool test_getDuplicate_no_duplicate(void)
{
unsigned int nums[] = {1, 2, 3, 4, 5};
unsigned int len = 5;
unsigned int dup = getDuplicate(nums, len);
ASSERT_TRUE(dup == 0);
return true;
}
int main(void)
{
RUNTEST(test_createNumbers_not_null);
RUNTEST(test_createNumbers_range);
RUNTEST(test_getDuplicate_finds_duplicate);
RUNTEST(test_getDuplicate_no_duplicate);
printf("\nTests run: %d\n", tests_run);
printf("Tests failed: %d\n", tests_failed);
return tests_failed ? EXIT_FAILURE : EXIT_SUCCESS;
}