// Ignore rand warning #pragma clang diagnostic push #pragma ide diagnostic ignored "cert-msc50-cpp" #pragma ide diagnostic ignored "cert-msc51-cpp" #include #include #include #include #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) { 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) { *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_simpleString() { char *str = "Hello, World!"; // Plus one for the null terminator char test[strlen(str) + 1]; int counter = 0; foreach_p(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_p(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_p(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_p(char, item, str, 14) { test[counter] = *item; counter++; } bool result = strcmp(str, test) == 0; free(str); free(test); return result; } int main() { void* foreach_functions[] = { test_simpleArray, test_randomNumbers, }; void* foreach_p_functions[] = { test_simpleString, test_randomNumbersAsPointers, test_randomNumbersOnHeap, test_stringOnHeap }; printf("Foreach tests\n"); for (int i = 0; i < sizeof(foreach_functions) / sizeof(void*); i++) { bool result = ((bool (*)()) foreach_functions[i])(); if (result) { printf("Test %d passed\n", i); } else { printf("Test %d failed\n", i); } } printf("Foreach_p tests\n"); for (int i = 0; i < sizeof(foreach_p_functions) / sizeof(void*); i++) { bool result = ((bool (*)()) foreach_p_functions[i])(); if (result) { printf("Test %d passed\n", i); } else { printf("Test %d failed\n", i); } } return EXIT_SUCCESS; } #pragma clang diagnostic pop