diff options
| author | Baptiste Lepilleur <gaiacrtn@free.fr> | 2001-10-05 07:06:28 +0000 |
|---|---|---|
| committer | Baptiste Lepilleur <gaiacrtn@free.fr> | 2001-10-05 07:06:28 +0000 |
| commit | 6a1755ef0e36aeb1ac2df0a46e5dafe08a4699ee (patch) | |
| tree | ee4ef2f3f3b7dcacdbe71fe14bd6bb362a2351ad /src/cppunit | |
| parent | c2ac2ac3bcfb30cb8ae4e95e531f1b630b8dd80e (diff) | |
| download | cppunit-6a1755ef0e36aeb1ac2df0a46e5dafe08a4699ee.tar.gz | |
NEWS : updated.
NEWS : updated.
* include/cppunit/Exception.h : added include Portability.h.
* include/cppunit/TestResult.* : changed TestFailures to a deque.
added tests().
* examples/cppunittest/CppUnitTest.dsp :
* examples/cppunittest/MakeFile.am :
* examples/msvc6/CppUnitTestApp/CppUnitTestApp.dsp : Added
XmlTestResultOutputterTest.*, XmlUniformiser.*, XmlUniformiserTest.*,
UnitTestToolSuite.h, OutputSuite.h.
* examples/msvc6/CppUnitTestApp/CppUnitTestApp.dsp : revised project
folders structure. Added missing NoteEqualExceptionTest.*.
* examples/cppunittest/CppUnitTestSuite.cpp : added 'Output' and
'UnitTestTool' suites.
* src/cppunit/cppunit.dsp: removed estring.h. Revised project folders
structure. Removed TestRegistry.*. Added TestSetUp.h,
XmlTestResultOutputter.*.
* src/cppunit/MakeFile.am: added XmlTestResultOutputter.*.
* src/testrunner/TestRunnerDlg.cpp: removed disabled code.
Diffstat (limited to 'src/cppunit')
| -rw-r--r-- | src/cppunit/Makefile.am | 5 | ||||
| -rw-r--r-- | src/cppunit/TestResult.cpp | 23 | ||||
| -rw-r--r-- | src/cppunit/XmlTestResultOutputter.cpp | 311 | ||||
| -rw-r--r-- | src/cppunit/cppunit.dsp | 92 |
4 files changed, 387 insertions, 44 deletions
diff --git a/src/cppunit/Makefile.am b/src/cppunit/Makefile.am index 3afc7b8..669b449 100644 --- a/src/cppunit/Makefile.am +++ b/src/cppunit/Makefile.am @@ -1,5 +1,5 @@ # -# $Id: Makefile.am,v 1.10 2001-07-07 19:12:41 smr99 Exp $ +# $Id: Makefile.am,v 1.11 2001-10-05 08:06:28 blep Exp $ # EXTRA_DIST = cppunit.dsw cppunit.dsp @@ -20,7 +20,8 @@ libcppunit_la_SOURCES = \ TextTestResult.cpp \ TextTestRunner.cpp \ TestFactoryRegistry.cpp \ - TypeInfoHelper.cpp + TypeInfoHelper.cpp \ + XmlTestResultOutputter.cpp libcppunit_la_LDFLAGS= \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ diff --git a/src/cppunit/TestResult.cpp b/src/cppunit/TestResult.cpp index 06253d8..b84a669 100644 --- a/src/cppunit/TestResult.cpp +++ b/src/cppunit/TestResult.cpp @@ -9,7 +9,6 @@ TestResult::TestResult( SynchronizationObject *syncObject ) : m_syncObject( syncObject == 0 ? new SynchronizationObject() : syncObject ) { - m_runTests = 0; m_testErrors = 0; m_stop = false; } @@ -58,7 +57,7 @@ TestResult::addFailure( TestFailure *failure ) { m_failures.push_back( failure ); - for ( std::vector<TestListener *>::iterator it = m_listeners.begin(); + for ( TestListeners::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it ) (*it)->addFailure( failure ); @@ -70,9 +69,9 @@ void TestResult::startTest( Test *test ) { ExclusiveZone zone (m_syncObject); - m_runTests++; + m_tests.push_back( test ); - for ( std::vector<TestListener *>::iterator it = m_listeners.begin(); + for ( TestListeners::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it ) (*it)->startTest( test ); @@ -85,7 +84,7 @@ TestResult::endTest( Test *test ) { ExclusiveZone zone (m_syncObject); - for ( std::vector<TestListener *>::iterator it = m_listeners.begin(); + for ( TestListeners::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it ) (*it)->endTest( test ); @@ -97,7 +96,7 @@ int TestResult::runTests() const { ExclusiveZone zone( m_syncObject ); - return m_runTests; + return m_tests.size(); } @@ -137,8 +136,8 @@ TestResult::wasSuccessful() const } -/// Returns a vector of the failures. -const std::vector<TestFailure *>& +/// Returns a the list failures (random access collection). +const TestResult::TestFailures & TestResult::failures() const { ExclusiveZone zone( m_syncObject ); @@ -146,6 +145,14 @@ TestResult::failures() const } +const TestResult::Tests & +TestResult::tests() const +{ + ExclusiveZone zone( m_syncObject ); + return m_tests; +} + + /// Returns whether testing should be stopped bool TestResult::shouldStop() const diff --git a/src/cppunit/XmlTestResultOutputter.cpp b/src/cppunit/XmlTestResultOutputter.cpp new file mode 100644 index 0000000..590c617 --- /dev/null +++ b/src/cppunit/XmlTestResultOutputter.cpp @@ -0,0 +1,311 @@ +#include <cppunit/Exception.h> +#include <cppunit/Test.h> +#include <cppunit/TestResult.h> +#include <cppunit/XmlTestResultOutputter.h> +#include <map> +#include <stdlib.h> + + +namespace CppUnit +{ + +// XmlTestResultOutputter::Node +// ////////////////////////////////////////////////////////////////// + + +XmlTestResultOutputter::Node::Node( std::string elementName, + std::string content ) : + m_name( elementName ), + m_content( content ) +{ +} + + +XmlTestResultOutputter::Node::Node( std::string elementName, + int numericContent ) : + m_name( elementName ) +{ + m_content = asString( numericContent ); +} + + +XmlTestResultOutputter::Node::~Node() +{ + Nodes::iterator itNode = m_nodes.begin(); + while ( itNode != m_nodes.end() ) + delete *itNode++; +} + + +void +XmlTestResultOutputter::Node::addAttribute( std::string attributeName, + std::string value ) +{ + m_attributes.push_back( Attribute( attributeName, value ) ); +} + + +void +XmlTestResultOutputter::Node::addAttribute( std::string attributeName, + int numericValue ) +{ + addAttribute( attributeName, asString( numericValue ) ); +} + + +void +XmlTestResultOutputter::Node::addNode( Node *node ) +{ + m_nodes.push_back( node ); +} + + +std::string +XmlTestResultOutputter::Node::toString() const +{ + std::string element = "<"; + element += m_name; + element += " "; + element += attributesAsString(); + element += " >\n"; + + Nodes::const_iterator itNode = m_nodes.begin(); + while ( itNode != m_nodes.end() ) + { + const Node *node = *itNode++; + element += node->toString(); + } + + element += m_content; + + element += "</"; + element += m_name; + element += ">\n"; + + return element; +} + + +std::string +XmlTestResultOutputter::Node::attributesAsString() const +{ + std::string attributes; + Attributes::const_iterator itAttribute = m_attributes.begin(); + while ( itAttribute != m_attributes.end() ) + { + const Attribute &attribute = *itAttribute++; + attributes += attribute.first; + attributes += "=\""; + attributes += escape( attribute.second ); + attributes += "\""; + } + return attributes; +} + + +std::string +XmlTestResultOutputter::Node::escape( std::string value ) const +{ + std::string escaped; + for ( int index =0; index < value.length(); ++index ) + { + char c = value[index ]; + switch ( c ) // escape all predefined XML entity (safe?) + { + case '<': + escaped += "<"; + break; + case '>': + escaped += ">"; + break; + case '&': + escaped += "&"; + break; + case '\'': + escaped += "'"; + break; + case '"': + escaped += """; + break; + default: + escaped += c; + } + } + + return escaped; +} + +// should be somewhere else... Future CppUnit::String ? +std::string +XmlTestResultOutputter::Node::asString( int value ) +{ + char buffer[16]; + return ::itoa( value, buffer, 10 ); +} + + + + +// XmlTestResultOutputter +// ////////////////////////////////////////////////////////////////// + +XmlTestResultOutputter::XmlTestResultOutputter() +{ +} + + +XmlTestResultOutputter::~XmlTestResultOutputter() +{ +} + + +void +XmlTestResultOutputter::write( TestResult *result, + std::ostream &stream ) +{ + writeProlog( stream ); + writeTestsResult( result, stream ); +} + + +void +XmlTestResultOutputter::writeProlog( std::ostream &stream ) +{ + stream << "<?xml version=\"1.0\" encoding='ISO-8859-1' standalone='yes' ?>" + << std::endl; +} + + +void +XmlTestResultOutputter::writeTestsResult( TestResult *result, + std::ostream &stream ) +{ + Node *rootNode = makeRootNode( result ); + stream << rootNode->toString(); + delete rootNode; +} + + +XmlTestResultOutputter::Node * +XmlTestResultOutputter::makeRootNode( TestResult *result ) +{ + Node *rootNode = new Node( "TestRun" ); + + FailedTests failedTests; + fillFailedTestsMap( result, failedTests ); + + rootNode->addNode( makeFailedTestsNode( failedTests, result ) ); + rootNode->addNode( makeSucessfulTestsNode( failedTests, result ) ); + rootNode->addNode( makeStatisticsNode( result ) ); + + return rootNode; +} + + +void +XmlTestResultOutputter::fillFailedTestsMap( TestResult *result, + FailedTests &failedTests ) +{ + const TestResult::TestFailures &failures = result->failures(); + TestResult::TestFailures::const_iterator itFailure = failures.begin(); + while ( itFailure != failures.end() ) + { + TestFailure *failure = *itFailure++; + failedTests.insert( std::make_pair(failure->failedTest(), failure ) ); + } +} + + +XmlTestResultOutputter::Node * +XmlTestResultOutputter::makeFailedTestsNode( FailedTests &failedTests, + TestResult *result ) +{ + Node *rootNode = new Node( "FailedTests" ); + + const TestResult::Tests &tests = result->tests(); + for ( int testNumber = 0; testNumber < tests.size(); ++testNumber ) + { + Test *test = tests[testNumber]; + if ( failedTests.find( test ) != failedTests.end() ) + { + rootNode->addNode( makeFailedTestNode( test, + failedTests[test], + testNumber+1 ) ); + } + } + + return rootNode; +} + + +XmlTestResultOutputter::Node * +XmlTestResultOutputter::makeSucessfulTestsNode( FailedTests &failedTests, + TestResult *result ) +{ + Node *rootNode = new Node( "SucessfulTests" ); + + const TestResult::Tests &tests = result->tests(); + for ( int testNumber = 0; testNumber < tests.size(); ++testNumber ) + { + Test *test = tests[testNumber]; + if ( failedTests.find( test ) == failedTests.end() ) + { + rootNode->addNode( makeSucessfulTestNode( test, + testNumber+1 ) ); + } + } + + return rootNode; +} + + +XmlTestResultOutputter::Node * +XmlTestResultOutputter::makeStatisticsNode( TestResult *result ) +{ + Node *statisticsNode = new Node( "Statistics" ); + statisticsNode->addNode( new Node( "Tests", result->runTests() ) ); + statisticsNode->addNode( new Node( "FailuresTotal", + result->testFailuresTotal() ) ); + statisticsNode->addNode( new Node( "Errors", result->testErrors() ) ); + statisticsNode->addNode( new Node( "Failures", result->testFailures() ) ); + + return statisticsNode; +} + + +XmlTestResultOutputter::Node * +XmlTestResultOutputter::makeFailedTestNode( Test *test, + TestFailure *failure, + int testNumber ) +{ + Exception *thrownException = failure->thrownException(); + + Node *testNode = new Node( "FailedTest", thrownException->what() ); + testNode->addAttribute( "id", testNumber ); + testNode->addNode( new Node( "Name", test->getName() ) ); + testNode->addNode( new Node( "FailureType", + failure->isError() ? "Error" : "Assertion" ) ); + + if ( thrownException->lineNumber() != Exception::UNKNOWNLINENUMBER ) + { + Node *locationNode = new Node( "Location" ); + testNode->addNode( locationNode ); + locationNode->addNode( new Node( "File", thrownException->fileName() ) ); + locationNode->addNode( new Node( "Line", thrownException->lineNumber() ) ); + } + return testNode; +} + + +XmlTestResultOutputter::Node * +XmlTestResultOutputter::makeSucessfulTestNode( Test *test, + int testNumber ) +{ + Node *testNode = new Node( "Test" ); + testNode->addAttribute( "id", testNumber ); + testNode->addNode( new Node( "Name", test->getName() ) ); + return testNode; +} + + +} // namespace CppUnit diff --git a/src/cppunit/cppunit.dsp b/src/cppunit/cppunit.dsp index e8ae0bd..7ff4e72 100644 --- a/src/cppunit/cppunit.dsp +++ b/src/cppunit/cppunit.dsp @@ -105,32 +105,44 @@ LIB32=link.exe -lib # Name "cppunit - Win32 Release" # Name "cppunit - Win32 Debug" # Name "cppunit - Win32 Debug Crossplatform Setting" -# Begin Group "extensions" +# Begin Group "extension" # PROP Default_Filter "" # Begin Source File -SOURCE=..\..\include\cppunit\extensions\AutoRegisterSuite.h +SOURCE=..\..\include\cppunit\extensions\Orthodox.h # End Source File # Begin Source File -SOURCE=..\..\include\cppunit\extensions\HelperMacros.h +SOURCE=.\RepeatedTest.cpp # End Source File # Begin Source File -SOURCE=..\..\include\cppunit\extensions\Orthodox.h +SOURCE=..\..\include\cppunit\extensions\RepeatedTest.h # End Source File # Begin Source File -SOURCE=.\RepeatedTest.cpp +SOURCE=..\..\include\cppunit\extensions\TestDecorator.h # End Source File # Begin Source File -SOURCE=..\..\include\cppunit\extensions\RepeatedTest.h +SOURCE=..\..\include\cppunit\extensions\TestSetUp.h +# End Source File +# End Group +# Begin Group "helper" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\include\cppunit\extensions\AutoRegisterSuite.h # End Source File # Begin Source File -SOURCE=..\..\include\cppunit\extensions\TestDecorator.h +SOURCE=..\..\include\cppunit\extensions\HelperMacros.h +# End Source File +# Begin Source File + +SOURCE=..\..\include\cppunit\TestCaller.h # End Source File # Begin Source File @@ -161,18 +173,9 @@ SOURCE=.\TypeInfoHelper.cpp SOURCE=..\..\include\cppunit\extensions\TypeInfoHelper.h # End Source File # End Group -# Begin Source File - -SOURCE=..\..\ChangeLog -# End Source File -# Begin Source File +# Begin Group "core" -SOURCE="..\..\include\cppunit\config-msvc6.h" -# End Source File -# Begin Source File - -SOURCE=.\estring.h -# End Source File +# PROP Default_Filter "" # Begin Source File SOURCE=.\Exception.cpp @@ -191,10 +194,6 @@ SOURCE=..\..\include\cppunit\NotEqualException.h # End Source File # Begin Source File -SOURCE=..\..\include\cppunit\Portability.h -# End Source File -# Begin Source File - SOURCE=..\..\include\cppunit\Test.h # End Source File # Begin Source File @@ -207,10 +206,6 @@ SOURCE=..\..\include\cppunit\TestAssert.h # End Source File # Begin Source File -SOURCE=..\..\include\cppunit\TestCaller.h -# End Source File -# Begin Source File - SOURCE=.\TestCase.cpp # End Source File # Begin Source File @@ -231,14 +226,6 @@ SOURCE=..\..\include\cppunit\TestListener.h # End Source File # Begin Source File -SOURCE=.\TestRegistry.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\cppunit\TestRegistry.h -# End Source File -# Begin Source File - SOURCE=.\TestResult.cpp # End Source File # Begin Source File @@ -253,6 +240,10 @@ SOURCE=.\TestSuite.cpp SOURCE=..\..\include\cppunit\TestSuite.h # End Source File +# End Group +# Begin Group "output" + +# PROP Default_Filter "" # Begin Source File SOURCE=.\TextTestResult.cpp @@ -269,5 +260,38 @@ SOURCE=.\TextTestRunner.cpp SOURCE=..\..\include\cppunit\TextTestRunner.h # End Source File +# Begin Source File + +SOURCE=.\XmlTestResultOutputter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\include\cppunit\XmlTestResultOutputter.h +# End Source File +# End Group +# Begin Group "portability" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE="..\..\include\cppunit\config-msvc6.h" +# End Source File +# Begin Source File + +SOURCE=..\..\include\cppunit\Portability.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\ChangeLog +# End Source File +# Begin Source File + +SOURCE=.\Makefile.am +# End Source File +# Begin Source File + +SOURCE=..\..\NEWS +# End Source File # End Target # End Project |
