|
Packit |
8c9aa0 |
#include <cppunit/config/SourcePrefix.h>
|
|
Packit |
8c9aa0 |
#include <cppunit/extensions/TestFactoryRegistry.h>
|
|
Packit |
8c9aa0 |
#include <map>
|
|
Packit |
8c9aa0 |
#include <cppunit/TestSuite.h>
|
|
Packit |
8c9aa0 |
#include <assert.h>
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_BEGIN
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief (INTERNAL) List of all TestFactoryRegistry.
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
class TestFactoryRegistryList
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
private:
|
|
Packit |
8c9aa0 |
typedef std::map<std::string, TestFactoryRegistry *, std::less<std::string> > Registries;
|
|
Packit |
8c9aa0 |
Registries m_registries;
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
enum State {
|
|
Packit |
8c9aa0 |
doNotChange =0,
|
|
Packit |
8c9aa0 |
notCreated,
|
|
Packit |
8c9aa0 |
exist,
|
|
Packit |
8c9aa0 |
destroyed
|
|
Packit |
8c9aa0 |
};
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
static State stateFlag( State newState = doNotChange )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
static State state = notCreated;
|
|
Packit |
8c9aa0 |
if ( newState != doNotChange )
|
|
Packit |
8c9aa0 |
state = newState;
|
|
Packit |
8c9aa0 |
return state;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
static TestFactoryRegistryList *getInstance()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
static TestFactoryRegistryList list;
|
|
Packit |
8c9aa0 |
return &list;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
TestFactoryRegistry *getInternalRegistry( const std::string &name )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
Registries::const_iterator foundIt = m_registries.find( name );
|
|
Packit |
8c9aa0 |
if ( foundIt == m_registries.end() )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
TestFactoryRegistry *factory = new TestFactoryRegistry( name );
|
|
Packit |
8c9aa0 |
m_registries.insert( std::pair<const std::string, TestFactoryRegistry*>( name, factory ) );
|
|
Packit |
8c9aa0 |
return factory;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
return (*foundIt).second;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
public:
|
|
Packit |
8c9aa0 |
TestFactoryRegistryList()
|
|
Packit |
8c9aa0 |
: m_registries()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
stateFlag( exist );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
~TestFactoryRegistryList()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
for ( Registries::iterator it = m_registries.begin(); it != m_registries.end(); ++it )
|
|
Packit |
8c9aa0 |
delete (*it).second;
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
stateFlag( destroyed );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
static TestFactoryRegistry *getRegistry( const std::string &name )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
// If the following assertion failed, then TestFactoryRegistry::getRegistry()
|
|
Packit |
8c9aa0 |
// was called during static variable destruction without checking the registry
|
|
Packit |
8c9aa0 |
// validity beforehand using TestFactoryRegistry::isValid() beforehand.
|
|
Packit |
8c9aa0 |
assert( isValid() );
|
|
Packit |
8c9aa0 |
if ( !isValid() ) // release mode
|
|
Packit |
8c9aa0 |
return NULL; // => force CRASH
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
return getInstance()->getInternalRegistry( name );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
static bool isValid()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return stateFlag() != destroyed;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
};
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::TestFactoryRegistry( std::string name ) :
|
|
Packit |
8c9aa0 |
m_factories(),
|
|
Packit |
8c9aa0 |
m_name( name )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::~TestFactoryRegistry()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
TestFactoryRegistry &
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::getRegistry( const std::string &name )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return *TestFactoryRegistryList::getRegistry( name );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::registerFactory( const std::string &,
|
|
Packit |
8c9aa0 |
TestFactory *factory )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
registerFactory( factory );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::registerFactory( TestFactory *factory )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_factories.insert( factory );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::unregisterFactory( TestFactory *factory )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_factories.erase( factory );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::addRegistry( const std::string &name )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
registerFactory( &getRegistry( name ) );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
Test *
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::makeTest()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
TestSuite *suite = new TestSuite( m_name );
|
|
Packit |
8c9aa0 |
addTestToSuite( suite );
|
|
Packit |
8c9aa0 |
return suite;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::addTestToSuite( TestSuite *suite )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
for ( Factories::iterator it = m_factories.begin();
|
|
Packit |
8c9aa0 |
it != m_factories.end();
|
|
Packit |
8c9aa0 |
++it )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
TestFactory *factory = *it;
|
|
Packit |
8c9aa0 |
suite->addTest( factory->makeTest() );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
bool
|
|
Packit |
8c9aa0 |
TestFactoryRegistry::isValid()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return TestFactoryRegistryList::isValid();
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_END
|