Blame src/cppunit/TestFactoryRegistry.cpp

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