generated from freudenreichan/info2Praktikum-DobleSpiel
153 lines
4.0 KiB
C
153 lines
4.0 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "unity.h"
|
|
#include "numbers.h"
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Hilfsfunktion: zählt, wie oft ein Wert im Array vorkommt
|
|
// -------------------------------------------------------------
|
|
static unsigned int countOccurrences(const unsigned int *arr, unsigned int len, unsigned int value)
|
|
{
|
|
unsigned int count = 0;
|
|
for (unsigned int i = 0; i < len; i++)
|
|
if (arr[i] == value)
|
|
count++;
|
|
return count;
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Test 1: Array wird korrekt erzeugt (nicht NULL)
|
|
// -------------------------------------------------------------
|
|
void test_createNumbersReturnsNotNull(void)
|
|
{
|
|
unsigned int len = 20;
|
|
unsigned int *numbers = createNumbers(len);
|
|
|
|
TEST_ASSERT_NOT_NULL(numbers);
|
|
|
|
free(numbers);
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Test 2: Alle Zahlen liegen im erlaubten Bereich (1..2*len)
|
|
// -------------------------------------------------------------
|
|
void test_numbersAreInCorrectRange(void)
|
|
{
|
|
unsigned int len = 50;
|
|
unsigned int *numbers = createNumbers(len);
|
|
|
|
TEST_ASSERT_NOT_NULL(numbers);
|
|
|
|
for (unsigned int i = 0; i < len; i++)
|
|
{
|
|
TEST_ASSERT_TRUE(numbers[i] >= 1);
|
|
TEST_ASSERT_TRUE(numbers[i] <= 2 * len);
|
|
}
|
|
|
|
free(numbers);
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Test 3: Es gibt GENAU EIN Duplikat
|
|
// -------------------------------------------------------------
|
|
void test_exactlyOneDuplicateExists(void)
|
|
{
|
|
unsigned int len = 80;
|
|
unsigned int *numbers = createNumbers(len);
|
|
|
|
TEST_ASSERT_NOT_NULL(numbers);
|
|
|
|
unsigned int duplicatesFound = 0;
|
|
|
|
for (unsigned int i = 0; i < len; i++)
|
|
{
|
|
unsigned int occurrences = countOccurrences(numbers, len, numbers[i]);
|
|
if (occurrences == 2)
|
|
duplicatesFound++;
|
|
}
|
|
|
|
// Da das Duplikat an zwei Positionen vorkommt,
|
|
// erwarten wir duplicatesFound == 2
|
|
TEST_ASSERT_EQUAL_UINT(2, duplicatesFound);
|
|
|
|
free(numbers);
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Test 4: getDuplicate() findet die richtige doppelte Zahl
|
|
// -------------------------------------------------------------
|
|
void test_getDuplicateFindsCorrectValue(void)
|
|
{
|
|
unsigned int len = 100;
|
|
unsigned int *numbers = createNumbers(len);
|
|
|
|
TEST_ASSERT_NOT_NULL(numbers);
|
|
|
|
unsigned int duplicate = getDuplicate(numbers, len);
|
|
|
|
TEST_ASSERT_TRUE(duplicate >= 1);
|
|
TEST_ASSERT_TRUE(duplicate <= 2 * len);
|
|
|
|
TEST_ASSERT_EQUAL_UINT(2, countOccurrences(numbers, len, duplicate));
|
|
|
|
free(numbers);
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Test 5: createNumbers() erzeugt len Elemente
|
|
// -------------------------------------------------------------
|
|
void test_arrayLengthIsCorrect(void)
|
|
{
|
|
unsigned int len = 30;
|
|
unsigned int *numbers = createNumbers(len);
|
|
|
|
TEST_ASSERT_NOT_NULL(numbers);
|
|
|
|
// Unity-Funktion prüft nicht direkt Länge, aber wir können checken,
|
|
// ob Zugriff auf alle Elemente möglich ist (Segfault würde Test crashen).
|
|
for (unsigned int i = 0; i < len; i++)
|
|
TEST_ASSERT_TRUE(numbers[i] >= 1);
|
|
|
|
free(numbers);
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Leere setUp/tearDown
|
|
// -------------------------------------------------------------
|
|
void setUp(void) {}
|
|
void tearDown(void) {}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------
|
|
// Hauptprogramm für Unity-Tests
|
|
// -------------------------------------------------------------
|
|
int main(void)
|
|
{
|
|
UNITY_BEGIN();
|
|
|
|
printf("\n============================\nNumbers tests\n============================\n");
|
|
|
|
RUN_TEST(test_createNumbersReturnsNotNull);
|
|
RUN_TEST(test_numbersAreInCorrectRange);
|
|
RUN_TEST(test_exactlyOneDuplicateExists);
|
|
RUN_TEST(test_getDuplicateFindsCorrectValue);
|
|
RUN_TEST(test_arrayLengthIsCorrect);
|
|
|
|
return UNITY_END();
|
|
}
|