#include <iostream>
#include <queue>
#include <chrono>
using namespace std::chrono;
namespace cxxtest
{
//A Base Timer
class TimerBase
{
public:
TimerBase() : m_start(system_clock::time_point::min()) {}
void Clear()
{
m_start = system_clock::time_point::min();
}
void Start()
{
m_start = system_clock::now();
}
bool IsStarted() const
{
return (m_start.time_since_epoch() != system_clock::duration(0));
}
unsigned long GetMs()
{
if (IsStarted()) {
system_clock::duration diff;
diff = system_clock::now() - m_start;
return (unsigned)(duration_cast<milliseconds>(diff).count());
}
return 0;
}
private:
system_clock::time_point m_start;
};
class TimeBaseTest
{
public:
virtual void Run()=0;
virtual ~TimeBaseTest() {}
static TimerBase m_timer;
virtual std::string GetName()=0;
};
TimerBase TimeBaseTest::m_timer;
std::queue<TimeBaseTest *> m_test_cases;
}
#define TEST_CLASS(TEST_CASE_NAME) \
class TEST_CLASS_##TEST_CASE_NAME : public cxxtest::TimeBaseTest {\
public:\
TEST_CLASS_##TEST_CASE_NAME()\
{\
cxxtest::m_test_cases.push(this);\
}\
void Run();\
std::string GetName() {return m_case_name;}\
static std::string m_case_name;\
};\
/* TEST_CLASS_INSTANCE
* 1.delcare the test class TEST_CLASS_test_case_name
* 2.get a instance of the class
* 3.define the Run() for the class
* */
#define TEST_CLASS_INSTANCE(TEST_CASE_NAME) \
TEST_CLASS(TEST_CASE_NAME);\
std::string TEST_CLASS_##TEST_CASE_NAME::m_case_name=#TEST_CASE_NAME;\
auto TEST_CASE_NAME##_instance = new TEST_CLASS_##TEST_CASE_NAME;\
void TEST_CLASS_##TEST_CASE_NAME::Run()
#define TimeTEST(TEST_CASE_NAME) TEST_CLASS_INSTANCE(TEST_CASE_NAME)
#define RunAllTimeTest(); \
while(!cxxtest::m_test_cases.empty())\
{\
auto i = cxxtest::m_test_cases.front();\
cxxtest::m_test_cases.pop();\
std::cout << "\033[1;32:42m[ RUN ] : " << i->GetName() << "\033[0m" << std::endl;\
i->m_timer.Start();\
i->Run();\
std::cout << "\033[1;31:42m[ FINISH,USE TIME : "<< i->m_timer.GetMs() <<"ms]\033[0m\n" << std::endl;\
i->m_timer.Clear();\
delete i;\
}\
int main()
{
RunAllTimeTest();
return 0;
}