123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #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<FileName, Result> results;
- template<typename T>
- 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)
- }
- }
- template<typename A, typename B>
- void checkString(const char* file, int line, const A& wanted,
- const B& actual) {
- ArrayString<2048> a;
- if(a.append(wanted)) {
- CORE_LOG_WARNING("too small buffer");
- return;
- }
- ArrayString<2048> b;
- if(b.append(actual)) {
- CORE_LOG_WARNING("too small buffer");
- return;
- }
- return checkEqual(file, line, a, b);
- }
- 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<Core::RemoveReference<decltype(actual)>>( \
- __FILE__, __LINE__, wanted, actual);
- #define CORE_TEST_STRING(wanted, actual) \
- Core::Test::Internal::checkString(__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
|