#ifndef CORE_TEST_H #define CORE_TEST_H #include "data/HashMap.h" #include "utils/Logger.h" namespace Core::Test { namespace Internal { struct Result { int tests = 0; int successTests = 0; }; using FileName = ArrayString<256>; extern HashMap results; template void checkEqual(const char* file, int line, const T& wanted, const T& actual) { FileName fileName; if(fileName.append(file)) { CORE_LOG_WARNING("cannot append file name: #", file); return; } Result* result = results.search(fileName); if(result == nullptr) { result = results.tryEmplace(fileName); if(result == nullptr) { CORE_LOG_WARNING("cannot add test result for #", file); return; } } result->tests++; if(wanted == actual) { result->successTests++; } else { CORE_LOG_ERROR("#:# - expected '#' got '#'", fileName, line, wanted, actual) } } void checkFloat(const char* file, int line, float wanted, float actual, float error); } void finalize(); } #define CORE_TEST_EQUAL(wanted, actual) \ Core::Test::Internal::checkEqual>( \ __FILE__, __LINE__, wanted, actual); #define CORE_TEST_FALSE(actual) CORE_TEST_EQUAL(false, actual); #define CORE_TEST_TRUE(actual) CORE_TEST_EQUAL(true, actual); #define CORE_TEST_NULL(actual) CORE_TEST_EQUAL(true, actual == nullptr); #define CORE_TEST_NOT_NULL(actual) CORE_TEST_EQUAL(true, actual != nullptr); #define CORE_TEST_FLOAT(wanted, actual, error) \ Core::Test::Internal::checkFloat(__FILE__, __LINE__, wanted, actual, error); #endif