Blame src/cppunit/TestPath.cpp

Packit 8c9aa0
#include <cppunit/Portability.h>
Packit 8c9aa0
#include <cppunit/Test.h>
Packit 8c9aa0
#include <cppunit/TestPath.h>
Packit 8c9aa0
#include <stdexcept>
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath::TestPath()
Packit 8c9aa0
    : m_tests()
Packit 8c9aa0
{
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath::TestPath( Test *root )
Packit 8c9aa0
    : m_tests()
Packit 8c9aa0
{
Packit 8c9aa0
  add( root );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath::TestPath( const TestPath &other, 
Packit 8c9aa0
                    int indexFirst, 
Packit 8c9aa0
                    int count )
Packit 8c9aa0
    : m_tests()
Packit 8c9aa0
{
Packit 8c9aa0
  int countAdjustment = 0;
Packit 8c9aa0
  if ( indexFirst < 0 )
Packit 8c9aa0
  {
Packit 8c9aa0
    countAdjustment = indexFirst;
Packit 8c9aa0
    indexFirst = 0;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  if ( count < 0 )
Packit 8c9aa0
    count = other.getTestCount();
Packit 8c9aa0
  else
Packit 8c9aa0
    count += countAdjustment;
Packit 8c9aa0
Packit 8c9aa0
  int index = indexFirst;
Packit 8c9aa0
  while ( count-- > 0  &&  index < other.getTestCount() )
Packit 8c9aa0
    add( other.getTestAt( index++ ) );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath::TestPath( Test *searchRoot, 
Packit 8c9aa0
                    const std::string &pathAsString )
Packit 8c9aa0
    : m_tests()
Packit 8c9aa0
{
Packit 8c9aa0
  PathTestNames testNames;
Packit 8c9aa0
Packit 8c9aa0
  Test *parentTest = findActualRoot( searchRoot, pathAsString, testNames );
Packit 8c9aa0
  add( parentTest );
Packit 8c9aa0
Packit 8c9aa0
  for ( unsigned int index = 1; index < testNames.size(); ++index )
Packit 8c9aa0
  {
Packit 8c9aa0
    bool childFound = false;
Packit 8c9aa0
    for ( int childIndex =0; childIndex < parentTest->getChildTestCount(); ++childIndex )
Packit 8c9aa0
    {
Packit 8c9aa0
      if ( parentTest->getChildTestAt( childIndex )->getName() == testNames[index] )
Packit 8c9aa0
      {
Packit 8c9aa0
        childFound = true;
Packit 8c9aa0
        parentTest = parentTest->getChildTestAt( childIndex );
Packit 8c9aa0
        break;
Packit 8c9aa0
      }
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    if ( !childFound )
Packit 8c9aa0
      throw std::invalid_argument( "TestPath::TestPath(): failed to resolve test name <"+
Packit 8c9aa0
                                   testNames[index] + "> of path <" + pathAsString + ">" );
Packit 8c9aa0
Packit 8c9aa0
    add( parentTest );
Packit 8c9aa0
  }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath::TestPath( const TestPath &other )
Packit 8c9aa0
  : m_tests( other.m_tests )
Packit 8c9aa0
{
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath::~TestPath()
Packit 8c9aa0
{
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
TestPath &
Packit 8c9aa0
TestPath::operator =( const TestPath &other )
Packit 8c9aa0
{
Packit 8c9aa0
  if ( &other != this )
Packit 8c9aa0
    m_tests = other.m_tests;
Packit 8c9aa0
  return *this;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
bool 
Packit 8c9aa0
TestPath::isValid() const
Packit 8c9aa0
{
Packit 8c9aa0
  return getTestCount() > 0;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::add( Test *test )
Packit 8c9aa0
{
Packit 8c9aa0
  m_tests.push_back( test );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::add( const TestPath &path )
Packit 8c9aa0
{
Packit 8c9aa0
  for ( int index =0; index < path.getTestCount(); ++index )
Packit 8c9aa0
    add( path.getTestAt( index ) );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::insert( Test *test, 
Packit 8c9aa0
                  int index )
Packit 8c9aa0
{
Packit 8c9aa0
  if ( index < 0  ||  index > getTestCount() )
Packit 8c9aa0
    throw std::out_of_range( "TestPath::insert(): index out of range" );
Packit 8c9aa0
  m_tests.insert( m_tests.begin() + index, test );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::insert( const TestPath &path, 
Packit 8c9aa0
                  int index )
Packit 8c9aa0
{
Packit 8c9aa0
  int itemIndex = path.getTestCount() -1;
Packit 8c9aa0
  while ( itemIndex >= 0 )
Packit 8c9aa0
    insert( path.getTestAt( itemIndex-- ), index );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::removeTests()
Packit 8c9aa0
{
Packit 8c9aa0
  while ( isValid() )
Packit 8c9aa0
    removeTest( 0 );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::removeTest( int index )
Packit 8c9aa0
{
Packit 8c9aa0
  checkIndexValid( index );
Packit 8c9aa0
  m_tests.erase( m_tests.begin() + index );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::up()
Packit 8c9aa0
{
Packit 8c9aa0
  checkIndexValid( 0 );
Packit 8c9aa0
  removeTest( getTestCount() -1 );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
int 
Packit 8c9aa0
TestPath::getTestCount() const
Packit 8c9aa0
{
Packit 8c9aa0
  return m_tests.size();
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
Test *
Packit 8c9aa0
TestPath::getTestAt( int index ) const
Packit 8c9aa0
{
Packit 8c9aa0
  checkIndexValid( index );
Packit 8c9aa0
  return m_tests[index];
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
Test *
Packit 8c9aa0
TestPath::getChildTest() const
Packit 8c9aa0
{
Packit 8c9aa0
  return getTestAt( getTestCount() -1 );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
TestPath::checkIndexValid( int index ) const
Packit 8c9aa0
{
Packit 8c9aa0
  if ( index < 0  ||  index >= getTestCount() )
Packit 8c9aa0
    throw std::out_of_range( "TestPath::checkIndexValid(): index out of range" );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
std::string 
Packit 8c9aa0
TestPath::toString() const
Packit 8c9aa0
{
Packit 8c9aa0
  std::string asString( "/" );
Packit 8c9aa0
  for ( int index =0; index < getTestCount(); ++index )
Packit 8c9aa0
  {
Packit 8c9aa0
    if ( index > 0 )
Packit 8c9aa0
      asString += '/';
Packit 8c9aa0
    asString += getTestAt(index)->getName();
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  return asString;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
Test *
Packit 8c9aa0
TestPath::findActualRoot( Test *searchRoot,
Packit 8c9aa0
                          const std::string &pathAsString,
Packit 8c9aa0
                          PathTestNames &testNames )
Packit 8c9aa0
{
Packit 8c9aa0
  bool isRelative = splitPathString( pathAsString, testNames );
Packit 8c9aa0
Packit 8c9aa0
  if ( isRelative  &&  pathAsString.empty() )
Packit 8c9aa0
    return searchRoot;
Packit 8c9aa0
Packit 8c9aa0
  if ( testNames.empty() )
Packit 8c9aa0
    throw std::invalid_argument( "TestPath::TestPath(): invalid root or root name in absolute path" );
Packit 8c9aa0
Packit 8c9aa0
  Test *root = isRelative ? searchRoot->findTest( testNames[0] )  // throw if bad test name
Packit 8c9aa0
                          : searchRoot;
Packit 8c9aa0
  if ( root->getName() != testNames[0] )
Packit 8c9aa0
    throw std::invalid_argument( "TestPath::TestPath(): searchRoot does not match path root name" );
Packit 8c9aa0
Packit 8c9aa0
  return root;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
bool
Packit 8c9aa0
TestPath::splitPathString( const std::string &pathAsString,
Packit 8c9aa0
                           PathTestNames &testNames )
Packit 8c9aa0
{
Packit 8c9aa0
  if ( pathAsString.empty() )
Packit 8c9aa0
    return true;
Packit 8c9aa0
Packit 8c9aa0
  bool isRelative = pathAsString[0] != '/';
Packit 8c9aa0
Packit 8c9aa0
  int index = (isRelative ? 0 : 1);
Packit 8c9aa0
  while ( true )
Packit 8c9aa0
  {
Packit 8c9aa0
    int separatorIndex = pathAsString.find( '/', index );
Packit 8c9aa0
    if ( separatorIndex >= 0 )
Packit 8c9aa0
    {
Packit 8c9aa0
      testNames.push_back( pathAsString.substr( index, separatorIndex - index ) );
Packit 8c9aa0
      index = separatorIndex + 1;
Packit 8c9aa0
    }
Packit 8c9aa0
    else
Packit 8c9aa0
    {
Packit 8c9aa0
      testNames.push_back( pathAsString.substr( index ) );
Packit 8c9aa0
      break;
Packit 8c9aa0
    }
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  return isRelative;
Packit 8c9aa0
}
Packit 8c9aa0
  
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_END