|
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
|