Test.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. template<typename A, typename B>
  38. void checkString(const char* file, int line, const A& wanted,
  39. const B& actual) {
  40. ArrayString<2048> a;
  41. if(a.append(wanted)) {
  42. CORE_LOG_WARNING("too small buffer");
  43. return;
  44. }
  45. ArrayString<2048> b;
  46. if(b.append(actual)) {
  47. CORE_LOG_WARNING("too small buffer");
  48. return;
  49. }
  50. return checkEqual(file, line, a, b);
  51. }
  52. void checkFloat(const char* file, int line, float wanted, float actual,
  53. float error);
  54. }
  55. void finalize();
  56. }
  57. #define CORE_TEST_EQUAL(wanted, actual) \
  58. Core::Test::Internal::checkEqual<Core::RemoveReference<decltype(actual)>>( \
  59. __FILE__, __LINE__, wanted, actual);
  60. #define CORE_TEST_STRING(wanted, actual) \
  61. Core::Test::Internal::checkString(__FILE__, __LINE__, wanted, actual);
  62. #define CORE_TEST_FALSE(actual) CORE_TEST_EQUAL(false, actual);
  63. #define CORE_TEST_TRUE(actual) CORE_TEST_EQUAL(true, actual);
  64. #define CORE_TEST_NULL(actual) CORE_TEST_EQUAL(true, actual == nullptr);
  65. #define CORE_TEST_NOT_NULL(actual) CORE_TEST_EQUAL(true, actual != nullptr);
  66. #define CORE_TEST_FLOAT(wanted, actual, error) \
  67. Core::Test::Internal::checkFloat(__FILE__, __LINE__, wanted, actual, error);
  68. #endif