Removed Runner class

- it served no purpose - split into functions instead
This commit is contained in:
Phil Nash 2015-07-28 18:55:11 +01:00
parent 85c8074784
commit 34fa25ed2f
2 changed files with 66 additions and 82 deletions

View File

@ -21,90 +21,77 @@
namespace Catch { namespace Catch {
class Runner { Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
std::string reporterName = config->getReporterName().empty()
? "console"
: config->getReporterName();
public: Ptr<IStreamingReporter> reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() );
Runner( Ptr<Config> const& config ) if( !reporter ) {
: m_config( config ) std::ostringstream oss;
{ oss << "No reporter registered with name: '" << reporterName << "'";
openStream(); throw std::domain_error( oss.str() );
makeReporter(); }
return reporter;
} }
Totals runTests() { void openStreamInto( Ptr<Config> const& config, std::ofstream& ofs ) {
// Open output file, if specified
if( !config->getFilename().empty() ) {
ofs.open( config->getFilename().c_str() );
if( ofs.fail() ) {
std::ostringstream oss;
oss << "Unable to open file: '" << config->getFilename() << "'";
throw std::domain_error( oss.str() );
}
config->setStreamBuf( ofs.rdbuf() );
}
}
RunContext context( m_config.get(), m_reporter ); Totals runTests( Ptr<Config> const& config ) {
std::ofstream ofs;
openStreamInto( config, ofs );
Ptr<IStreamingReporter> reporter = makeReporter( config );
RunContext context( config.get(), reporter );
Totals totals; Totals totals;
context.testGroupStarting( context.config()->name(), 1, 1 ); context.testGroupStarting( config->name(), 1, 1 );
TestSpec testSpec = m_config->testSpec(); TestSpec testSpec = config->testSpec();
if( !testSpec.hasFilters() ) if( !testSpec.hasFilters() )
testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests
std::vector<TestCase> testCases; std::vector<TestCase> testCases;
getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases ); getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *config, testCases );
int testsRunForGroup = 0; std::set<TestCase> testsAlreadyRun;
for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end(); for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
it != itEnd; it != itEnd;
++it ) { ++it ) {
testsRunForGroup++; if( testsAlreadyRun.find( *it ) == testsAlreadyRun.end() ) {
if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
if( context.aborting() ) if( context.aborting() )
break; break;
totals += context.runTest( *it ); totals += context.runTest( *it );
m_testsAlreadyRun.insert( *it ); testsAlreadyRun.insert( *it );
} }
} }
std::vector<TestCase> skippedTestCases; std::vector<TestCase> skippedTestCases;
getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, skippedTestCases, true ); getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *config, skippedTestCases, true );
for( std::vector<TestCase>::const_iterator it = skippedTestCases.begin(), itEnd = skippedTestCases.end(); for( std::vector<TestCase>::const_iterator it = skippedTestCases.begin(), itEnd = skippedTestCases.end();
it != itEnd; it != itEnd;
++it ) ++it )
m_reporter->skipTest( *it ); reporter->skipTest( *it );
context.testGroupEnded( context.config()->name(), totals, 1, 1 ); context.testGroupEnded( config->name(), totals, 1, 1 );
return totals; return totals;
} }
private:
void openStream() {
// Open output file, if specified
if( !m_config->getFilename().empty() ) {
m_ofs.open( m_config->getFilename().c_str() );
if( m_ofs.fail() ) {
std::ostringstream oss;
oss << "Unable to open file: '" << m_config->getFilename() << "'";
throw std::domain_error( oss.str() );
}
m_config->setStreamBuf( m_ofs.rdbuf() );
}
}
void makeReporter() {
std::string reporterName = m_config->getReporterName().empty()
? "console"
: m_config->getReporterName();
m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() );
if( !m_reporter ) {
std::ostringstream oss;
oss << "No reporter registered with name: '" << reporterName << "'";
throw std::domain_error( oss.str() );
}
}
private:
Ptr<Config> m_config;
std::ofstream m_ofs;
Ptr<IStreamingReporter> m_reporter;
std::set<TestCase> m_testsAlreadyRun;
};
void applyFilenamesAsTags() { void applyFilenamesAsTags() {
std::vector<TestCase> const& tests = getRegistryHub().getTestCaseRegistry().getAllTests(); std::vector<TestCase> const& tests = getRegistryHub().getTestCaseRegistry().getAllTests();
for(std::size_t i = 0; i < tests.size(); ++i ) { for(std::size_t i = 0; i < tests.size(); ++i ) {
@ -200,13 +187,11 @@ namespace Catch {
seedRng( *m_config ); seedRng( *m_config );
Runner runner( m_config );
// Handle list request // Handle list request
if( Option<std::size_t> listed = list( config() ) ) if( Option<std::size_t> listed = list( config() ) )
return static_cast<int>( *listed ); return static_cast<int>( *listed );
return static_cast<int>( runner.runTests().assertions.failed ); return static_cast<int>( runTests( m_config ).assertions.failed );
} }
catch( std::exception& ex ) { catch( std::exception& ex ) {
Catch::cerr() << ex.what() << std::endl; Catch::cerr() << ex.what() << std::endl;

View File

@ -52,8 +52,7 @@ namespace Catch {
return *this; return *this;
} }
void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } void swap( Ptr& other ) { std::swap( m_p, other.m_p ); }
T* get() { return m_p; } T* get() const{ return m_p; }
const T* get() const{ return m_p; }
T& operator*() const { return *m_p; } T& operator*() const { return *m_p; }
T* operator->() const { return m_p; } T* operator->() const { return m_p; }
bool operator !() const { return m_p == CATCH_NULL; } bool operator !() const { return m_p == CATCH_NULL; }