mirror of
https://github.com/catchorg/Catch2.git
synced 2025-11-01 20:49:33 +01:00
Merge branch 'dev-better-verbosity' of https://github.com/BMBurstein/Catch
This commit is contained in:
@@ -21,28 +21,62 @@ namespace Catch {
|
||||
// Returns double formatted as %.3f (format expected on output)
|
||||
std::string getFormattedDuration( double duration );
|
||||
|
||||
template<typename DerivedT>
|
||||
struct StreamingReporterBase : IStreamingReporter {
|
||||
|
||||
StreamingReporterBase(ReporterConfig const& _config);
|
||||
StreamingReporterBase( ReporterConfig const& _config )
|
||||
: m_config( _config.fullConfig() ),
|
||||
stream( _config.stream() )
|
||||
{
|
||||
m_reporterPrefs.shouldRedirectStdOut = false;
|
||||
CATCH_ENFORCE( DerivedT::getSupportedVerbosities().count( m_config->verbosity() ), "Verbosity level not supported by this reporter" );
|
||||
}
|
||||
|
||||
virtual ReporterPreferences getPreferences() const override;
|
||||
virtual ReporterPreferences getPreferences() const override {
|
||||
return m_reporterPrefs;
|
||||
}
|
||||
|
||||
virtual ~StreamingReporterBase() override;
|
||||
static std::set<Verbosity> getSupportedVerbosities() {
|
||||
return { Verbosity::Normal };
|
||||
}
|
||||
|
||||
virtual void noMatchingTestCases(std::string const&) override;
|
||||
virtual ~StreamingReporterBase() override = default;
|
||||
|
||||
virtual void testRunStarting(TestRunInfo const& _testRunInfo) override;
|
||||
virtual void testGroupStarting(GroupInfo const& _groupInfo) override;
|
||||
virtual void noMatchingTestCases(std::string const&) override {}
|
||||
|
||||
virtual void testCaseStarting(TestCaseInfo const& _testInfo) override;
|
||||
virtual void sectionStarting(SectionInfo const& _sectionInfo) override;
|
||||
virtual void testRunStarting(TestRunInfo const& _testRunInfo) override {
|
||||
currentTestRunInfo = _testRunInfo;
|
||||
}
|
||||
virtual void testGroupStarting(GroupInfo const& _groupInfo) override {
|
||||
currentGroupInfo = _groupInfo;
|
||||
}
|
||||
|
||||
virtual void sectionEnded(SectionStats const& /* _sectionStats */) override;
|
||||
virtual void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override;
|
||||
virtual void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override;
|
||||
virtual void testRunEnded(TestRunStats const& /* _testRunStats */) override;
|
||||
virtual void testCaseStarting(TestCaseInfo const& _testInfo) override {
|
||||
currentTestCaseInfo = _testInfo;
|
||||
}
|
||||
virtual void sectionStarting(SectionInfo const& _sectionInfo) override {
|
||||
m_sectionStack.push_back(_sectionInfo);
|
||||
}
|
||||
|
||||
virtual void skipTest(TestCaseInfo const&) override;
|
||||
virtual void sectionEnded(SectionStats const& /* _sectionStats */) override {
|
||||
m_sectionStack.pop_back();
|
||||
}
|
||||
virtual void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override {
|
||||
currentTestCaseInfo.reset();
|
||||
}
|
||||
virtual void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override {
|
||||
currentGroupInfo.reset();
|
||||
}
|
||||
virtual void testRunEnded(TestRunStats const& /* _testRunStats */) override {
|
||||
currentTestCaseInfo.reset();
|
||||
currentGroupInfo.reset();
|
||||
currentTestRunInfo.reset();
|
||||
}
|
||||
|
||||
virtual void skipTest(TestCaseInfo const&) override {
|
||||
// Don't do anything with this by default.
|
||||
// It can optionally be overridden in the derived class.
|
||||
}
|
||||
|
||||
IConfigPtr m_config;
|
||||
std::ostream& stream;
|
||||
@@ -55,6 +89,7 @@ namespace Catch {
|
||||
ReporterPreferences m_reporterPrefs;
|
||||
};
|
||||
|
||||
template<typename DerivedT>
|
||||
struct CumulativeReporterBase : IStreamingReporter {
|
||||
template<typename T, typename ChildNodeT>
|
||||
struct Node {
|
||||
@@ -66,11 +101,15 @@ namespace Catch {
|
||||
ChildNodes children;
|
||||
};
|
||||
struct SectionNode {
|
||||
explicit SectionNode(SectionStats const& _stats);
|
||||
virtual ~SectionNode();
|
||||
explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}
|
||||
virtual ~SectionNode() = default;
|
||||
|
||||
bool operator == (SectionNode const& other) const;
|
||||
bool operator == (std::shared_ptr<SectionNode> const& other) const;
|
||||
bool operator == (SectionNode const& other) const {
|
||||
return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
|
||||
}
|
||||
bool operator == (std::shared_ptr<SectionNode> const& other) const {
|
||||
return operator==(*other);
|
||||
}
|
||||
|
||||
SectionStats stats;
|
||||
using ChildSections = std::vector<std::shared_ptr<SectionNode>>;
|
||||
@@ -82,9 +121,11 @@ namespace Catch {
|
||||
};
|
||||
|
||||
struct BySectionInfo {
|
||||
BySectionInfo(SectionInfo const& other);
|
||||
BySectionInfo(BySectionInfo const& other);
|
||||
bool operator() (std::shared_ptr<SectionNode> const& node) const;
|
||||
BySectionInfo(SectionInfo const& other) : m_other(other) {}
|
||||
BySectionInfo(BySectionInfo const& other) : m_other(other.m_other) {}
|
||||
bool operator() (std::shared_ptr<SectionNode> const& node) const {
|
||||
return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
|
||||
}
|
||||
void operator=(BySectionInfo const&) = delete;
|
||||
|
||||
private:
|
||||
@@ -96,30 +137,105 @@ namespace Catch {
|
||||
using TestGroupNode = Node<TestGroupStats, TestCaseNode>;
|
||||
using TestRunNode = Node<TestRunStats, TestGroupNode>;
|
||||
|
||||
CumulativeReporterBase(ReporterConfig const& _config);
|
||||
~CumulativeReporterBase();
|
||||
CumulativeReporterBase( ReporterConfig const& _config )
|
||||
: m_config( _config.fullConfig() ),
|
||||
stream( _config.stream() )
|
||||
{
|
||||
m_reporterPrefs.shouldRedirectStdOut = false;
|
||||
CATCH_ENFORCE( DerivedT::getSupportedVerbosities().count( m_config->verbosity() ), "Verbosity level not supported by this reporter" );
|
||||
}
|
||||
virtual ~CumulativeReporterBase() = default;
|
||||
|
||||
virtual ReporterPreferences getPreferences() const override;
|
||||
virtual ReporterPreferences getPreferences() const override {
|
||||
return m_reporterPrefs;
|
||||
}
|
||||
|
||||
virtual void testRunStarting(TestRunInfo const&) override;
|
||||
virtual void testGroupStarting(GroupInfo const&) override;
|
||||
static std::set<Verbosity> getSupportedVerbosities() {
|
||||
return { Verbosity::Normal };
|
||||
}
|
||||
|
||||
virtual void testCaseStarting(TestCaseInfo const&) override;
|
||||
virtual void testRunStarting( TestRunInfo const& ) override {}
|
||||
virtual void testGroupStarting( GroupInfo const& ) override {}
|
||||
|
||||
virtual void sectionStarting(SectionInfo const& sectionInfo) override;
|
||||
virtual void testCaseStarting( TestCaseInfo const& ) override {}
|
||||
|
||||
virtual void assertionStarting(AssertionInfo const&) override;
|
||||
virtual void sectionStarting( SectionInfo const& sectionInfo ) override {
|
||||
SectionStats incompleteStats( sectionInfo, Counts(), 0, false );
|
||||
std::shared_ptr<SectionNode> node;
|
||||
if( m_sectionStack.empty() ) {
|
||||
if( !m_rootSection )
|
||||
m_rootSection = std::make_shared<SectionNode>( incompleteStats );
|
||||
node = m_rootSection;
|
||||
}
|
||||
else {
|
||||
SectionNode& parentNode = *m_sectionStack.back();
|
||||
typename SectionNode::ChildSections::const_iterator it =
|
||||
std::find_if( parentNode.childSections.begin(),
|
||||
parentNode.childSections.end(),
|
||||
BySectionInfo( sectionInfo ) );
|
||||
if( it == parentNode.childSections.end() ) {
|
||||
node = std::make_shared<SectionNode>( incompleteStats );
|
||||
parentNode.childSections.push_back( node );
|
||||
}
|
||||
else
|
||||
node = *it;
|
||||
}
|
||||
m_sectionStack.push_back( node );
|
||||
m_deepestSection = node;
|
||||
}
|
||||
|
||||
virtual bool assertionEnded(AssertionStats const& assertionStats) override;
|
||||
virtual void sectionEnded(SectionStats const& sectionStats) override;
|
||||
virtual void testCaseEnded(TestCaseStats const& testCaseStats) override;
|
||||
virtual void testGroupEnded(TestGroupStats const& testGroupStats) override;
|
||||
virtual void testRunEnded(TestRunStats const& testRunStats) override;
|
||||
virtual void assertionStarting(AssertionInfo const&) override {}
|
||||
|
||||
virtual bool assertionEnded(AssertionStats const& assertionStats) override {
|
||||
assert(!m_sectionStack.empty());
|
||||
SectionNode& sectionNode = *m_sectionStack.back();
|
||||
sectionNode.assertions.push_back(assertionStats);
|
||||
// AssertionResult holds a pointer to a temporary DecomposedExpression,
|
||||
// which getExpandedExpression() calls to build the expression string.
|
||||
// Our section stack copy of the assertionResult will likely outlive the
|
||||
// temporary, so it must be expanded or discarded now to avoid calling
|
||||
// a destroyed object later.
|
||||
prepareExpandedExpression(sectionNode.assertions.back().assertionResult);
|
||||
return true;
|
||||
}
|
||||
virtual void sectionEnded(SectionStats const& sectionStats) override {
|
||||
assert(!m_sectionStack.empty());
|
||||
SectionNode& node = *m_sectionStack.back();
|
||||
node.stats = sectionStats;
|
||||
m_sectionStack.pop_back();
|
||||
}
|
||||
virtual void testCaseEnded(TestCaseStats const& testCaseStats) override {
|
||||
auto node = std::make_shared<TestCaseNode>(testCaseStats);
|
||||
assert(m_sectionStack.size() == 0);
|
||||
node->children.push_back(m_rootSection);
|
||||
m_testCases.push_back(node);
|
||||
m_rootSection.reset();
|
||||
|
||||
assert(m_deepestSection);
|
||||
m_deepestSection->stdOut = testCaseStats.stdOut;
|
||||
m_deepestSection->stdErr = testCaseStats.stdErr;
|
||||
}
|
||||
virtual void testGroupEnded(TestGroupStats const& testGroupStats) override {
|
||||
auto node = std::make_shared<TestGroupNode>(testGroupStats);
|
||||
node->children.swap(m_testCases);
|
||||
m_testGroups.push_back(node);
|
||||
}
|
||||
virtual void testRunEnded(TestRunStats const& testRunStats) override {
|
||||
auto node = std::make_shared<TestRunNode>(testRunStats);
|
||||
node->children.swap(m_testGroups);
|
||||
m_testRuns.push_back(node);
|
||||
testRunEndedCumulative();
|
||||
}
|
||||
virtual void testRunEndedCumulative() = 0;
|
||||
|
||||
virtual void skipTest(TestCaseInfo const&) override;
|
||||
virtual void skipTest(TestCaseInfo const&) override {}
|
||||
|
||||
virtual void prepareExpandedExpression(AssertionResult& result) const;
|
||||
virtual void prepareExpandedExpression(AssertionResult& result) const {
|
||||
if (result.isOk())
|
||||
result.discardDecomposedExpression();
|
||||
else
|
||||
result.expandDecomposedExpression();
|
||||
}
|
||||
|
||||
IConfigPtr m_config;
|
||||
std::ostream& stream;
|
||||
@@ -147,8 +263,8 @@ namespace Catch {
|
||||
}
|
||||
|
||||
|
||||
struct TestEventListenerBase : StreamingReporterBase {
|
||||
TestEventListenerBase(ReporterConfig const& _config);
|
||||
struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> {
|
||||
TestEventListenerBase( ReporterConfig const& _config );
|
||||
|
||||
virtual void assertionStarting(AssertionInfo const&) override;
|
||||
virtual bool assertionEnded(AssertionStats const&) override;
|
||||
|
||||
Reference in New Issue
Block a user