summaryrefslogtreecommitdiff
path: root/Source/cmTestGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-03-16 10:40:46 -0400
committerBrad King <brad.king@kitware.com>2009-03-16 10:40:46 -0400
commit66d69f864ae880f556debf02e66dee4855b0f2df (patch)
tree562a710c7c071a8dbfd83a15abd35e3a62ec4681 /Source/cmTestGenerator.cxx
parente67f5138b80b3b04844f3f5c0a3c69796266f9e6 (diff)
downloadcmake-66d69f864ae880f556debf02e66dee4855b0f2df.tar.gz
ENH: Refactor generation of CTestTestfile content
This moves code which generates ADD_TEST and SET_TESTS_PROPERTIES calls into CTestTestfile.cmake files out of cmLocalGenerator and into a cmTestGenerator class. This will allow more advanced generation without cluttering cmLocalGenerator. The cmTestGenerator class derives from cmScriptGenerator to get support for per-configuration script generation (not yet enabled).
Diffstat (limited to 'Source/cmTestGenerator.cxx')
-rw-r--r--Source/cmTestGenerator.cxx126
1 files changed, 126 insertions, 0 deletions
diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx
new file mode 100644
index 0000000000..75865a2c6c
--- /dev/null
+++ b/Source/cmTestGenerator.cxx
@@ -0,0 +1,126 @@
+/*=========================================================================
+
+ Program: CMake - Cross-Platform Makefile Generator
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
+ See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmTestGenerator.h"
+
+#include "cmTest.h"
+
+//----------------------------------------------------------------------------
+cmTestGenerator
+::cmTestGenerator(cmTest* test,
+ std::vector<std::string> const& configurations):
+ cmScriptGenerator("CTEST_CONFIGURATION_TYPE", configurations),
+ Test(test)
+{
+ this->ActionsPerConfig = false;
+ this->TestGenerated = false;
+}
+
+//----------------------------------------------------------------------------
+cmTestGenerator
+::~cmTestGenerator()
+{
+}
+
+//----------------------------------------------------------------------------
+void cmTestGenerator::GenerateScriptConfigs(std::ostream& os,
+ Indent const& indent)
+{
+ // First create the tests.
+ this->cmScriptGenerator::GenerateScriptConfigs(os, indent);
+
+ // Now generate the test properties.
+ if(this->TestGenerated)
+ {
+ cmTest* test = this->Test;
+ std::ostream& fout = os;
+ cmPropertyMap::const_iterator pit;
+ cmPropertyMap* mpit = &test->GetProperties();
+ if ( mpit->size() )
+ {
+ fout << "SET_TESTS_PROPERTIES(" << test->GetName() << " PROPERTIES ";
+ for ( pit = mpit->begin(); pit != mpit->end(); ++ pit )
+ {
+ fout << " " << pit->first.c_str() << " \"";
+ const char* value = pit->second.GetValue();
+ for ( ; *value; ++ value )
+ {
+ switch ( *value )
+ {
+ case '\\':
+ case '"':
+ case ' ':
+ case '#':
+ case '(':
+ case ')':
+ case '$':
+ case '^':
+ fout << "\\" << *value;
+ break;
+ case '\t':
+ fout << "\\t";
+ break;
+ case '\n':
+ fout << "\\n";
+ break;
+ case '\r':
+ fout << "\\r";
+ break;
+ default:
+ fout << *value;
+ }
+ }
+ fout << "\"";
+ }
+ fout << ")" << std::endl;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+void cmTestGenerator::GenerateScriptActions(std::ostream& fout,
+ Indent const& indent)
+{
+ this->TestGenerated = true;
+
+ cmTest* test = this->Test;
+ fout << indent;
+ fout << "ADD_TEST(";
+ fout << test->GetName() << " \"" << test->GetCommand() << "\"";
+
+ std::vector<cmStdString>::const_iterator argit;
+ for (argit = test->GetArguments().begin();
+ argit != test->GetArguments().end(); ++argit)
+ {
+ // Just double-quote all arguments so they are re-parsed
+ // correctly by the test system.
+ fout << " \"";
+ for(std::string::const_iterator c = argit->begin();
+ c != argit->end(); ++c)
+ {
+ // Escape quotes within arguments. We should escape
+ // backslashes too but we cannot because it makes the result
+ // inconsistent with previous behavior of this command.
+ if((*c == '"'))
+ {
+ fout << '\\';
+ }
+ fout << *c;
+ }
+ fout << "\"";
+ }
+ fout << ")" << std::endl;
+}