ENH: add the ability to process command line arguments in the test driver before the test driver gets them
This commit is contained in:
parent
04d53a3865
commit
e4dce08591
@ -30,6 +30,38 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||||||
cmSystemTools::ExpandListArguments(argsIn, args);
|
cmSystemTools::ExpandListArguments(argsIn, args);
|
||||||
|
|
||||||
std::vector<std::string>::iterator i = args.begin();
|
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
|
// Name of the source list
|
||||||
|
|
||||||
@ -59,8 +91,13 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||||||
fout <<
|
fout <<
|
||||||
"#include <ctype.h>\n"
|
"#include <ctype.h>\n"
|
||||||
"#include <stdio.h>\n"
|
"#include <stdio.h>\n"
|
||||||
"#include <string.h>\n"
|
"#include <string.h>\n";
|
||||||
|
if(extraInclude.size())
|
||||||
|
{
|
||||||
|
fout << "#include \"" << extraInclude << "\"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
fout <<
|
||||||
"\n"
|
"\n"
|
||||||
"// Forward declare test functions\n"
|
"// Forward declare test functions\n"
|
||||||
"\n";
|
"\n";
|
||||||
@ -75,8 +112,12 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||||||
// For the moment:
|
// For the moment:
|
||||||
// - replace spaces ' ', ':' and '/' with underscores '_'
|
// - 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;
|
std::string func_name = *i;
|
||||||
cmSystemTools::ConvertToUnixSlashes(func_name);
|
cmSystemTools::ConvertToUnixSlashes(func_name);
|
||||||
cmSystemTools::ReplaceString(func_name, " ", "_");
|
cmSystemTools::ReplaceString(func_name, " ", "_");
|
||||||
@ -101,7 +142,7 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||||||
|
|
||||||
int numTests = 0;
|
int numTests = 0;
|
||||||
std::vector<std::string>::iterator j;
|
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 <<
|
fout <<
|
||||||
" {\n"
|
" {\n"
|
||||||
@ -138,7 +179,14 @@ bool cmCreateTestSourceList::InitialPass(std::vector<std::string> const& argsIn)
|
|||||||
" int NumTests = " << numTests << ";\n"
|
" int NumTests = " << numTests << ";\n"
|
||||||
" int i;\n"
|
" int i;\n"
|
||||||
" \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"
|
" if (ac < 2)\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" // If there is only one test, then run it with the arguments\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);
|
false);
|
||||||
m_Makefile->AddSource(cfile, sourceList);
|
m_Makefile->AddSource(cfile, sourceList);
|
||||||
|
|
||||||
for(i = testsBegin; i != args.end(); ++i)
|
for(i = testsBegin; i != tests.end(); ++i)
|
||||||
{
|
{
|
||||||
cmSourceFile cfile;
|
cmSourceFile cfile;
|
||||||
cfile.SetIsAnAbstractClass(false);
|
cfile.SetIsAnAbstractClass(false);
|
||||||
|
@ -67,13 +67,16 @@ public:
|
|||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
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"
|
"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"
|
"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 "
|
"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 "
|
"; 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();) "
|
"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);
|
cmTypeMacro(cmCreateTestSourceList, cmCommand);
|
||||||
|
@ -2,12 +2,13 @@ PROJECT(TestDriverTest)
|
|||||||
|
|
||||||
SET(Extra_SRCS testExtraStuff.cxx testExtraStuff2.cxx )
|
SET(Extra_SRCS testExtraStuff.cxx testExtraStuff2.cxx )
|
||||||
SET(Extra_SRCS ${Extra_SRCS};testExtraStuff3.cxx )
|
SET(Extra_SRCS ${Extra_SRCS};testExtraStuff3.cxx )
|
||||||
|
INCLUDE_DIRECTORIES(${TestDriverTest_SOURCE_DIR})
|
||||||
CREATE_TEST_SOURCELIST(testSrcs
|
CREATE_TEST_SOURCELIST(testSrcs
|
||||||
TestDriverTest
|
TestDriverTest
|
||||||
test1
|
test1
|
||||||
test2
|
test2
|
||||||
subdir/test3)
|
subdir/test3
|
||||||
|
EXTRA_INCLUDE testArgs.h FUNCTION testProccessArgs)
|
||||||
|
|
||||||
ADD_EXECUTABLE(TestDriverTest testSrcs ${Extra_SRCS})
|
ADD_EXECUTABLE(TestDriverTest testSrcs ${Extra_SRCS})
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user