originals-tz
11/10/2019 - 9:17 AM

TimeTest

#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;
}