|
|
@@ -27,6 +27,7 @@
|
|
|
#include "cmGlobalGenerator.h"
|
|
|
#include "cmLocalGenerator.h"
|
|
|
#include "cmCommand.h"
|
|
|
+#include "cmSystemTools.h"
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
#include <math.h>
|
|
|
@@ -168,6 +169,46 @@ bool cmCTestAddTestCommand::InitialPass(std::vector<std::string> const& args)
|
|
|
return m_TestHandler->AddTest(args);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------
|
|
|
+class cmCTestSetTestsPropertiesCommand : public cmCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ /**
|
|
|
+ * This is a virtual constructor for the command.
|
|
|
+ */
|
|
|
+ virtual cmCommand* Clone()
|
|
|
+ {
|
|
|
+ cmCTestSetTestsPropertiesCommand* c = new cmCTestSetTestsPropertiesCommand;
|
|
|
+ c->m_TestHandler = m_TestHandler;
|
|
|
+ return c;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * This is called when the command is first encountered in
|
|
|
+ * the CMakeLists.txt file.
|
|
|
+ */
|
|
|
+ virtual bool InitialPass(std::vector<std::string> const&);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The name of the command as specified in CMakeList.txt.
|
|
|
+ */
|
|
|
+ virtual const char* GetName() { return "SET_TESTS_PROPERTIES";}
|
|
|
+
|
|
|
+ // Unused methods
|
|
|
+ virtual const char* GetTerseDocumentation() { return ""; }
|
|
|
+ virtual const char* GetFullDocumentation() { return ""; }
|
|
|
+
|
|
|
+ cmTypeMacro(cmCTestSetTestsPropertiesCommand, cmCommand);
|
|
|
+
|
|
|
+ cmCTestTestHandler* m_TestHandler;
|
|
|
+};
|
|
|
+
|
|
|
+//----------------------------------------------------------------------
|
|
|
+bool cmCTestSetTestsPropertiesCommand::InitialPass(std::vector<std::string> const& args)
|
|
|
+{
|
|
|
+ return m_TestHandler->SetTestsProperties(args);
|
|
|
+}
|
|
|
+
|
|
|
//----------------------------------------------------------------------
|
|
|
// Try to find an executable, if found fullPath will be set to the full path
|
|
|
// of where it was found. The directory and filename to search for are passed
|
|
|
@@ -700,9 +741,18 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
|
|
|
{
|
|
|
if (res == cmsysProcess_State_Exited && retVal == 0)
|
|
|
{
|
|
|
- cmCTestLog(m_CTest, HANDLER_OUTPUT, " Passed" << std::endl);
|
|
|
+ cmCTestLog(m_CTest, HANDLER_OUTPUT, " Passed");
|
|
|
passed.push_back(testname);
|
|
|
- cres.m_Status = cmCTestTestHandler::COMPLETED;
|
|
|
+ if ( it->m_WillFail )
|
|
|
+ {
|
|
|
+ cmCTestLog(m_CTest, HANDLER_OUTPUT, " - But it should fail!");
|
|
|
+ cres.m_Status = cmCTestTestHandler::FAILED;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cres.m_Status = cmCTestTestHandler::COMPLETED;
|
|
|
+ }
|
|
|
+ cmCTestLog(m_CTest, HANDLER_OUTPUT, std::endl);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -746,7 +796,13 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- cmCTestLog(m_CTest, HANDLER_OUTPUT, "***Failed" << std::endl);
|
|
|
+ cmCTestLog(m_CTest, HANDLER_OUTPUT, "***Failed");
|
|
|
+ if ( it->m_WillFail )
|
|
|
+ {
|
|
|
+ cres.m_Status = cmCTestTestHandler::COMPLETED;
|
|
|
+ cmCTestLog(m_CTest, HANDLER_OUTPUT, " - supposed to fail");
|
|
|
+ }
|
|
|
+ cmCTestLog(m_CTest, HANDLER_OUTPUT, std::endl);
|
|
|
}
|
|
|
failed.push_back(testname);
|
|
|
}
|
|
|
@@ -1013,6 +1069,11 @@ void cmCTestTestHandler::GetListOfTests()
|
|
|
newCom2->m_TestHandler = this;
|
|
|
cm.AddCommand(newCom2);
|
|
|
|
|
|
+ // Add handler for SET_SOURCE_FILES_PROPERTIES
|
|
|
+ cmCTestSetTestsPropertiesCommand* newCom3 = new cmCTestSetTestsPropertiesCommand;
|
|
|
+ newCom3->m_TestHandler = this;
|
|
|
+ cm.AddCommand(newCom3);
|
|
|
+
|
|
|
const char* testFilename;
|
|
|
if( cmSystemTools::FileExists("CTestTestfile.cmake") )
|
|
|
{
|
|
|
@@ -1401,6 +1462,54 @@ bool cmCTestTestHandler::CleanTestOutput(std::string& output, size_t remove_thre
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------
|
|
|
+bool cmCTestTestHandler::SetTestsProperties(const std::vector<std::string>& args)
|
|
|
+{
|
|
|
+ std::vector<std::string>::const_iterator it;
|
|
|
+ std::vector<cmStdString> tests;
|
|
|
+ bool found = false;
|
|
|
+ for ( it = args.begin(); it != args.end(); ++ it )
|
|
|
+ {
|
|
|
+ if ( *it == "PROPERTIES" )
|
|
|
+ {
|
|
|
+ found = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ tests.push_back(*it);
|
|
|
+ }
|
|
|
+ if ( !found )
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ ++ it; // skip PROPERTIES
|
|
|
+ for ( ; it != args.end(); ++ it )
|
|
|
+ {
|
|
|
+ std::string key = *it;
|
|
|
+ ++ it;
|
|
|
+ if ( it == args.end() )
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ std::string val = *it;
|
|
|
+ std::vector<cmStdString>::const_iterator tit;
|
|
|
+ for ( tit = tests.begin(); tit != tests.end(); ++ tit )
|
|
|
+ {
|
|
|
+ tm_ListOfTests::iterator rtit;
|
|
|
+ for ( rtit = m_TestList.begin(); rtit != m_TestList.end(); ++ rtit )
|
|
|
+ {
|
|
|
+ if ( *tit == rtit->m_Name )
|
|
|
+ {
|
|
|
+ if ( key == "WILL_FAIL" )
|
|
|
+ {
|
|
|
+ rtit->m_WillFail = cmSystemTools::IsOn(val.c_str());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
//----------------------------------------------------------------------
|
|
|
bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
|
|
|
{
|
|
|
@@ -1455,6 +1564,7 @@ bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
|
|
|
test.m_Args = args;
|
|
|
test.m_Directory = cmSystemTools::GetCurrentWorkingDirectory();
|
|
|
test.m_IsInBasedOnREOptions = true;
|
|
|
+ test.m_WillFail = false;
|
|
|
if (this->m_UseIncludeRegExp && !m_IncludeTestsRegularExpression.find(testname.c_str()))
|
|
|
{
|
|
|
test.m_IsInBasedOnREOptions = false;
|