167 lines
3.1 KiB
C
167 lines
3.1 KiB
C
// Ignore rand warning
|
|
#pragma clang diagnostic push
|
|
#pragma ide diagnostic ignored "cert-msc50-cpp"
|
|
#pragma ide diagnostic ignored "cert-msc51-cpp"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include "foreach.h"
|
|
|
|
int rand_range(int min, int max) {
|
|
return rand() % (max - min + 1) + min;
|
|
}
|
|
|
|
bool test_simpleArray() {
|
|
int arr[] = {1, 2, 3, 4, 5};
|
|
|
|
int test[5];
|
|
int counter = 0;
|
|
foreach(int, item, arr, sizeof(arr) / sizeof(int)) {
|
|
test[counter] = *item;
|
|
counter++;
|
|
}
|
|
|
|
if (memcmp(arr, test, sizeof(arr)) == 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool test_randomNumbers() {
|
|
int arr1[10];
|
|
srand(0);
|
|
foreach(int, item, arr1, sizeof(arr1) / sizeof(int)) {
|
|
*item = rand_range(0, 100);
|
|
}
|
|
int arr2[10];
|
|
srand(0);
|
|
for (int i = 0; i < sizeof(arr2) / sizeof(int); i++) {
|
|
arr2[i] = rand_range(0, 100);
|
|
}
|
|
if (memcmp(arr1, arr2, sizeof(arr1)) == 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool test_twoDimensionalArray() {
|
|
int arr2d[2][2] = {
|
|
{1, 2},
|
|
{3, 4}
|
|
};
|
|
int test[2][2];
|
|
int counter1 = 0;
|
|
foreach(int*, arr, (int **) arr2d, 2) {
|
|
int counter2 = 0;
|
|
foreach(int, number, *arr, 2) {
|
|
test[counter1][counter2] = *number;
|
|
counter2++;
|
|
}
|
|
}
|
|
|
|
if (memcmp(arr2d, test, sizeof(arr2d)) == 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool test_simpleString() {
|
|
char *str = "Hello, World!";
|
|
|
|
// Plus one for the null terminator
|
|
char test[strlen(str) + 1];
|
|
int counter = 0;
|
|
foreach(char, item, str, strlen(str) + 1) {
|
|
test[counter] = *item;
|
|
counter++;
|
|
}
|
|
|
|
if (strcmp(str, test) == 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool test_randomNumbersAsPointers() {
|
|
int arr1[10];
|
|
srand(0);
|
|
foreach(int, item, arr1, sizeof(arr1) / sizeof(int)) {
|
|
*item = rand_range(0, 100);
|
|
}
|
|
int arr2[10];
|
|
srand(0);
|
|
for (int i = 0; i < sizeof(arr2) / sizeof(int); i++) {
|
|
arr2[i] = rand_range(0, 100);
|
|
}
|
|
|
|
if (memcmp(arr1, arr2, sizeof(arr1)) == 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool test_randomNumbersOnHeap() {
|
|
int *arr1 = malloc(sizeof(int) * 10);
|
|
srand(0);
|
|
foreach(int, item, arr1, 10) {
|
|
*item = rand_range(0, 100);
|
|
}
|
|
int *arr2 = malloc(sizeof(int) * 10);
|
|
srand(0);
|
|
for (int i = 0; i < 10; i++) {
|
|
arr2[i] = rand_range(0, 100);
|
|
}
|
|
|
|
bool result = memcmp(arr1, arr2, 10) == 0;
|
|
free(arr1);
|
|
free(arr2);
|
|
return result;
|
|
}
|
|
|
|
bool test_stringOnHeap() {
|
|
char *str = malloc(sizeof(char) * 14);
|
|
strcpy(str, "Hello, World!");
|
|
char *test = malloc(sizeof(char) * 14);
|
|
int counter = 0;
|
|
foreach(char, item, str, 14) {
|
|
test[counter] = *item;
|
|
counter++;
|
|
}
|
|
|
|
bool result = strcmp(str, test) == 0;
|
|
free(str);
|
|
free(test);
|
|
return result;
|
|
}
|
|
|
|
int main() {
|
|
void* functions[] = {
|
|
test_simpleArray,
|
|
test_randomNumbers,
|
|
test_simpleString,
|
|
test_randomNumbersAsPointers,
|
|
test_randomNumbersOnHeap,
|
|
test_stringOnHeap,
|
|
test_twoDimensionalArray,
|
|
};
|
|
printf("foreach tests\n");
|
|
for (int i = 0; i < sizeof(functions) / sizeof(void*); i++) {
|
|
bool result = ((bool (*)()) functions[i])();
|
|
if (result) {
|
|
printf("Test %d passed\n", i);
|
|
} else {
|
|
printf("Test %d failed\n", i);
|
|
}
|
|
}
|
|
return EXIT_SUCCESS;
|
|
}
|
|
#pragma clang diagnostic pop |