Files
LayaNative2.0/Conch/source/conch/Test/JCTestManager.h
T
2020-11-11 16:17:13 +08:00

144 lines
3.1 KiB
C++

#ifdef _TEST_
#ifndef __TESTMANAGER_H_0115__
#define __TESTMANAGER_H_0115__
#define _RUN_TEST_
#ifdef _RUN_TEST_
#define ADDTESTCASE(func,desc) JCTest gCTest##func(func,desc);
#else
#define ADDTESTCASE()
#endif
#include <string>
#include <vector>
/*
执行测试并且打印结果
*/
class JCTestMgr{
public:
struct JCTestCase{
typedef void (*TESTFUNC)();
TESTFUNC testFunc;
std::string strDesc;
};
struct RunContext{
const char* pszFile;
int nLine;
std::string strDesc;
bool bOK;
RunContext(){
pszFile = NULL;
bOK=false;
nLine = 0;
}
};
static JCTestMgr* getInstance(){
static JCTestMgr gTestMgr;
return &gTestMgr;
}
JCTestMgr(){
m_nTotalNum = 0;
m_nOKNum = 0;
}
void addTestCase(JCTestCase::TESTFUNC func, const char* desc ){
JCTestCase tc = {func, desc};
m_AllTestCases.push_back(tc);
}
void run(const char* pRunTestCase);
void output(const char* szFormat, ...);
void printResult( RunContext& p_RunCtx );
template<class T>
std::string toString(T t);
template<class T>
void verifyEq(T t1, T t2, const char* pDesc, const char* pFile, int pnLine ){
m_nTotalNum++;
m_runCtx.pszFile = pFile;
m_runCtx.nLine = pnLine;
m_runCtx.strDesc = pDesc;
if( t1!=t2 ){
std::string desc = "Error!";
desc += pDesc;
desc = desc+ "。期望值是:"+toString(t2)+",实际是:"+toString(t1)+"\n";
m_runCtx.strDesc=desc;
m_runCtx.bOK = false;
}else{
m_nOKNum++;
m_runCtx.bOK = true;
}
printResult(m_runCtx);
}
template<class T>
void verifyEqRange(T t1, T t2, T range, const char* pDesc, const char* pFile, int pnLine ){
m_nTotalNum++;
m_runCtx.pszFile = pFile;
m_runCtx.nLine = pnLine;
m_runCtx.strDesc = pDesc;
if( (t1-t2)>range ||(t2-t1)>range ){
std::string desc = "Error!";
desc += pDesc;
desc = desc+ "。期望值是范围:"+toString(t2)+"+"+toString(range)+",实际是:"+toString(t1)+"\n";
m_runCtx.strDesc=desc;
m_runCtx.bOK = false;
}else{
m_nOKNum++;
m_runCtx.bOK = true;
}
printResult(m_runCtx);
}
template<class T>
void verifyNEq(T t1, T t2, const char* pDesc, const char* pFile, int pnLine ){
m_nTotalNum++;
m_runCtx.pszFile = pFile;
m_runCtx.nLine = pnLine;
m_runCtx.strDesc = pDesc;
if( t1==t2 ){
std::string desc = "Error!";
desc += pDesc;
desc = desc+ "。期望值是不要等于:"+toString(t2)+",实际是:"+toString(t1)+"\n";
m_runCtx.strDesc=desc;
m_runCtx.bOK = false;
}else{
m_nOKNum++;
m_runCtx.bOK = true;
}
printResult(m_runCtx);
}
protected:
RunContext m_runCtx;
int m_nTotalNum;
int m_nOKNum;
std::vector<JCTestCase> m_AllTestCases;
};
class JCTest{
public:
JCTest( JCTestMgr::JCTestCase::TESTFUNC func, const char* desc){
JCTestMgr::getInstance()->addTestCase(func,desc);
}
};
#define VERIFYEQ(v,s,desc) JCTestMgr::getInstance()->verifyEq(v,s,desc,__FILE__,__LINE__);
#define VERIFYNEQ(v,ns,desc) JCTestMgr::getInstance()->verifyNEq(v,ns,desc,__FILE__,__LINE__);
#define VERIFYEQR(v,s,r,desc) JCTestMgr::getInstance()->verifyEqRange(v,s,r,desc,__FILE__,__LINE__);
void Sleep(int ms);
void WaitUtil(bool* pCond, int timeout);
#endif
#endif