Test.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #ifndef CORE_TEST_H
  2. #define CORE_TEST_H
  3. #include "data/HashMap.h"
  4. #include "utils/Logger.h"
  5. namespace Core::Test {
  6. namespace Internal {
  7. struct Result {
  8. int tests = 0;
  9. int successTests = 0;
  10. };
  11. using FileName = ArrayString<256>;
  12. extern HashMap<FileName, Result> results;
  13. template<typename T>
  14. void checkEqual(const char* file, int line, const T& wanted,
  15. const T& actual) {
  16. FileName fileName;
  17. if(fileName.append(file)) {
  18. CORE_LOG_WARNING("cannot append file name: #", file);
  19. return;
  20. }
  21. Result* result = results.search(fileName);
  22. if(result == nullptr) {
  23. result = results.tryEmplace(fileName);
  24. if(result == nullptr) {
  25. CORE_LOG_WARNING("cannot add test result for #", file);
  26. return;
  27. }
  28. }
  29. result->tests++;
  30. if(wanted == actual) {
  31. result->successTests++;
  32. } else {
  33. CORE_LOG_ERROR("#:# - expected '#' got '#'", fileName, line,
  34. wanted, actual)
  35. }
  36. }
  37. void checkFloat(const char* file, int line, float wanted, float actual,
  38. float error);
  39. }
  40. void finalize();
  41. }
  42. #define CORE_TEST_EQUAL(wanted, actual) \
  43. Core::Test::Internal::checkEqual<Core::RemoveReference<decltype(actual)>>( \
  44. __FILE__, __LINE__, wanted, actual);
  45. #define CORE_TEST_FALSE(actual) CORE_TEST_EQUAL(false, actual);
  46. #define CORE_TEST_TRUE(actual) CORE_TEST_EQUAL(true, actual);
  47. #define CORE_TEST_NULL(actual) CORE_TEST_EQUAL(true, actual == nullptr);
  48. #define CORE_TEST_NOT_NULL(actual) CORE_TEST_EQUAL(true, actual != nullptr);
  49. #define CORE_TEST_FLOAT(wanted, actual, error) \
  50. Core::Test::Internal::checkFloat(__FILE__, __LINE__, wanted, actual, error);
  51. #endif