Files
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

268 lines
6.0 KiB
C++

//
// qa/rageqa.cpp
//
// Copyright (C) 1999-2006 Rockstar Games. All Rights Reserved.
//
#include "file/asset.h"
#include "system/main.h"
#include "system/param.h"
#include "system/timemgr.h"
#include "qa/item.h"
#include "qa/result.h"
#include "qa/resultmanager.h"
#include "diag/output.h"
#include "diag/xmllog.h"
#if __QA
#ifdef QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
#include "sample_grcore/sample_grcore.h"
#endif
using namespace rage;
bool IsFastCheck();
bool ShallShowErrors();
bool OutputXMLLog();
#ifdef QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
class qaSampleManager : public ragesamples::grcSampleManager
{
public:
qaSampleManager();
virtual ~qaSampleManager();
void SetItem(rage::qaItem* item);
virtual void DrawClient();
private:
rage::qaItem* m_Item;
};
qaSampleManager::qaSampleManager()
{
Init();
}
qaSampleManager::~qaSampleManager()
{
Shutdown();
}
void qaSampleManager::SetItem(rage::qaItem* item)
{
m_Item = item;
}
void qaSampleManager::DrawClient()
{
m_Item->Draw();
}
#endif // QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
// We need to redefine all the stuff defined in qa/qa.h, so undefine it here
#ifdef QA_ITEM_FAMILY
#undef QA_ITEM_FAMILY
#endif // QA_ITEM_FAMILY
#ifdef QA_ITEM
#undef QA_ITEM
#endif // QA_ITEM
#ifdef QA_ITEM_DRAW
#undef QA_ITEM_DRAW
#endif // QA_ITEM_DRAW
#ifdef QA_ITEM_FAST
#undef QA_ITEM_FAST
#endif // QA_ITEM_FAST
#define QA_ITEM_FAMILY(NAME, PARAMS, PARAMNAMES) \
class NAME; \
rage::qaItem* Create##NAME PARAMS;
#ifdef QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
#define QA_ITEM_BASE(NAME, PARAMS, REPORTTYPE,ONLYFAST) \
if ((!testName || stricmp(testName, #NAME) == 0 ) && ( ONLYFAST || !IsFastCheck() )) \
{ \
if (!OutputXMLLog()) QALog( "\n---\n%s%s %s\n---\n", #NAME, #PARAMS, #REPORTTYPE );\
currentQaResult.Reset(); \
currentQaResult.SetReportType(REPORTTYPE); \
currentQaResult.SetName(#NAME, #PARAMS); \
{ \
rage::sysTimer timer; \
rage::qaItem* item = Create##NAME PARAMS; \
\
if (sampleManager) \
{ \
sampleManager->SetItem(item); \
} \
currentQaResult.SetInitTime(timer.GetTime()); \
\
while (currentQaResult.GetCondition() == rage::qaResult::INCOMPLETE) \
{ \
timer.Reset();\
item->Update(currentQaResult); \
currentQaResult.TestTime(timer.GetTime());\
\
if (sampleManager) \
{ \
sampleManager->Update(); \
sampleManager->Draw(); \
} \
} \
\
timer.Reset(); \
item->Shutdown(); \
currentQaResult.SetShutdownTime(timer.GetTime()); \
\
currentQaResult.Display( ShallShowErrors(), OutputXMLLog() ); \
currentQaResult.Report(resultManager); \
delete item; \
} \
delete sampleManager; \
sampleManager = NULL; \
}
#else // QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
#define QA_ITEM_BASE(NAME, PARAMS, REPORTTYPE,ONLYFAST) \
if ((!testName || stricmp(testName, #NAME) == 0 ) && ( ONLYFAST || !IsFastCheck() )) \
{ \
QALog( "\n---\n%s%s %s\n---\n", #NAME, #PARAMS, #REPORTTYPE );\
currentQaResult.Reset(); \
currentQaResult.SetReportType(REPORTTYPE); \
currentQaResult.SetName(#NAME, #PARAMS); \
{ \
rage::sysTimer timer; \
rage::qaItem* item = Create##NAME PARAMS; \
\
currentQaResult.SetInitTime(timer.GetTime()); \
\
while (currentQaResult.GetCondition() == rage::qaResult::INCOMPLETE) \
{ \
timer.Reset();\
item->Update(currentQaResult); \
currentQaResult.TestTime(timer.GetTime());\
} \
\
timer.Reset(); \
item->Shutdown(); \
currentQaResult.SetShutdownTime(timer.GetTime()); \
\
currentQaResult.Display( ShallShowErrors() ); \
currentQaResult.Report(resultManager); \
delete item; \
} \
}
#endif // QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
#define QA_ITEM(NAME, PARAMS, REPORTTYPE) QA_ITEM_BASE( NAME, PARAMS, REPORTTYPE, false )
#define QA_ITEM_FAST(NAME, PARAMS, REPORTTYPE) QA_ITEM_BASE( NAME, PARAMS, REPORTTYPE, true )
PARAM(qadraw, "[rageqa] Draw drawable qa items");
#ifdef QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
#define QA_ITEM_DRAW(NAME, PARAMS, REPORTTYPE) \
if (PARAM_qadraw.Get()) \
{ \
sampleManager = rage_new qaSampleManager; \
} \
;QA_ITEM(NAME, PARAMS, REPORTTYPE) // Notice the semicolon at the beginning of the line, that keeps grep from finding this line
#else
#define QA_ITEM_DRAW(NAME, PARAMS, REPORTTYPE)
#endif
PARAM(runname, "[rageqa] The name to apply to the current run in the log file (defaults to the RAGE release number).");
PARAM(testname, "[rageqa] Only run the test specified in this parameter.");
PARAM(resultsfile, "[rageqa] The location of the file to put the results in (defaulting to qaresults).");
PARAM(fastonly, "[rageqa] will only run fast tests allowing for fast tests locally and more stringent tests offline");
PARAM(xmlformat, "[rageqa] saves results in xml format");
PARAM(showerrors, "[rageqa] outputs fails as errors ");
PARAM(xmllog, "[rageqa] outputs in xml log");
bool IsFastCheck()
{
return PARAM_fastonly.Get();
}
bool ShallShowErrors()
{
return PARAM_showerrors.Get();
}
bool OutputXMLLog()
{
return PARAM_xmllog.Get();
}
int Main()
{
rage::qaResult currentQaResult;
#ifdef QA_ITEMS_DEPEND_ON_SAMPLE_GRCORE
qaSampleManager* sampleManager = NULL;
#endif
rage::qaResultManager resultManager;
const char* resultsFilename = "..\\..\\..\\qa\\qaresults";
PARAM_resultsfile.Get(resultsFilename);
if ( !PARAM_xmlformat.Get() )
{
resultManager.Load(resultsFilename);
}
if ( ShallShowErrors() )
{
diagOutput::UseVSFormatOutput();
}
resultManager.SetRunName(RAGE_RELEASE_STRING);
const char* runName = 0;
if (PARAM_runname.Get(runName))
{
resultManager.SetRunName(runName);
}
const char* testName = NULL;
PARAM_testname.Get(testName);
rage::sysTimer timer;
if ( OutputXMLLog() )
{
XmlStdLog().GroupStart("TestResults");
if ( runName )
{
XmlStdLog().Write("RunName",runName);
}
}
#include "qaitems.h"
ASSET.SetPath("");
if ( OutputXMLLog() )
{
XmlStdLog().Write( "TotalTime", timer.GetTime() );
XmlStdLog().GroupEnd("TestResults");
return 0;
}
if ( PARAM_xmlformat.Get() )
{
resultManager.SaveXML(resultsFilename);
}
else
{
resultManager.Save(resultsFilename);
}
return 0;
}
#else // __QA
int Main()
{
return 0;
}
#endif // __QA