|
@@ -0,0 +1,122 @@
|
|
|
+#include "Test.h"
|
|
|
+
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <string.h>
|
|
|
+
|
|
|
+#include "core/utils/Logger.h"
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ char* file;
|
|
|
+ int tests;
|
|
|
+ int successTests;
|
|
|
+} Result;
|
|
|
+
|
|
|
+static Result* results = nullptr;
|
|
|
+static size_t resultsIndex = 0;
|
|
|
+static size_t resultsCapacity = 0;
|
|
|
+
|
|
|
+static Result* getResult(const char* file) {
|
|
|
+ for(size_t i = 0; i < resultsIndex; i++) {
|
|
|
+ Result* r = results + i;
|
|
|
+ if(strcmp(r->file, file) == 0) {
|
|
|
+ return r;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ while(resultsIndex >= resultsCapacity) {
|
|
|
+ size_t newCapacity = resultsCapacity == 0 ? 8 : resultsCapacity * 2;
|
|
|
+ results = realloc(results, newCapacity);
|
|
|
+ if(results == nullptr) {
|
|
|
+ printf("realloc failure in '%s' at '%d'\n", __FILE__, __LINE__);
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+ resultsCapacity = newCapacity;
|
|
|
+ }
|
|
|
+ Result* r = results + (resultsIndex++);
|
|
|
+ r->file = strdup(file);
|
|
|
+ r->successTests = 0;
|
|
|
+ r->tests = 0;
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
+void Test_finalize(void) {
|
|
|
+ for(size_t i = 0; i < resultsIndex; i++) {
|
|
|
+ Result* r = results + i;
|
|
|
+ bool c = r->successTests == r->tests;
|
|
|
+ fputs(c ? CORE_TERMINAL_GREEN : CORE_TERMINAL_RED, stdout);
|
|
|
+ printf("%s - %d / %d tests succeeded", r->file, r->successTests,
|
|
|
+ r->tests);
|
|
|
+ puts(CORE_TERMINAL_RESET);
|
|
|
+ free(r->file);
|
|
|
+ }
|
|
|
+ free(results);
|
|
|
+ results = nullptr;
|
|
|
+ resultsIndex = 0;
|
|
|
+ resultsCapacity = 0;
|
|
|
+}
|
|
|
+
|
|
|
+static bool addToResult(const char* file, bool comparison) {
|
|
|
+ Result* r = getResult(file);
|
|
|
+ r->tests++;
|
|
|
+ if(comparison) {
|
|
|
+ r->successTests++;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+#define CORE_TEST_SUCCESS(result) \
|
|
|
+ file = Logger_getShortFileName(file); \
|
|
|
+ if(addToResult(file, result)) { \
|
|
|
+ return true; \
|
|
|
+ }
|
|
|
+
|
|
|
+#define CORE_TEST_NAMED_COMPARE(name, type, format) \
|
|
|
+ bool Test_compare_##name(CORE_TEST_ARGS, type wanted, type actual) { \
|
|
|
+ CORE_TEST_SUCCESS(wanted == actual) \
|
|
|
+ fputs(CORE_TERMINAL_RED, stdout); \
|
|
|
+ printf("%s:%d - expected '" format "' got '" format "'", file, line, \
|
|
|
+ wanted, actual); \
|
|
|
+ puts(CORE_TERMINAL_RESET); \
|
|
|
+ return false; \
|
|
|
+ }
|
|
|
+
|
|
|
+CORE_TEST_NAMED_COMPARE(int, int, "%d")
|
|
|
+CORE_TEST_NAMED_COMPARE(bool, bool, "%d")
|
|
|
+
|
|
|
+bool Test_compare_string(CORE_TEST_ARGS, const char* wanted,
|
|
|
+ const char* actual) {
|
|
|
+ CORE_TEST_SUCCESS(strcmp(wanted, actual) == 0);
|
|
|
+ fputs(CORE_TERMINAL_RED, stdout);
|
|
|
+ printf("%s:%d - expected '%s' got '%s'", file, line, wanted, actual);
|
|
|
+ puts(CORE_TERMINAL_RESET);
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool Test_compare_float(CORE_TEST_ARGS, float wanted, float actual,
|
|
|
+ float error) {
|
|
|
+ float diff = wanted - actual;
|
|
|
+ diff = diff < 0.0f ? -diff : diff;
|
|
|
+ CORE_TEST_SUCCESS(diff <= error);
|
|
|
+ fputs(CORE_TERMINAL_RED, stdout);
|
|
|
+ printf("%s:%d - expected '%.3f' got '%.3f'", file, line, (double)wanted,
|
|
|
+ (double)actual);
|
|
|
+ puts(CORE_TERMINAL_RESET);
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool Test_isNull(CORE_TEST_ARGS, const void* actual) {
|
|
|
+ CORE_TEST_SUCCESS(actual == nullptr);
|
|
|
+ fputs(CORE_TERMINAL_RED, stdout);
|
|
|
+ printf("%s:%d - expected null", file, line);
|
|
|
+ puts(CORE_TERMINAL_RESET);
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool Test_isNotNull(CORE_TEST_ARGS, const void* actual) {
|
|
|
+ CORE_TEST_SUCCESS(actual != nullptr);
|
|
|
+ fputs(CORE_TERMINAL_RED, stdout);
|
|
|
+ printf("%s:%d - expected valid pointer", file, line);
|
|
|
+ puts(CORE_TERMINAL_RESET);
|
|
|
+ return false;
|
|
|
+}
|