Compare commits

...

32 Commits
main ... main

Author SHA1 Message Date
Fabrice
91f5c52077 clearTree hinzugefügt 2025-12-10 10:03:36 +01:00
Fabrice
fc9031adbd In Main Z.74 geändert 2025-12-10 09:50:33 +01:00
Fabrice
a7fd62eda4 numbers.c passiert alle Tests 2025-12-09 20:22:27 +01:00
c6fd4b300e
Merge remote-tracking branch 'origin/bintree' 2025-12-08 18:50:19 +01:00
93a818088c
Merge branch 'main' into Fabrice 2025-12-08 18:45:17 +01:00
Fabrice
2e805ba8e6 3. Test (vorerst) gelöscht 2025-12-08 17:55:44 +01:00
Fabrice
2d3ffcf3f8 reset bintree 2025-12-08 17:50:40 +01:00
Fabrice
aa3538c14b 3. Test hinzugefügt 2025-12-08 17:20:01 +01:00
Fabrice
a4a60a3d95 Kleiner Fix 2025-12-08 16:27:24 +01:00
0c13e3ce56 tests implemenitert und bestanden 2025-12-08 16:05:10 +01:00
c2c94cd71d bintree implementiert 2025-12-08 16:04:33 +01:00
afe2c3b90d
remove vla 2025-12-07 18:02:35 +01:00
6d08de0efa
add numbers.c test 2025-12-07 18:02:35 +01:00
bf8d8f5139
add some numbers.c tests 2025-12-07 17:11:29 +01:00
Fabrice
996ca92031 fixed problems 2025-12-07 12:56:19 +01:00
Fabrice
1bbefdb72a Merge branch 'main' into Fabrice 2025-12-07 11:23:07 +01:00
Fabrice
a816abfe04 numbers.c finished 2025-12-05 09:28:40 +01:00
39976279e5
reset bintree and numbers 2025-12-05 08:42:58 +01:00
b0284fc53c Merge pull request 'implementation for stack and some tests' (#1) from simon into main
Reviewed-on: wiesendsi102436/info2Praktikum-DobleSpiel#1
2025-12-05 07:40:44 +00:00
Fabrice
74b541a1a0 numbers.c angafangen 2025-12-05 08:05:57 +01:00
fc3933a993
fix: memory leak 2025-11-30 12:15:06 +01:00
5050836020
fix: malloc error handling 2025-11-30 12:12:45 +01:00
1c27338be2
fix: timers on Linux
On Linux the clock() function measures cpu time instead of wall time. This change uses the Apple code path for Linux.
2025-11-30 10:34:01 +01:00
942b38e75d
set the seed for the RNG just once at the beginning of the program
this improves randomness for tests where createNumbers() is called in rapid succession
2025-11-30 09:17:08 +01:00
a900d2d147
initial implementation for numbers.c with some testing in test_numbers.c
numbers.c currently uses the qsort() function from stdlib
2025-11-30 09:06:21 +01:00
07262a1fe0
fix makefile to allow debugging 2025-11-29 21:25:04 +01:00
34e5a59196
remove redundant assignment 2025-11-29 21:24:11 +01:00
ab71a3dd74
setup first test for bintree.c 2025-11-29 17:21:51 +01:00
fd51eef1fe
initial bintree.c 2025-11-29 17:21:11 +01:00
a48cb6560d
update gitignore 2025-11-29 12:57:49 +01:00
ef59987f08
implement stack with some initial testing 2025-11-29 12:57:07 +01:00
fe4c130d72
create initial gitignore with obvious stuff 2025-11-29 09:58:23 +01:00
11 changed files with 556 additions and 43 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*doble*
*.o
*.exe
.vscode
run*Tests

107
bintree.c
View File

@ -1,36 +1,117 @@
#include <string.h> #include <string.h>
#include <stdlib.h>
#include "stack.h" #include "stack.h"
#include "bintree.h" #include "bintree.h"
//TODO: binären Suchbaum implementieren static StackNode *iterStack = NULL;
/* * `addToTree`: fügt ein neues Element in den Baum ein (rekursiv), static void pushLeftBranch(StackNode **stack, TreeNode *node);
* `clearTree`: gibt den gesamten Baum frei (rekursiv),
* `treeSize`: zählt die Knoten im Baum (rekursiv),
* `nextTreeData`: Traversierung mit Hilfe des zuvor implementierten Stacks. */
// Adds a copy of data's pointer destination to the tree using compareFct for ordering. Accepts duplicates // Inserts a new node into the BST.
// if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added). // If isDuplicate == NULL → duplicates are allowed
TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) // If isDuplicate != NULL → duplicates are ignored and *isDuplicate = 1
TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize,
CompareFctType compareFct, int *isDuplicate)
{ {
if (root == NULL)
{
TreeNode *newNode = calloc(1, sizeof(TreeNode));
if (!newNode)
return NULL;
newNode->data = malloc(dataSize);
if (!newNode->data)
{
free(newNode);
return NULL;
}
memcpy(newNode->data, data, dataSize);
if (isDuplicate)
*isDuplicate = 0;
return newNode;
}
int cmp = compareFct(data, root->data);
if (cmp < 0 || (cmp == 0 && isDuplicate == NULL))
{
root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate);
}
else if (cmp > 0)
{
root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate);
}
else
{
if (isDuplicate)
*isDuplicate = 1;
}
return root;
} }
// Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction. static void pushLeftBranch(StackNode **stack, TreeNode *node)
// Use your implementation of a stack to organize the iterator. Push the root node and all left nodes first. On returning the next element, {
// push the top node and push all its left nodes. while (node)
{
*stack = push(*stack, node);
node = node->left;
}
}
// If root != NULL → reset iterator and start from new tree.
// If root == NULL → continue iterating.
void *nextTreeData(TreeNode *root) void *nextTreeData(TreeNode *root)
{ {
// Start new iteration
if (root != NULL)
{
// reset old iterator state
clearStack(iterStack);
iterStack = NULL;
// push root and all left children
pushLeftBranch(&iterStack, root);
}
// No active iterator
if (iterStack == NULL)
return NULL;
// Get next node
TreeNode *node = (TreeNode *)top(iterStack);
iterStack = pop(iterStack);
// push right subtree and its left descendants
if (node->right)
pushLeftBranch(&iterStack, node->right);
return node->data;
} }
// Releases all memory resources (including data copies). // Frees all nodes and also resets iterator.
void clearTree(TreeNode *root) void clearTree(TreeNode *root)
{ {
if (!root)
return;
clearTree(root->left);
clearTree(root->right);
free(root->data);
free(root);
// If we clear the tree, iterator must not point into freed memory.
clearStack(iterStack);
iterStack = NULL;
} }
// Returns the number of entries in the tree given by root.
unsigned int treeSize(const TreeNode *root) unsigned int treeSize(const TreeNode *root)
{ {
if (!root)
return 0;
return 1 + treeSize(root->left) + treeSize(root->right);
} }

5
main.c
View File

@ -1,5 +1,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <time.h>
#include "numbers.h" #include "numbers.h"
#include "timer.h" #include "timer.h"
#include "highscore.h" #include "highscore.h"
@ -39,6 +40,9 @@ int main(int argc, char *argv[])
{ {
int exitCode = EXIT_FAILURE; int exitCode = EXIT_FAILURE;
// set seed
srand(time(NULL));
if(argc != 2) if(argc != 2)
{ {
fprintf(stderr, "Usage: %s <player name>\n", argv[0]); fprintf(stderr, "Usage: %s <player name>\n", argv[0]);
@ -83,6 +87,7 @@ int main(int argc, char *argv[])
saveHighscores(highscorePath); saveHighscores(highscorePath);
clearHighscores(); clearHighscores();
free(numbers);
exitCode = EXIT_SUCCESS; exitCode = EXIT_SUCCESS;
} }

View File

@ -1,5 +1,5 @@
CC = gcc CC = gcc
FLAGS = -g -Wall -lm CFLAGS = -g -Wall -lm
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
include makefile_windows.variables include makefile_windows.variables
@ -27,16 +27,29 @@ doble_initial:
program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o
doble : main.o $(program_obj_files) doble : main.o $(program_obj_files)
$(CC) $(FLAGS) $^ -o doble $(CC) $(CFLAGS) $^ -o doble
$(program_obj_filesobj_files): %.o: %.c $(program_obj_files): %.o: %.c
$(CC) -c $(FLAGS) $^ -o $@ $(CC) -c $(CFLAGS) $^ -o $@
# -------------------------- # --------------------------
# Unit Tests # Unit Tests
# -------------------------- # --------------------------
unitTests: TEST_STACK_SOURCES = stack.c test_stack.c $(unityfolder)/unity.c
echo "needs to be implemented" TEST_BINTREE_SOURCES = bintree.c test_bintree.c stack.c $(unityfolder)/unity.c
TEST_NUMBERS_SOURCES = stack.c numbers.c bintree.c $(unityfolder)/unity.c test_numbers.c
stackTests: $(TEST_STACK_SOURCES) stack.h
$(CC) $(CFLAGS) -I$(unityfolder) $(TEST_STACK_SOURCES) -o runStackTests
./runStackTests
bintreeTests: $(TEST_BINTREE_SOURCES) stack.h bintree.h
$(CC) $(CFLAGS) -I$(unityfolder) $(TEST_BINTREE_SOURCES) -o runBintreeTests
./runBintreeTests
numbersTests: $(TEST_NUMBERS_SOURCES) stack.h bintree.h numbers.h
$(CC) $(CFLAGS) -I$(unityfolder) $(TEST_NUMBERS_SOURCES) -o runNumbersTests
./runNumbersTests
# -------------------------- # --------------------------
# Clean # Clean

View File

@ -5,22 +5,79 @@
#include "numbers.h" #include "numbers.h"
#include "bintree.h" #include "bintree.h"
//TODO: getDuplicate und createNumbers implementieren //Speicher für Array erstellen, zufällige Zahlen von 1-2xlen erzeugen, mittels Binärbaum checken, ob Zahlen einzigartig sind
/* * * Erzeugen eines Arrays mit der vom Nutzer eingegebenen Anzahl an Zufallszahlen. //Eine Zahl duplizieren, an zufälliger Stelle einfügen und die Zahl an der Stelle ans Ende schieben
* Sicherstellen, dass beim Befüllen keine Duplikate entstehen. const int compare (const void *a, const void *b);
* Duplizieren eines zufälligen Eintrags im Array.
* in `getDuplicate()`: Sortieren des Arrays und Erkennen der doppelten Zahl durch Vergleich benachbarter Elemente. */
// Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries.
// Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while
// creating random numbers.
unsigned int *createNumbers(unsigned int len) unsigned int *createNumbers(unsigned int len)
{ {
unsigned int *numbers = malloc (sizeof(unsigned int) * len);
unsigned int upperLimit = len * 2;
int isDuplicate = 0;
TreeNode *binTree = NULL;
for (unsigned int i = 0; i < len; i++) {
do
{
isDuplicate = 0;
numbers[i] = rand () % upperLimit + 1;
binTree = addToTree(binTree, &numbers[i], sizeof(unsigned int), compare, &isDuplicate);
} while (isDuplicate);
}
unsigned int duplicate = numbers[rand () % len];
int indexDuplicate;
do {
indexDuplicate = rand() % len;
} while (numbers[indexDuplicate] == duplicate);
if (numbers[len-1] != duplicate) {
numbers[len-1] = numbers[indexDuplicate];
}
numbers[indexDuplicate] = duplicate;
clearTree(binTree);
return numbers;
} }
// Returns only the only number in numbers which is present twice. Returns zero on errors. //Vergleichsfunktion von qsort
const int compare (const void *a, const void *b) {
const unsigned int *x = a;
const unsigned int *y = b;
if (*x < *y) {
return -1;
}
else if (*x > *y) {
return 1;
}
else {
return 0;
}
}
//Sortiert Zahlen mit qsort, vergleicht dann benachbarte Elemente und gibt bei Erfolg die doppelte Zahl zurück
unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
{ {
if (len < 2) {
return 0;
}
unsigned int *copy = malloc (sizeof(unsigned int) * len);
memcpy (copy, numbers, sizeof(unsigned int) * len);
qsort(copy, len, sizeof(unsigned int), compare);
for (int i = 0; i < len-1; i++) {
if (copy[i] == copy [i+1]) {
unsigned int result = copy [i];
free (copy);
return result;
}
}
free (copy);
return 0;
} }

36
stack.c
View File

@ -1,33 +1,55 @@
#include <stdlib.h> #include <stdlib.h>
#include "stack.h" #include "stack.h"
//TODO: grundlegende Stackfunktionen implementieren: // TODO: grundlegende Stackfunktionen implementieren:
/* * `push`: legt ein Element oben auf den Stack, /* * `push`: legt ein Element oben auf den Stack,
* `pop`: entfernt das oberste Element, * `pop`: entfernt das oberste Element,
* `top`: liefert das oberste Element zurück, * `top`: liefert das oberste Element zurück,
* `clearStack`: gibt den gesamten Speicher frei. */ * `clearStack`: gibt den gesamten Speicher frei. */
// Pushes data as pointer onto the stack. // Pushes data as pointer onto the stack.
StackNode *push(StackNode *stack, void *data) StackNode *push(StackNode *stack, void *data)
{ {
// this is the new top node
StackNode *newTopNode = malloc(sizeof(StackNode));
if (newTopNode == NULL)
{
return NULL;
}
newTopNode->data = data;
newTopNode->next = stack;
return newTopNode;
} }
// Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be
// freed by caller.) // freed by caller.)
StackNode *pop(StackNode *stack) StackNode *pop(StackNode *stack)
{ {
if (!stack)
{
return NULL;
}
StackNode *nextNode = stack->next;
free(stack);
return nextNode;
} }
// Returns the data of the top element. // Returns the data of the top element.
void *top(StackNode *stack) void *top(StackNode *stack)
{ {
if (!stack)
{
return NULL;
}
return stack->data;
} }
// Clears stack and releases all memory. // Clears stack and releases all memory.
void clearStack(StackNode *stack) void clearStack(StackNode *stack)
{ {
while (pop(stack))
;
} }

View File

@ -7,7 +7,11 @@ The latest element is taken from the stack. */
#include <stdlib.h> #include <stdlib.h>
//TODO: passenden Datentyp als struct anlegen typedef struct StackNode
{
struct StackNode *next;
void *data;
} StackNode;
// Pushes data as pointer onto the stack. // Pushes data as pointer onto the stack.
StackNode *push(StackNode *stack, void *data); StackNode *push(StackNode *stack, void *data);

145
test_bintree.c Normal file
View File

@ -0,0 +1,145 @@
#include "unity.h"
#include "bintree.h"
#include <string.h>
#include <stdio.h>
static int compareInt(const void *a, const void *b)
{
int x = *(const int *)a;
int y = *(const int *)b;
return (x > y) - (x < y);
}
void setUp(void)
{
}
void tearDown(void)
{
}
/* ============================================================
TEST 1 Strings einfügen + korrekte Reihenfolge prüfen
============================================================ */
void test_insert_and_retrieve_strings(void)
{
char *data1 = "a_this";
char *data2 = "b_is";
char *data3 = "c_testdata";
TreeNode *root = addToTree(NULL, data1, strlen(data1) + 1, (CompareFctType)strcmp, NULL);
addToTree(root, data2, strlen(data2) + 1, (CompareFctType)strcmp, NULL);
addToTree(root, data3, strlen(data3) + 1, (CompareFctType)strcmp, NULL);
TEST_ASSERT_EQUAL_STRING(data1, nextTreeData(root));
TEST_ASSERT_EQUAL_STRING(data2, nextTreeData(NULL));
TEST_ASSERT_EQUAL_STRING(data3, nextTreeData(NULL));
TEST_ASSERT_EQUAL_PTR(NULL, nextTreeData(NULL)); // Ende
clearTree(root);
}
/* ============================================================
TEST 2 Integer einfügen + Traversierung
============================================================ */
void test_insert_and_retrieve_ints(void)
{
int a = 2, b = 1, c = 3;
TreeNode *root = NULL;
root = addToTree(root, &a, sizeof(int), compareInt, NULL);
addToTree(root, &b, sizeof(int), compareInt, NULL);
addToTree(root, &c, sizeof(int), compareInt, NULL);
int *v1 = nextTreeData(root);
int *v2 = nextTreeData(NULL);
int *v3 = nextTreeData(NULL);
int *v4 = nextTreeData(NULL);
TEST_ASSERT_EQUAL_INT(1, *v1);
TEST_ASSERT_EQUAL_INT(2, *v2);
TEST_ASSERT_EQUAL_INT(3, *v3);
TEST_ASSERT_NULL(v4);
clearTree(root);
}
/* ============================================================
TEST 3 treeSize korrekt?
============================================================ */
void test_tree_size(void)
{
TreeNode *root = NULL;
TEST_ASSERT_EQUAL_UINT(0, treeSize(root));
int x1 = 10, x2 = 5, x3 = 15;
root = addToTree(root, &x1, sizeof(int), compareInt, NULL);
addToTree(root, &x2, sizeof(int), compareInt, NULL);
addToTree(root, &x3, sizeof(int), compareInt, NULL);
TEST_ASSERT_EQUAL_UINT(3, treeSize(root));
clearTree(root);
}
/* ============================================================
TEST 4 Duplikaterkennung
============================================================ */
void test_duplicate_detection(void)
{
int x = 42;
int dupFlag = -1;
TreeNode *root = addToTree(NULL, &x, sizeof(int), compareInt, &dupFlag);
TEST_ASSERT_EQUAL_INT(0, dupFlag);
addToTree(root, &x, sizeof(int), compareInt, &dupFlag);
TEST_ASSERT_EQUAL_INT(1, dupFlag);
TEST_ASSERT_EQUAL_UINT(1, treeSize(root));
clearTree(root);
}
/* ============================================================
TEST 5 Iterator nach clearTree sollte NULL liefern
============================================================ */
void test_iterator_after_cleartree(void)
{
int a = 5, b = 1, c = 9;
TreeNode *root = NULL;
root = addToTree(root, &a, sizeof(int), compareInt, NULL);
addToTree(root, &b, sizeof(int), compareInt, NULL);
addToTree(root, &c, sizeof(int), compareInt, NULL);
nextTreeData(root);
clearTree(root);
TEST_ASSERT_NULL(nextTreeData(NULL));
TEST_ASSERT_NULL(nextTreeData(NULL));
}
int main(void)
{
printf("============================\n");
printf("Bintree tests\n");
printf("============================\n");
UNITY_BEGIN();
RUN_TEST(test_insert_and_retrieve_strings);
RUN_TEST(test_insert_and_retrieve_ints);
RUN_TEST(test_tree_size);
RUN_TEST(test_duplicate_detection);
RUN_TEST(test_iterator_after_cleartree);
return UNITY_END();
}

127
test_numbers.c Normal file
View File

@ -0,0 +1,127 @@
#include "unity.h"
#include "numbers.h"
#include "stdlib.h"
#include "string.h"
static int compareInt(const void *ptr1, const void *ptr2);
void setUp(void)
{
// set stuff up here
}
void tearDown(void)
{
// set stuff up here
}
// getDuplicate on array without duplicats
// expects 0/error
void test_get_duplicate_without_duplicates(void)
{
unsigned int input[] = {1, 5, 9, 2, 4};
unsigned int len = sizeof(input) / sizeof(input[0]);
TEST_ASSERT_EQUAL_UINT(0, getDuplicate(input, len));
}
// getDuplicate() on some arrays with 1 duplicate
void test_get_duplicate(void)
{
unsigned int arr1[] = {4, 15, 32, 5, 3, 8, 8};
unsigned int len1 = sizeof(arr1) / sizeof(arr1[0]);
unsigned int arr2[] = {1, 3, 3, 7};
unsigned int len2 = sizeof(arr2) / sizeof(arr2[0]);
unsigned int arr3[] = {7, 7, 8, 4, 9, 1};
unsigned int len3 = sizeof(arr3) / sizeof(arr3[0]);
TEST_ASSERT_EQUAL_UINT(8, getDuplicate(arr1, len1));
TEST_ASSERT_EQUAL_UINT(3, getDuplicate(arr2, len2));
TEST_ASSERT_EQUAL_UINT(7, getDuplicate(arr3, len3));
}
// this tries to brute force a triple
void test_for_triple(void)
{
// this test is less effective if srand is called inside createNumbers()
for (int i = 0; i < 100000; i++)
{
unsigned int *numbers = createNumbers(3);
if (numbers[0] == numbers[1] && numbers[1] == numbers[2])
{
TEST_FAIL_MESSAGE("triple generated");
}
free(numbers);
}
}
// check if getDuplicate() modifies the original array (it should not)
void test_get_duplicate_does_modify()
{
unsigned int arr1[] = {1, 2, 3, 4, 5, 4, 3, 2, 1}; // sorting would change this
size_t len1 = sizeof(arr1) / sizeof(arr1[0]);
unsigned int arr1Copy[9];
memcpy(arr1Copy, arr1, len1 * sizeof(unsigned int));
getDuplicate(arr1, len1); // return value does not matter
// check if the arrays are still the same
if (memcmp(arr1, arr1Copy, len1 * sizeof(unsigned int)))
{
TEST_FAIL_MESSAGE("Arrays have diverged");
}
}
// checks if there is exactly 1 duplicate number at varying array sizes
void test_exactly_one_duplicate()
{
const size_t MAX_LIST_SIZE = 20; // max tested array len
const size_t ITERATIONS_PER_LEN = 20; // number of iterations for each tested array len
for (size_t len = 2; len < MAX_LIST_SIZE; len++) // start with smallest sensible size 2
{
for (size_t i = 0; i < ITERATIONS_PER_LEN; i++)
{
unsigned int *randTestList = createNumbers((unsigned int)len);
qsort(randTestList, len, sizeof(unsigned int), compareInt);
int cntDuplicate = 0;
for (size_t j = 0; j < len - 1; j++)
{
if (randTestList[j] == randTestList[j + 1])
{
cntDuplicate++;
}
}
// there should be exactly 1 duplicate
TEST_ASSERT_EQUAL_INT(1, cntDuplicate);
free(randTestList);
}
}
}
static int compareInt(const void *ptr1, const void *ptr2)
{
unsigned int num1 = *(int *)ptr1;
unsigned int num2 = *(int *)ptr2;
if (num1 < num2)
return -1;
if (num1 > num2)
return 1;
return 0;
}
int main(void)
{
printf("============================\nNumbers tests\n============================\n");
UNITY_BEGIN();
RUN_TEST(test_get_duplicate_without_duplicates);
RUN_TEST(test_for_triple);
RUN_TEST(test_exactly_one_duplicate);
RUN_TEST(test_get_duplicate);
RUN_TEST(test_get_duplicate_does_modify);
return UNITY_END();
}

47
test_stack.c Normal file
View File

@ -0,0 +1,47 @@
#include "unity.h"
#include "stack.h"
int data1 = 10;
int data2 = 20;
int data3 = 30;
StackNode *stack = NULL;
void setUp(void)
{
// set stuff up here
}
void tearDown(void)
{
clearStack(stack);
}
void test_push_and_pop(void)
{
stack = push(stack, &data1);
stack = push(stack, &data2);
stack = push(stack, &data3);
TEST_ASSERT_EQUAL_PTR(top(stack), &data3);
stack = pop(stack);
TEST_ASSERT_EQUAL_PTR(top(stack), &data2);
stack = pop(stack);
TEST_ASSERT_EQUAL_PTR(top(stack), &data1);
stack = pop(stack);
}
void test_handle_NULL(void)
{
TEST_ASSERT_NULL(pop(stack));
TEST_ASSERT_NULL(top(stack));
}
int main(void)
{
printf("============================\nStack tests\n============================\n");
UNITY_BEGIN();
RUN_TEST(test_push_and_pop);
RUN_TEST(test_handle_NULL);
return UNITY_END();
}

13
timer.c
View File

@ -1,6 +1,12 @@
#include "timer.h" #include "timer.h"
#if __APPLE__ #ifdef __linux__
// Defines strict posix compliance for CLOCK_MONOTONIC
#define _POSIX_C_SOURCE 199309L
#include <time.h>
#endif
#if __APPLE__ || __linux__
#include <sys/time.h> #include <sys/time.h>
static struct timespec start = {0, 0}; static struct timespec start = {0, 0};
@ -21,7 +27,8 @@ double stopTimer()
double measuredSeconds = (double)delta_us / 1000000.; double measuredSeconds = (double)delta_us / 1000000.;
if(start.tv_nsec > 0) { if (start.tv_nsec > 0)
{
start.tv_nsec = 0; start.tv_nsec = 0;
start.tv_sec = 0; start.tv_sec = 0;
} }
@ -45,7 +52,7 @@ double stopTimer()
{ {
double measuredSeconds = (clock() - (double)startClocks) / CLOCKS_PER_SEC; double measuredSeconds = (clock() - (double)startClocks) / CLOCKS_PER_SEC;
if(startClocks > 0) if (startClocks > 0)
startClocks = 0; startClocks = 0;
else else
measuredSeconds = -1; measuredSeconds = -1;