Test.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "Test.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "core/utils/Logger.h"
  6. typedef struct {
  7. char* file;
  8. int tests;
  9. int successTests;
  10. } Result;
  11. static Result* results = nullptr;
  12. static size_t resultsIndex = 0;
  13. static size_t resultsCapacity = 0;
  14. static Result* getResult(const char* file) {
  15. for(size_t i = 0; i < resultsIndex; i++) {
  16. Result* r = results + i;
  17. if(strcmp(r->file, file) == 0) {
  18. return r;
  19. }
  20. }
  21. while(resultsIndex >= resultsCapacity) {
  22. size_t newCapacity = resultsCapacity == 0 ? 8 : resultsCapacity * 2;
  23. results = realloc(results, newCapacity);
  24. if(results == nullptr) {
  25. printf("realloc failure in '%s' at '%d'\n", __FILE__, __LINE__);
  26. exit(1);
  27. }
  28. resultsCapacity = newCapacity;
  29. }
  30. Result* r = results + (resultsIndex++);
  31. r->file = strdup(file);
  32. r->successTests = 0;
  33. r->tests = 0;
  34. return r;
  35. }
  36. void coreFinalizeTests(void) {
  37. for(size_t i = 0; i < resultsIndex; i++) {
  38. Result* r = results + i;
  39. bool c = r->successTests == r->tests;
  40. fputs(c ? CORE_TERMINAL_GREEN : CORE_TERMINAL_RED, stdout);
  41. printf("%s - %d / %d tests succeeded", r->file, r->successTests,
  42. r->tests);
  43. puts(CORE_TERMINAL_RESET);
  44. free(r->file);
  45. }
  46. free(results);
  47. results = nullptr;
  48. resultsIndex = 0;
  49. resultsCapacity = 0;
  50. }
  51. static bool addToResult(const char* file, bool comparison) {
  52. Result* r = getResult(file);
  53. r->tests++;
  54. if(comparison) {
  55. r->successTests++;
  56. return true;
  57. }
  58. return false;
  59. }
  60. #define CORE_TEST_SUCCESS(result) \
  61. file = coreGetShortFileName(file); \
  62. if(addToResult(file, result)) { \
  63. return true; \
  64. }
  65. #define CORE_TEST_NAMED_COMPARE(name, type, format) \
  66. bool coreTest##name(CORE_TEST_ARGS, type wanted, type actual) { \
  67. CORE_TEST_SUCCESS(wanted == actual) \
  68. fputs(CORE_TERMINAL_RED, stdout); \
  69. printf("%s:%d - expected '" format "' got '" format "'", file, line, \
  70. wanted, actual); \
  71. puts(CORE_TERMINAL_RESET); \
  72. return false; \
  73. }
  74. CORE_TEST_NAMED_COMPARE(Int, int, "%d")
  75. CORE_TEST_NAMED_COMPARE(Bool, bool, "%d")
  76. bool coreTestString(CORE_TEST_ARGS, const char* wanted, const char* actual) {
  77. CORE_TEST_SUCCESS(strcmp(wanted, actual) == 0);
  78. fputs(CORE_TERMINAL_RED, stdout);
  79. printf("%s:%d - expected '%s' got '%s'", file, line, wanted, actual);
  80. puts(CORE_TERMINAL_RESET);
  81. return false;
  82. }
  83. bool coreTestFloat(CORE_TEST_ARGS, float wanted, float actual, float error) {
  84. float diff = wanted - actual;
  85. diff = diff < 0.0f ? -diff : diff;
  86. CORE_TEST_SUCCESS(diff <= error);
  87. fputs(CORE_TERMINAL_RED, stdout);
  88. printf("%s:%d - expected '%.3f' got '%.3f'", file, line, (double)wanted,
  89. (double)actual);
  90. puts(CORE_TERMINAL_RESET);
  91. return false;
  92. }
  93. bool coreTestNull(CORE_TEST_ARGS, const void* actual) {
  94. CORE_TEST_SUCCESS(actual == nullptr);
  95. fputs(CORE_TERMINAL_RED, stdout);
  96. printf("%s:%d - expected null", file, line);
  97. puts(CORE_TERMINAL_RESET);
  98. return false;
  99. }
  100. bool coreTestNotNull(CORE_TEST_ARGS, const void* actual) {
  101. CORE_TEST_SUCCESS(actual != nullptr);
  102. fputs(CORE_TERMINAL_RED, stdout);
  103. printf("%s:%d - expected valid pointer", file, line);
  104. puts(CORE_TERMINAL_RESET);
  105. return false;
  106. }