test_framework.hpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #pragma once
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. #include <functional>
  6. #include <stdexcept>
  7. #define ASSERT_EQ(expected, actual) \
  8. do { \
  9. auto e = (expected); \
  10. auto a = (actual); \
  11. if (e != a) { \
  12. std::cerr << "Assertion failed: " << #expected << " == " << #actual << "\n" \
  13. << " Expected: " << e << "\n" \
  14. << " Actual: " << a << "\n" \
  15. << " File: " << __FILE__ << ":" << __LINE__ << "\n"; \
  16. throw std::runtime_error("Assertion failed"); \
  17. } \
  18. } while (0)
  19. #define ASSERT_TRUE(condition) \
  20. do { \
  21. if (!(condition)) { \
  22. std::cerr << "Assertion failed: " << #condition << "\n" \
  23. << " File: " << __FILE__ << ":" << __LINE__ << "\n"; \
  24. throw std::runtime_error("Assertion failed"); \
  25. } \
  26. } while (0)
  27. class TestRunner {
  28. public:
  29. static TestRunner& instance() {
  30. static TestRunner instance;
  31. return instance;
  32. }
  33. void register_test(const std::string& name, std::function<void()> test) {
  34. tests_.push_back({name, test});
  35. }
  36. int run_all() {
  37. int passed = 0;
  38. int failed = 0;
  39. std::cout << "Running " << tests_.size() << " tests...\n";
  40. for (const auto& [name, test] : tests_) {
  41. try {
  42. test();
  43. std::cout << "[PASS] " << name << "\n";
  44. passed++;
  45. } catch (const std::exception& e) {
  46. std::cout << "[FAIL] " << name << ": " << e.what() << "\n";
  47. failed++;
  48. } catch (...) {
  49. std::cout << "[FAIL] " << name << ": Unknown error\n";
  50. failed++;
  51. }
  52. }
  53. std::cout << "\nResults: " << passed << " passed, " << failed << " failed.\n";
  54. return failed > 0 ? 1 : 0;
  55. }
  56. private:
  57. std::vector<std::pair<std::string, std::function<void()>>> tests_;
  58. };
  59. struct AutoRegister {
  60. AutoRegister(const std::string& name, std::function<void()> test) {
  61. TestRunner::instance().register_test(name, test);
  62. }
  63. };
  64. #define TEST(name) \
  65. void test_##name(); \
  66. AutoRegister reg_##name(#name, test_##name); \
  67. void test_##name()