Added LazyStat wrapper

This commit is contained in:
Phil Nash 2013-08-08 08:24:37 +01:00
parent 29ccaa67ad
commit 1f519dd856
2 changed files with 35 additions and 20 deletions

View File

@ -60,6 +60,21 @@ namespace Catch
Node* parent; Node* parent;
}; };
template<typename T>
struct LazyStat : Option<T> {
LazyStat() : used( false ) {}
LazyStat& operator=( T const& _value ) {
Option<T>::operator=( _value );
used = false;
return *this;
}
void reset() {
Option<T>::reset();
used = false;
}
bool used;
};
struct TestRunInfo { struct TestRunInfo {
TestRunInfo( std::string const& _name ) : name( _name ) {} TestRunInfo( std::string const& _name ) : name( _name ) {}
std::string name; std::string name;
@ -235,14 +250,14 @@ namespace Catch
virtual void noMatchingTestCases( std::string const& ) {} virtual void noMatchingTestCases( std::string const& ) {}
virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { virtual void testRunStarting( TestRunInfo const& _testRunInfo ) {
testRunInfo = _testRunInfo; currentTestRunInfo = _testRunInfo;
} }
virtual void testGroupStarting( GroupInfo const& _groupInfo ) { virtual void testGroupStarting( GroupInfo const& _groupInfo ) {
unusedGroupInfo = _groupInfo; currentGroupInfo = _groupInfo;
} }
virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { virtual void testCaseStarting( TestCaseInfo const& _testInfo ) {
unusedTestCaseInfo = _testInfo; currentTestCaseInfo = _testInfo;
} }
virtual void sectionStarting( SectionInfo const& _sectionInfo ) { virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
Ptr<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _sectionInfo ); Ptr<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _sectionInfo );
@ -253,22 +268,22 @@ namespace Catch
m_sectionStack.pop_back(); m_sectionStack.pop_back();
} }
virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) {
unusedTestCaseInfo.reset(); currentTestCaseInfo.reset();
assert( m_sectionStack.empty() ); assert( m_sectionStack.empty() );
} }
virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) {
unusedGroupInfo.reset(); currentGroupInfo.reset();
} }
virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) {
unusedTestCaseInfo.reset(); currentTestCaseInfo.reset();
unusedGroupInfo.reset(); currentGroupInfo.reset();
testRunInfo.reset(); currentTestRunInfo.reset();
} }
Ptr<IConfig> m_config; Ptr<IConfig> m_config;
Option<TestRunInfo> testRunInfo; LazyStat<TestRunInfo> currentTestRunInfo;
Option<GroupInfo> unusedGroupInfo; LazyStat<GroupInfo> currentGroupInfo;
Option<TestCaseInfo> unusedTestCaseInfo; LazyStat<TestCaseInfo> currentTestCaseInfo;
std::ostream& stream; std::ostream& stream;
std::vector<SectionInfoNode> m_sectionStack; std::vector<SectionInfoNode> m_sectionStack;

View File

@ -79,7 +79,7 @@ namespace Catch {
m_headerPrinted = false; m_headerPrinted = false;
} }
virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) {
if( !unusedGroupInfo ) { if( currentGroupInfo.used ) {
printSummaryDivider(); printSummaryDivider();
stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
printTotals( _testGroupStats.totals ); printTotals( _testGroupStats.totals );
@ -229,9 +229,9 @@ namespace Catch {
void lazyPrint() { void lazyPrint() {
if( testRunInfo ) if( !currentTestRunInfo.used )
lazyPrintRunInfo(); lazyPrintRunInfo();
if( unusedGroupInfo ) if( !currentGroupInfo.used )
lazyPrintGroupInfo(); lazyPrintGroupInfo();
if( !m_headerPrinted ) { if( !m_headerPrinted ) {
@ -243,7 +243,7 @@ namespace Catch {
void lazyPrintRunInfo() { void lazyPrintRunInfo() {
stream << "\n" << getTildes() << "\n"; stream << "\n" << getTildes() << "\n";
Colour colour( Colour::SecondaryText ); Colour colour( Colour::SecondaryText );
stream << testRunInfo->name stream << currentTestRunInfo->name
<< " is a Catch v" << libraryVersion.majorVersion << "." << " is a Catch v" << libraryVersion.majorVersion << "."
<< libraryVersion.minorVersion << " b" << libraryVersion.minorVersion << " b"
<< libraryVersion.buildNumber; << libraryVersion.buildNumber;
@ -252,17 +252,17 @@ namespace Catch {
stream << " host application.\n" stream << " host application.\n"
<< "Run with -? for options\n\n"; << "Run with -? for options\n\n";
testRunInfo.reset(); currentTestRunInfo.used = true;
} }
void lazyPrintGroupInfo() { void lazyPrintGroupInfo() {
if( !unusedGroupInfo->name.empty() && unusedGroupInfo->groupsCounts > 1 ) { if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) {
printClosedHeader( "Group: " + unusedGroupInfo->name ); printClosedHeader( "Group: " + currentGroupInfo->name );
unusedGroupInfo.reset(); currentGroupInfo.used = true;
} }
} }
void printTestCaseAndSectionHeader() { void printTestCaseAndSectionHeader() {
assert( !m_sectionStack.empty() ); assert( !m_sectionStack.empty() );
printOpenHeader( unusedTestCaseInfo->name ); printOpenHeader( currentTestCaseInfo->name );
if( m_sectionStack.size() > 1 ) { if( m_sectionStack.size() > 1 ) {
Colour colourGuard( Colour::Headers ); Colour colourGuard( Colour::Headers );