summaryrefslogtreecommitdiff
path: root/examples/ClockerPlugIn/ClockerModel.cpp
diff options
context:
space:
mode:
authorBaptiste Lepilleur <gaiacrtn@free.fr>2002-06-14 19:21:01 +0000
committerBaptiste Lepilleur <gaiacrtn@free.fr>2002-06-14 19:21:01 +0000
commit73a038f1eaa268cec330d971fb550befec6f7798 (patch)
treec3eba5d793e37413889acad5b0b9f70caf89b0f6 /examples/ClockerPlugIn/ClockerModel.cpp
parentf39e160fba25476de7d41e2f19d756db7ee76dc7 (diff)
downloadcppunit-73a038f1eaa268cec330d971fb550befec6f7798.tar.gz
Include/cppunit/plugin/PlugInManager.
include/cppunit/plugin/PlugInManager.h: * src/cppunit/PlugInManager.cpp: added two methods to use the plug-in interface for Xml Outputter hooks. * include/cppunit/plugin/TestPlugIn.h: added two methods to the plug-in interface for Xml Outputter hooks. * include/cppunit/plugin/TestPlugInAdapter.h: * src/cppunit/plugin/TestPlugInAdapter.cpp: renamed TestPlugInDefaultImpl. Added empty implementation for Xml outputter hook methods. * include/cppunit/tools/StringTools.h: * src/cppunit/tools/StringTools.cpp: added. Functions to manipulate string (conversion, wrapping...) * include/cppunit/tools/XmlElement.h: * src/cppunit/XmlElement.cpp: renamed addNode() to addElement(). Added methods to walk and modify XmlElement (for hook). Added documentation. Use StringTools. * include/cppunit/XmlOutputter.h: * src/cppunit/XmlOutputter.cpp: added hook calls & management. * include/cppunit/XmlOutputterHook.h: * src/cppunit/XmlOutputterHook.cpp: added. Hook to customize XML output. * src/DllPlugInTester/DllPlugInTester.cpp: call plug-in XmlOutputterHook when writing XML output. Modified so that memory is freed before unloading the test plug-in (caused crash when freeing the XmlDocument). * examples/ReadMe.txt: * examples/ClockerPlugIn/ReadMe.txt: added details about the plug-in (usage, xml content...) * examples/ClockerPlugIn/ClockerModel.h: * examples/ClockerPlugIn/ClockerModel.cpp: extracted from ClockerListener. Represents the test hierarchy and tracked time for each test. * examples/ClockerPlugIn/ClockerListener.h: * examples/ClockerPlugIn/ClockerListener.cpp: extracted test hierarchy tracking to ClockerModel. Replaced the 'flat' view option with a 'text' option to print the timed test tree to stdout. * examples/ClockerPlugIn/ClockerPlugIn.cpp: updated to hook the XML output and use the new classes. * examples/ClockerPlugIn/ClockerXmlHook.h: * examples/ClockerPlugIn/ClockerXmlHook.cpp: added. XmlOutputterHook to includes the timed test hierarchy and test timing in the XML output. * examples/cppunittest/XmlElementTest.h: * examples/cppunittest/XmlElementTest.cpp: added new test cases. * examples/cppunittest/XmlOutputterTest.h: * examples/cppunittest/XmlOutputterTest.cpp: added tests for XmlOutputterHook.
Diffstat (limited to 'examples/ClockerPlugIn/ClockerModel.cpp')
-rw-r--r--examples/ClockerPlugIn/ClockerModel.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/examples/ClockerPlugIn/ClockerModel.cpp b/examples/ClockerPlugIn/ClockerModel.cpp
new file mode 100644
index 0000000..60e87ad
--- /dev/null
+++ b/examples/ClockerPlugIn/ClockerModel.cpp
@@ -0,0 +1,145 @@
+// //////////////////////////////////////////////////////////////////////////
+// Implementation file ClockerModel.cpp for class ClockerModel
+// (c)Copyright 2000, Baptiste Lepilleur.
+// Created: 2002/06/14
+// //////////////////////////////////////////////////////////////////////////
+#include "ClockerModel.h"
+
+
+ClockerModel::ClockerModel()
+ : m_testCaseCount( 0 )
+ , m_totalTestCaseTime( 0 )
+{
+}
+
+
+ClockerModel::~ClockerModel()
+{
+}
+
+
+void
+ClockerModel::setExpectedTestCount( int count )
+{
+ m_tests.reserve( count );
+}
+
+
+void
+ClockerModel::enterTest( CppUnit::Test *test,
+ bool isSuite )
+{
+ m_currentPath.add( test );
+
+ int testIndex = m_tests.size();
+ if ( !m_testIndexes.empty() )
+ m_tests[ m_testIndexes.top() ].m_childIndexes.push_back( testIndex );
+ m_testIndexes.push( testIndex );
+ m_testToIndexes.insert( TestToIndexes::value_type( test, testIndex ) );
+
+ TestInfo info;
+ info.m_timer.start();
+ info.m_path = m_currentPath;
+ info.m_isSuite = isSuite;
+
+ m_tests.push_back( info );
+
+ if ( !isSuite )
+ ++m_testCaseCount;
+}
+
+
+void
+ClockerModel::exitTest( CppUnit::Test *test,
+ bool isSuite )
+{
+ m_tests[ m_testIndexes.top() ].m_timer.finish();
+ if ( !isSuite )
+ m_totalTestCaseTime += m_tests.back().m_timer.elapsedTime();
+
+ m_currentPath.up();
+ m_testIndexes.pop();
+}
+
+
+double
+ClockerModel::totalElapsedTime() const
+{
+ return m_tests[0].m_timer.elapsedTime();
+}
+
+
+double
+ClockerModel::averageTestCaseTime() const
+{
+ double average = 0;
+ if ( m_testCaseCount > 0 )
+ average = m_totalTestCaseTime / m_testCaseCount;
+ return average;
+}
+
+
+double
+ClockerModel::testTimeFor( int testIndex ) const
+{
+ return m_tests[ testIndex ].m_timer.elapsedTime();
+}
+
+
+std::string
+ClockerModel::timeStringFor( double time )
+{
+ char buffer[320];
+ const char *format;
+ if ( time < 1 )
+ format = "%2.3f";
+ else if ( time < 10 )
+ format = "%3.2f";
+ else if (time < 100 )
+ format = "%4.1f";
+ else
+ format = "%6f";
+
+ ::sprintf( buffer, format, time );
+
+ return buffer;
+}
+
+
+bool
+ClockerModel::isSuite( int testIndex ) const
+{
+ return m_tests[ testIndex ].m_isSuite;
+}
+
+
+const CppUnit::TestPath &
+ClockerModel::testPathFor( int testIndex ) const
+{
+ return m_tests[ testIndex ].m_path;
+}
+
+
+int
+ClockerModel::indexOf( CppUnit::Test *test ) const
+{
+ TestToIndexes::const_iterator itFound = m_testToIndexes.find( test );
+ if ( itFound != m_testToIndexes.end() )
+ return itFound->second;
+ return -1;
+}
+
+
+int
+ClockerModel::childCountFor( int testIndex ) const
+{
+ return m_tests[ testIndex ].m_childIndexes.size();
+}
+
+
+int
+ClockerModel::childAtFor( int testIndex,
+ int chidIndex ) const
+{
+ return m_tests[ testIndex ].m_childIndexes[ chidIndex ];
+}