ENH: add the ability to process command line arguments in the test driver before the test driver gets them

This commit is contained in:
Bill Hoffman 2002-04-04 16:53:37 -05:00
parent 04d53a3865
commit e4dce08591
3 changed files with 63 additions and 11 deletions

View File

@ -30,7 +30,39 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
cmSystemTools::ExpandListArguments(argsIn, args);
std::vector<std::string>::iterator i = args.begin();
std::string extraInclude;
std::string function;
std::vector<std::string> tests;
// extract extra include and function ot
for(; i != args.end(); i++)
{
if(*i == "EXTRA_INCLUDE")
{
++i;
if(i == args.end())
{
this->SetError("incorrect arguments to EXTRA_INCLUDE");
return false;
}
extraInclude = *i;
}
else if(*i == "FUNCTION")
{
++i;
if(i == args.end())
{
this->SetError("incorrect arguments to FUNCTION");
return false;
}
function = *i;
}
else
{
tests.push_back(*i);
}
}
i = tests.begin();
// Name of the source list
const char* sourceList = i->c_str();
@ -59,8 +91,13 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
fout <<
"#include <ctype.h>\n"
"#include <stdio.h>\n"
"#include <string.h>\n"
"#include <string.h>\n";
if(extraInclude.size())
{
fout << "#include \"" << extraInclude << "\"\n";
}
fout <<
"\n"
"// Forward declare test functions\n"
"\n";
@ -75,8 +112,12 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
// For the moment:
// - replace spaces ' ', ':' and '/' with underscores '_'
for(i = testsBegin; i != args.end(); ++i)
for(i = testsBegin; i != tests.end(); ++i)
{
if(*i == "EXTRA_INCLUDE")
{
break;
}
std::string func_name = *i;
cmSystemTools::ConvertToUnixSlashes(func_name);
cmSystemTools::ReplaceString(func_name, " ", "_");
@ -101,7 +142,7 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
int numTests = 0;
std::vector<std::string>::iterator j;
for(i = testsBegin, j = tests_func_name.begin(); i != args.end(); ++i, ++j)
for(i = testsBegin, j = tests_func_name.begin(); i != tests.end(); ++i, ++j)
{
fout <<
" {\n"
@ -138,7 +179,14 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
" int NumTests = " << numTests << ";\n"
" int i;\n"
" \n"
" // If no test name was given\n"
" // If no test name was given\n";
if(function.size())
{
fout << " // process command line with user function\n"
<< " " << function << "(&ac, &av);\n";
}
fout <<
" if (ac < 2)\n"
" {\n"
" // If there is only one test, then run it with the arguments\n"
@ -218,7 +266,7 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
false);
m_Makefile->AddSource(cfile, sourceList);
for(i = testsBegin; i != args.end(); ++i)
for(i = testsBegin; i != tests.end(); ++i)
{
cmSourceFile cfile;
cfile.SetIsAnAbstractClass(false);

View File

@ -67,13 +67,16 @@ public:
virtual const char* GetFullDocumentation()
{
return
"CREATE_TEST_SOURCELIST(SourceListName DriverName test1 test2 test3"
"CREATE_TEST_SOURCELIST(SourceListName DriverName test1 test2 test3 EXTRA_INCLUDE include.h FUNCTION function)"
"The list of source files needed to build the testdriver will be in SourceListName.\n"
"DriverName.cxx is the name of the test driver program.\n"
"The rest of the arguments consist of a list of test source files, can be "
"; separated. Each test source file should have a function in it that "
"is the same name as the file with no extension (foo.cxx should have int foo();) "
"DriverName.cxx will be able to call each of the tests by name on the command line.";
"DriverName.cxx will be able to call each of the tests by name on the command line. "
"If EXTRA_INCLUDE is specified, then the next argument is included into the generated file. "
"If FUNCTION is specified, then the next argument is taken as a function name that is passed "
"a pointer to ac and av. This can be used to add extra command line processing to each test. ";
}
cmTypeMacro(cmCreateTestSourceList, cmCommand);

View File

@ -2,12 +2,13 @@ PROJECT(TestDriverTest)
SET(Extra_SRCS testExtraStuff.cxx testExtraStuff2.cxx )
SET(Extra_SRCS ${Extra_SRCS};testExtraStuff3.cxx )
INCLUDE_DIRECTORIES(${TestDriverTest_SOURCE_DIR})
CREATE_TEST_SOURCELIST(testSrcs
TestDriverTest
test1
test2
subdir/test3)
subdir/test3
EXTRA_INCLUDE testArgs.h FUNCTION testProccessArgs)
ADD_EXECUTABLE(TestDriverTest testSrcs ${Extra_SRCS})