From: joncruz Date: Thu, 27 Apr 2006 02:29:29 +0000 (+0000) Subject: Adding multiple test output formats. X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=70fd8f7de4994668eeb9f532d0523266a176e795;p=inkscape.git Adding multiple test output formats. --- diff --git a/ChangeLog b/ChangeLog index 1d436e505..40549d43b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-04-26 Jon A. Cruz + + * src/Makefile.am, src/MultiPrinter.h, src/PylogFormatter.h, + src/TRPIFormatter.h, src/selfname.tpl, src/libnr/Makefile_insert, + src/svg/Makefile_insert, src/xml/Makefile_insert: + Adding multiple test output formats. + 2006-04-23 verbalshadow * path-prefix.h: diff --git a/src/Makefile.am b/src/Makefile.am index 23aa417af..b4fd7a563 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -236,7 +236,7 @@ test-all.cpp: \ $(svg_test_svg_includes) \ $(xml_test_xml_includes) \ $(test_all_includes) - $(top_srcdir)/cxxtest/cxxtestgen.pl --error-printer -root -o test-all.cpp \ + $(top_srcdir)/cxxtest/cxxtestgen.pl --template=selfname.tpl -root -o test-all.cpp \ $(libnr_test_nr_includes) \ $(svg_test_svg_includes) \ $(xml_test_xml_includes) \ diff --git a/src/MultiPrinter.h b/src/MultiPrinter.h new file mode 100644 index 000000000..1792a744f --- /dev/null +++ b/src/MultiPrinter.h @@ -0,0 +1,113 @@ +#ifndef SEEN_MULTI_PRINTER_H +#define SEEN_MULTI_PRINTER_H + + +#include + +#ifndef _CXXTEST_HAVE_STD +# define _CXXTEST_HAVE_STD +#endif // _CXXTEST_HAVE_STD + +#include +#include + +#ifdef _CXXTEST_OLD_STD +# include +# include +# include +#else // !_CXXTEST_OLD_STD +# include +# include +# include +#endif // _CXXTEST_OLD_STD + + +#include +#include "TRPIFormatter.h" +#include "PylogFormatter.h" + +namespace CxxTest { + +class MultiPrinter : public TeeListener +{ +public: + MultiPrinter( const char* baseName = "result" ) : + TeeListener(), + _baseName( baseName ), + _xmlName( _baseName + ".xml" ), + _logName( _baseName + ".log" ), + _xmlFile( _xmlName.c_str(), CXXTEST_STD(ios::out)), + _logFile( _logName.c_str(), CXXTEST_STD(ios::out)), + _dstOne( new FileAdapter( CXXTEST_STD(cout) ) ), + _dstXml( new FileAdapter( _xmlFile ) ), + _dstPylog( new FileAdapter( _logFile ), _baseName.c_str() ) + { + setFirst( _dstOne ); + setSecond( _subTee ); + _subTee.setFirst( _dstXml ); + _subTee.setSecond( _dstPylog ); + } + + virtual ~MultiPrinter() + { + std::cout << "CLOSING OUT TEST" << std::endl; + _xmlFile.close(); + _logFile.close(); + } + + int run() + { + TestRunner::runAllTests( *this ); + return tracker().failedTests(); + } + +protected: + CXXTEST_STD(string) _baseName; + CXXTEST_STD(string) _xmlName; + CXXTEST_STD(string) _logName; + CXXTEST_STD(fstream) _xmlFile; + CXXTEST_STD(fstream) _logFile; + + TeeListener _subTee; + ErrorFormatter _dstOne; + TRPIFormatter _dstXml; + PylogFormatter _dstPylog; + +private: + class FileAdapter : public OutputStream + { + FileAdapter( const FileAdapter & ); + FileAdapter &operator=( const FileAdapter & ); + + CXXTEST_STD(ostream) &_o; + + public: + FileAdapter( CXXTEST_STD(ostream) &o ) : _o(o) {} + void flush() { _o.flush(); } + OutputStream &operator<<( const char *s ) { _o << s; return *this; } + OutputStream &operator<<( Manipulator m ) { return OutputStream::operator<<( m ); } + OutputStream &operator<<( unsigned i ) + { + char s[1 + 3 * sizeof(unsigned)]; + numberToString( i, s ); + _o << s; + return *this; + } + }; + +}; + +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : + +#endif //SEEN_MULTI_PRINTER_H diff --git a/src/PylogFormatter.h b/src/PylogFormatter.h new file mode 100644 index 000000000..521ca612d --- /dev/null +++ b/src/PylogFormatter.h @@ -0,0 +1,384 @@ +#ifndef PYLOG_FORMATTER_H_SEEN +#define PYLOG_FORMATTER_H_SEEN + +#include + +#ifndef _CXXTEST_HAVE_STD +# define _CXXTEST_HAVE_STD +#endif // _CXXTEST_HAVE_STD + +#include +#include + +#ifdef _CXXTEST_OLD_STD +# include +#else // !_CXXTEST_OLD_STD +# include +#endif // _CXXTEST_OLD_STD + +namespace CxxTest +{ +class PylogFormatter : public TestListener +{ +public: + PylogFormatter( OutputStream *o, const char* name = "test" ) : + _o(o), + _base( _chompPath( name ) ), + _runPassed(true), + _suiteIndex(-1), + _testIndex(-1) + {} + virtual ~PylogFormatter() { delete outputStream(); } + + virtual void enterWorld( const WorldDescription & desc ) + { + (*_o) << "**************************************************" << endl; + _o->flush(); + } + + virtual void leaveWorld( const WorldDescription & desc ) + { + unsigned int skippedCount = 0; + unsigned int failedCount = 0; + unsigned int warnedCount = 0; + unsigned int passedCount = 0; + + for ( unsigned int i = 0; i < desc.numSuites(); i++ ) { + const SuiteDescription& suite = desc.suiteDescription(i); + for ( unsigned int j = 0; j < suite.numTests(); j++ ) { + const TestDescription& test = suite.testDescription(j); + + // Test Name + (*_o) << _base.c_str() << "_"; + _padOut( i, 3 ); + (*_o) << "_"; + _padOut( j, 3); + (*_o) << " "; + + // Test Description + (*_o) << test.suiteName() << "_|_" << test.testName(); + (*_o) << " "; + + int sent = strlen( test.suiteName() ) + strlen( test.testName() ) + 1; + for ( int z = sent; z < 56; z++ ) { + (*_o) << " "; + } + + (*_o) << " : "; + + switch ( _status[i][j] ) { + case OK: + (*_o) << "PASS"; + passedCount++; + break; + case SKIPPED: + (*_o) << "OMIT"; + skippedCount++; + break; + case WARNING: + (*_o) << "WARNING"; + warnedCount++; + break; + case ERROR: + (*_o) << "FAILURE"; + failedCount++; + break; + } + + (*_o) << endl; + for ( CXXTEST_STD(vector)::iterator it = _messages[i][j].begin(); it < _messages[i][j].end(); ++it ) { + (*_o) << " " << (*it).c_str() << endl; + } + } + } + + (*_o) << "**************************************************" << endl; + (*_o) << "Command line asked for " << desc.numTotalTests() << " of " << desc.numTotalTests() << " tests" << endl; + (*_o) << "Of those: " + << skippedCount << " Skipped, " + << failedCount << " Failed, " + << warnedCount << " Warned, " + << passedCount << " Passed" + << endl; + } + + + virtual void enterSuite( const SuiteDescription & desc ) + { + (void)desc; + _suiteIndex++; + _testIndex = -1; + while ( (_suiteIndex >= 0) && ((int)_status.size() <= _suiteIndex) ) { + CXXTEST_STD(vector) tmp; + _status.push_back(tmp); + CXXTEST_STD(vector) > tmp2; + _messages.push_back(tmp2); + } + } + + virtual void leaveSuite( const SuiteDescription & desc ) + { + (void)desc; + } + + virtual void enterTest( const TestDescription & desc ) + { + (void)desc; + if ( _suiteIndex >= 0 && (int)_status.size() > _suiteIndex ) { + _testIndex++; + while ( (_testIndex >= 0) && ((int)_status[_suiteIndex].size() <= _testIndex) ) { + ErrorLevel tmp = OK; + _status[_suiteIndex].push_back(tmp); + CXXTEST_STD(vector) tmp2; + _messages[_suiteIndex].push_back(tmp2); + } + } + } + + virtual void leaveTest( const TestDescription & desc ) + { + (void)desc; + } + + virtual void trace( const char * file, unsigned line, + const char * expression ) + { + CXXTEST_STD(string)tmp(expression); + _traceCurrent( file, line, tmp ); + } + + virtual void warning( const char * file, unsigned line, + const char * expression ) + { + CXXTEST_STD(string)tmp(expression); + _warnCurrent( file, line, tmp ); + } + + virtual void failedTest( const char * file, unsigned line, + const char * expression ) + { + CXXTEST_STD(string)tmp(expression); + _failCurrent( file, line, tmp ); + } + + virtual void failedAssert( const char * file, unsigned line, + const char * expression ) + { + CXXTEST_STD(string)tmp(expression); + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertEquals( const char * file, unsigned line, + const char * xStr, const char * yStr, + const char * x, const char * y ) + { + CXXTEST_STD(string)tmp; + tmp += "Expected ("; + tmp += xStr; + tmp += " == "; + tmp += yStr; + tmp += "), found ("; + tmp += x; + tmp += " != "; + tmp += y; + tmp += ")"; + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertSameData( const char * file, unsigned line, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*sizeStr*/, const void * /*x*/, + const void * /*y*/, unsigned /*size*/ ) + { + CXXTEST_STD(string)tmp("TODO - fill in error details"); + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertDelta( const char * file, unsigned line, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*dStr*/, const char * /*x*/, + const char * /*y*/, const char * /*d*/ ) + { + CXXTEST_STD(string)tmp("TODO - fill in error details"); + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertDiffers( const char * file, unsigned line, + const char * xStr, const char * yStr, + const char * value ) + { + CXXTEST_STD(string)tmp; + tmp += "Expected ("; + tmp += xStr; + tmp += " != "; + tmp += yStr; + tmp += "), found ("; + tmp += value; + tmp += ")"; + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertLessThan( const char * file, unsigned line, + const char * xStr, const char * yStr, + const char * x, const char * y ) + { + CXXTEST_STD(string)tmp; + tmp += "Expected ("; + tmp += xStr; + tmp += " < "; + tmp += yStr; + tmp += "), found ("; + tmp += x; + tmp += " >= "; + tmp += y; + tmp += ")"; + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertLessThanEquals( const char * file, unsigned line, + const char * xStr, const char * yStr, + const char * x, const char * y ) + { + CXXTEST_STD(string)tmp; + tmp += "Expected ("; + tmp += xStr; + tmp += " <= "; + tmp += yStr; + tmp += "), found ("; + tmp += x; + tmp += " > "; + tmp += y; + tmp += ")"; + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertPredicate( const char * file, unsigned line, + const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ ) + { + CXXTEST_STD(string)tmp("TODO - fill in error details"); + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertRelation( const char * file, unsigned line, + const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/, + const char * /*x*/, const char * /*y*/ ) + { + CXXTEST_STD(string)tmp("TODO - fill in error details"); + _failCurrent( file, line, tmp); + } + + virtual void failedAssertThrows( const char * file, unsigned line, + const char * /*expression*/, const char * /*type*/, + bool /*otherThrown*/ ) + { + CXXTEST_STD(string)tmp("TODO - fill in error details"); + _failCurrent( file, line, tmp ); + } + + virtual void failedAssertThrowsNot( const char * file, unsigned line, + const char * expression ) + { + CXXTEST_STD(string)tmp(expression); + _failCurrent( file, line, tmp ); + } + +protected: + + enum ErrorLevel { + OK, + SKIPPED, + WARNING, + ERROR + }; + + OutputStream *outputStream() const + { + return _o; + } + + void _traceCurrent( const char* file, unsigned line, const CXXTEST_STD(string)& errMsg ) { + _runPassed = false; + if ( _suiteIndex < (int)_status.size() ) { + if ( _testIndex < (int)_status[_suiteIndex].size() ) { + _messages[_suiteIndex][_testIndex].push_back( errMsg ); + } + } + } + + void _warnCurrent( const char* file, unsigned line, const CXXTEST_STD(string)& errMsg ) { + _runPassed = false; + if ( _suiteIndex < (int)_status.size() ) { + if ( _testIndex < (int)_status[_suiteIndex].size() ) { + if ( _status[_suiteIndex][_testIndex] != ERROR ) { + _status[_suiteIndex][_testIndex] = WARNING; + } + + _messages[_suiteIndex][_testIndex].push_back( errMsg ); + } + } + } + + void _failCurrent( const char* file, unsigned line, const CXXTEST_STD(string)& errMsg ) { + _runPassed = false; + if ( _suiteIndex < (int)_status.size() ) { + if ( _testIndex < (int)_status[_suiteIndex].size() ) { + _status[_suiteIndex][_testIndex] = ERROR; + + _messages[_suiteIndex][_testIndex].push_back( errMsg ); + } + } + } + + void _padOut( unsigned int num, int digits ) + { + int match = 1; + for ( int j = 1; j < digits; j++ ) { + match *= 10; + } + + for ( unsigned int i = match; i > 1 && i > num; i /= 10 ) + { + (*_o) << "0"; + } + (*_o) << num; + } + +private: + static void endl( OutputStream &o ) + { + OutputStream::endl( o ); + } + + static CXXTEST_STD(string) _chompPath( const char* str ) + { + CXXTEST_STD(string) tmp( str ); + if ( tmp.length() > 2 && tmp[0] == '.' && tmp[1] == '/' ) { + tmp = tmp.substr( 2 ); + } + return tmp; + } + + OutputStream *_o; + CXXTEST_STD(string) _base; + CXXTEST_STD(vector)< CXXTEST_STD(vector) > _status; + CXXTEST_STD(vector)< CXXTEST_STD(vector)< CXXTEST_STD(vector) > > _messages; + + bool _runPassed; + int _suiteIndex; + int _testIndex; +}; + +} // namespace CxxTest + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : + +#endif // PYLOG_FORMATTER_H_SEEN diff --git a/src/TRPIFormatter.h b/src/TRPIFormatter.h new file mode 100644 index 000000000..4967f24b5 --- /dev/null +++ b/src/TRPIFormatter.h @@ -0,0 +1,194 @@ +#ifndef TRPI_FORMATTER_H_SEEN +#define TRPI_FORMATTER_H_SEEN + +#include + +#ifndef _CXXTEST_HAVE_STD +# define _CXXTEST_HAVE_STD +#endif // _CXXTEST_HAVE_STD + +#include +#include + +#ifdef _CXXTEST_OLD_STD +# include +#else // !_CXXTEST_OLD_STD +# include +#endif // _CXXTEST_OLD_STD + +namespace CxxTest +{ +class TRPIFormatter : public TestListener +{ +public: + TRPIFormatter( OutputStream *o ) : + _o(o), + _runPassed(true), + _suiteIndex(-1), + _testIndex(-1) + {} + virtual ~TRPIFormatter() { delete outputStream(); } + + virtual void enterWorld( const WorldDescription & desc ) + { + _status.clear(); + + (*_o) << "" << endl; + (*_o) << "" << endl; + (*_o) << " TBD" << endl; + (*_o) << " single-line info" << endl; + (*_o) << " " << endl; + (*_o) << " " << endl; + (*_o) << " devel SVN" << endl; + (*_o) << " http://www.inkscape.org/" << endl; +// (*_o) << " " << endl; + (*_o) << " \?\?\?" << endl; + _o->flush(); + } + + virtual void leaveWorld( const WorldDescription & desc ) + { + (*_o) << " " << endl; + + for ( unsigned int i = 0; i < desc.numSuites(); i++ ) { + const SuiteDescription& suite = desc.suiteDescription(i); + for ( unsigned int j = 0; j < suite.numTests(); j++ ) { + const TestDescription& test = suite.testDescription(j); + (*_o) << " " << endl; + (*_o) << " " << endl; + + (*_o) << " " << test.suiteName() << "" << endl; + (*_o) << " " << test.testName() << "" << endl; + +// (*_o) << " " << endl; + + (*_o) << " " << endl; + (*_o) << " " << endl; + } + } + +// (*_o) << " " << endl; +// (*_o) << " " << endl; + (*_o) << "" << endl; + } + + virtual void enterSuite( const SuiteDescription & desc ) + { + (void)desc; + _suiteIndex++; + _testIndex = -1; + while ( (_suiteIndex >= 0) && ((int)_status.size() <= _suiteIndex) ) { + std::vector tmp; + _status.push_back(tmp); + } + } + + virtual void leaveSuite( const SuiteDescription & desc ) + { + (void)desc; + } + + virtual void enterTest( const TestDescription & desc ) + { + (void)desc; + if ( _suiteIndex >= 0 && (int)_status.size() > _suiteIndex ) { + _testIndex++; + while ( (_testIndex >= 0) && ((int)_status[_suiteIndex].size() <= _testIndex) ) { + bool tmp = true; + _status[_suiteIndex].push_back(tmp); + } + } + } + + virtual void leaveTest( const TestDescription & desc ) + { + (void)desc; + } + + + + virtual void failedTest( const char * /*file*/, unsigned /*line*/, + const char * /*expression*/ ) { _failCurrent(); } + virtual void failedAssert( const char * /*file*/, unsigned /*line*/, + const char * /*expression*/ ) { _failCurrent(); } + virtual void failedAssertEquals( const char * /*file*/, unsigned /*line*/, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*x*/, const char * /*y*/ ) { _failCurrent(); } + virtual void failedAssertSameData( const char * /*file*/, unsigned /*line*/, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*sizeStr*/, const void * /*x*/, + const void * /*y*/, unsigned /*size*/ ) { _failCurrent(); } + virtual void failedAssertDelta( const char * /*file*/, unsigned /*line*/, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*dStr*/, const char * /*x*/, + const char * /*y*/, const char * /*d*/ ) { _failCurrent(); } + virtual void failedAssertDiffers( const char * /*file*/, unsigned /*line*/, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*value*/ ) { _failCurrent(); } + virtual void failedAssertLessThan( const char * /*file*/, unsigned /*line*/, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*x*/, const char * /*y*/ ) { _failCurrent(); } + virtual void failedAssertLessThanEquals( const char * /*file*/, unsigned /*line*/, + const char * /*xStr*/, const char * /*yStr*/, + const char * /*x*/, const char * /*y*/ ) { _failCurrent(); } + virtual void failedAssertPredicate( const char * /*file*/, unsigned /*line*/, + const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ ) { _failCurrent(); } + virtual void failedAssertRelation( const char * /*file*/, unsigned /*line*/, + const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/, + const char * /*x*/, const char * /*y*/ ) { _failCurrent(); } + virtual void failedAssertThrows( const char * /*file*/, unsigned /*line*/, + const char * /*expression*/, const char * /*type*/, + bool /*otherThrown*/ ) { _failCurrent(); } + virtual void failedAssertThrowsNot( const char * /*file*/, unsigned /*line*/, + const char * /*expression*/ ) { _failCurrent(); } + +protected: + OutputStream *outputStream() const + { + return _o; + } + + void _failCurrent() { + _runPassed = false; + if ( _suiteIndex < (int)_status.size() ) { + if ( _testIndex < (int)_status[_suiteIndex].size() ) { + _status[_suiteIndex][_testIndex] = false; + } + } + } + +private: + static void endl( OutputStream &o ) + { + OutputStream::endl( o ); + } + + OutputStream *_o; + std::vector< std::vector > _status; + bool _runPassed; + int _suiteIndex; + int _testIndex; +}; + +} // namespace CxxTest + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : + +#endif // TRPI_FORMATTER_H_SEEN diff --git a/src/libnr/Makefile_insert b/src/libnr/Makefile_insert index 541432193..004a221be 100644 --- a/src/libnr/Makefile_insert +++ b/src/libnr/Makefile_insert @@ -111,7 +111,7 @@ libnr_testnr_LDADD = \ libnr/test-nr-main.cpp: libnr/test-nr.cpp - $(top_srcdir)/cxxtest/cxxtestgen.pl --error-printer -root -o libnr/test-nr-main.cpp $(libnr_test_nr_includes) + $(top_srcdir)/cxxtest/cxxtestgen.pl --template=selfname.tpl -root -o libnr/test-nr-main.cpp $(libnr_test_nr_includes) libnr/test-nr.cpp: $(libnr_test_nr_includes) $(top_srcdir)/cxxtest/cxxtestgen.pl -part -o libnr/test-nr.cpp $(libnr_test_nr_includes) diff --git a/src/selfname.tpl b/src/selfname.tpl new file mode 100644 index 000000000..df20bebfd --- /dev/null +++ b/src/selfname.tpl @@ -0,0 +1,13 @@ +// -*- C++ -*- +// + +#include "MultiPrinter.h" + +int main( int argc, char *argv[] ) +{ + (void)argc; + return CxxTest::MultiPrinter( argv[0] ).run(); +} + +// The CxxTest "world" + diff --git a/src/svg/Makefile_insert b/src/svg/Makefile_insert index ee3ee2518..a1e5963ec 100644 --- a/src/svg/Makefile_insert +++ b/src/svg/Makefile_insert @@ -36,7 +36,7 @@ svg_libspsvg_a_SOURCES = \ # This CxxTest stuff is adapted blindly from libnr/Makefile_insert. # It would be nice to reduce the amount of boilerplate / copy&paste here. svg/test-svg-main.cpp: svg/test-svg.cpp - $(top_srcdir)/cxxtest/cxxtestgen.pl --error-printer -root -o svg/test-svg-main.cpp $(svg_test_svg_includes) + $(top_srcdir)/cxxtest/cxxtestgen.pl --template=selfname.tpl -root -o svg/test-svg-main.cpp $(svg_test_svg_includes) svg/test-svg.cpp: $(svg_test_svg_includes) svg/Makefile_insert $(top_srcdir)/cxxtest/cxxtestgen.pl -part -o svg/test-svg.cpp $(svg_test_svg_includes) diff --git a/src/xml/Makefile_insert b/src/xml/Makefile_insert index a678ca25c..7460d89de 100644 --- a/src/xml/Makefile_insert +++ b/src/xml/Makefile_insert @@ -54,7 +54,7 @@ xml_libspxml_a_SOURCES = \ xml/invalid-operation-exception.h xml/test-xml-main.cpp: xml/test-xml.cpp $(xml_test_xml_includes) - $(top_srcdir)/cxxtest/cxxtestgen.pl --error-printer -root -o xml/test-xml-main.cpp $(xml_test_xml_includes) + $(top_srcdir)/cxxtest/cxxtestgen.pl --template=selfname.tpl -root -o xml/test-xml-main.cpp $(xml_test_xml_includes) xml/test-xml.cpp: $(xml_test_xml_includes) $(top_srcdir)/cxxtest/cxxtestgen.pl -part -o xml/test-xml.cpp $(xml_test_xml_includes)