summaryrefslogtreecommitdiff
path: root/src/cppunit
diff options
context:
space:
mode:
authorBaptiste Lepilleur <gaiacrtn@free.fr>2001-10-05 07:06:28 +0000
committerBaptiste Lepilleur <gaiacrtn@free.fr>2001-10-05 07:06:28 +0000
commit6a1755ef0e36aeb1ac2df0a46e5dafe08a4699ee (patch)
treeee4ef2f3f3b7dcacdbe71fe14bd6bb362a2351ad /src/cppunit
parentc2ac2ac3bcfb30cb8ae4e95e531f1b630b8dd80e (diff)
downloadcppunit-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.am5
-rw-r--r--src/cppunit/TestResult.cpp23
-rw-r--r--src/cppunit/XmlTestResultOutputter.cpp311
-rw-r--r--src/cppunit/cppunit.dsp92
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 += "&lt;";
+ break;
+ case '>':
+ escaped += "&gt;";
+ break;
+ case '&':
+ escaped += "&amp;";
+ break;
+ case '\'':
+ escaped += "&apos;";
+ break;
+ case '"':
+ escaped += "&quot;";
+ 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