Test.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #ifndef CORE_TEST_H
  2. #define CORE_TEST_H
  3. #include "data/HashMap.h"
  4. #include "math/Vector.h"
  5. #include "utils/Logger.h"
  6. namespace Core::Test {
  7. namespace Internal {
  8. struct Result final {
  9. int tests = 0;
  10. int successTests = 0;
  11. };
  12. using FileName = ArrayString<256>;
  13. extern HashMap<FileName, Result> results;
  14. template<typename T>
  15. bool checkEqual(const char* file, int line, const T& wanted,
  16. const T& actual) {
  17. FileName fileName;
  18. if(fileName.append(file)) {
  19. CORE_LOG_WARNING("cannot append file name: #", file);
  20. return false;
  21. }
  22. Result* result = results.search(fileName);
  23. if(result == nullptr) {
  24. result = results.tryEmplace(fileName);
  25. if(result == nullptr) {
  26. CORE_LOG_WARNING("cannot add test result for #", file);
  27. return false;
  28. }
  29. }
  30. result->tests++;
  31. if(wanted == actual) {
  32. result->successTests++;
  33. return true;
  34. }
  35. CORE_LOG_ERROR("#:# - expected '#' got '#'", fileName, line, wanted,
  36. actual)
  37. return false;
  38. }
  39. template<typename A, typename B>
  40. bool checkString(const char* file, int line, const A& wanted,
  41. const B& actual) {
  42. ArrayString<2048> a;
  43. if(a.append(wanted)) {
  44. CORE_LOG_WARNING("too small buffer");
  45. return false;
  46. }
  47. ArrayString<2048> b;
  48. if(b.append(actual)) {
  49. CORE_LOG_WARNING("too small buffer");
  50. return false;
  51. }
  52. return checkEqual(file, line, a, b);
  53. }
  54. bool checkFloat(const char* file, int line, float wanted, float actual,
  55. float error);
  56. template<int N, typename T>
  57. bool checkVector(const char* file, int line,
  58. const Core::Vector<N, T>& wanted,
  59. const Core::Vector<N, T>& actual, float error) {
  60. bool result = true;
  61. for(int i = 0; i < N; i++) {
  62. result = checkFloat(file, line, static_cast<float>(wanted[i]),
  63. static_cast<float>(actual[i]), error) &&
  64. result;
  65. }
  66. return result;
  67. }
  68. }
  69. void finalize();
  70. }
  71. #define CORE_TEST_EQUAL(wanted, actual) \
  72. Core::Test::Internal::checkEqual<Core::RemoveReference<decltype(actual)>>( \
  73. __FILE__, __LINE__, wanted, actual)
  74. #define CORE_TEST_STRING(wanted, actual) \
  75. Core::Test::Internal::checkString(__FILE__, __LINE__, wanted, actual);
  76. #define CORE_TEST_FALSE(actual) CORE_TEST_EQUAL(false, actual);
  77. #define CORE_TEST_TRUE(actual) CORE_TEST_EQUAL(true, actual);
  78. #define CORE_TEST_NULL(actual) CORE_TEST_EQUAL(true, actual == nullptr);
  79. #define CORE_TEST_NOT_NULL(actual) CORE_TEST_EQUAL(true, actual != nullptr);
  80. #define CORE_TEST_FLOAT(wanted, actual, error) \
  81. Core::Test::Internal::checkFloat(__FILE__, __LINE__, wanted, actual, error);
  82. #define CORE_TEST_VECTOR(wanted, actual) \
  83. Core::Test::Internal::checkVector(__FILE__, __LINE__, wanted, actual, \
  84. 0.0001f);
  85. #endif