#pragma once /** * \file Test.h * \brief File containing unit testing utilities */ #include #include namespace td { namespace test { /** * \def TD_TEST_SUCCESSFUL * \brief Used in tests to indicate that a test was successful */ #define TD_TEST_SUCCESSFUL 0 /** * \def TD_TEST_FAILED * \brief Used in tests to indicate that a test failed */ #define TD_TEST_FAILED 1 #ifndef __FUNCTION_NAME__ #ifdef _WIN32 #define __FUNCTION_NAME__ __FUNCTION__ #else #define __FUNCTION_NAME__ __PRETTY_FUNCTION__ #endif #endif /** * \def blitz_test_assert * \param ... The expression to evaluate * \brief Evaluates the expression and exits the program if not valid. * \note It works like a basic assert() but also in release mode */ #define td_test_assert(...) \ if (!static_cast(__VA_ARGS__)) { \ td::test::LogAssert(#__VA_ARGS__, __FILE__, __LINE__, __FUNCTION_NAME__); \ std::exit(TD_TEST_FAILED); \ } /** * \def blitz_debug_assert * \param ... The expression to execute * \brief Assertion without checks in release mode * \note The expression is always executed. However, in release, no checks are made ! */ #ifdef NDEBUG #define td_debug_assert(...) __VA_ARGS__ #else #define td_debug_assert td_test_assert #endif /** * \brief Prints an error message associated with a failed assertion * \param expression The expression that was tested * \param file The file in which the assertion failed * \param line The line in the file in which the assertion failed * \param function The function in which the assertion failed */ void LogAssert(const char* expression, const char* file, int line, const char* function); } // namespace test } // namespace td