#include "test/Test.h"

Core::HashMap<Core::Test::Internal::FileName, Core::Test::Internal::Result>
    Core::Test::Internal::results;

bool Core::Test::Internal::checkFloat(const char* file, int line, float wanted,
                                      float actual, float error) {
    FileName fileName;
    if(fileName.append(file)) {
        CORE_LOG_WARNING("cannot append file name: #", file);
        return false;
    }
    Result* result = results.search(fileName);
    if(result == nullptr) {
        result = results.add(fileName, Result());
        if(result == nullptr) {
            CORE_LOG_WARNING("cannot add test result for #", file);
            return false;
        }
    }
    result->tests++;
    float diff = wanted - actual;
    diff = diff < 0.0f ? -diff : diff;
    if(diff <= error) {
        result->successTests++;
        return true;
    }
    CORE_LOG_ERROR("#:# - expected '#' got '#'", fileName, line, wanted, actual)
    return false;
}

void Core::Test::finalize() {
    using namespace Internal;
    for(const auto& e : results) {
        if(e.value.successTests == e.value.tests) {
            CORE_LOG_DEBUG("# - # / # tests succeeded", e.getKey(),
                           e.value.successTests, e.value.tests);
        } else {
            CORE_LOG_ERROR("# - # / # tests succeeded", e.getKey(),
                           e.value.successTests, e.value.tests);
        }
    }
    results.clear();
}