mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-08 23:29:53 +01:00
f00257e374
Catch2's documentation promises that listeners are called _before_ reporters, but because of the previous implementation, they were called _after_ reporters. This commit fixes that. Closes #1234
232 lines
7.7 KiB
C++
232 lines
7.7 KiB
C++
/*
|
|
* Created by Phil on 31/12/2010.
|
|
* Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
|
|
*
|
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
#ifndef TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
|
|
#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
|
|
|
|
#include "catch_section_info.h"
|
|
#include "catch_common.h"
|
|
#include "catch_config.hpp"
|
|
#include "catch_totals.h"
|
|
#include "catch_test_case_info.h"
|
|
#include "catch_assertionresult.h"
|
|
#include "catch_message.h"
|
|
#include "catch_option.hpp"
|
|
#include "catch_stringref.h"
|
|
|
|
|
|
#include <string>
|
|
#include <iosfwd>
|
|
#include <map>
|
|
#include <set>
|
|
#include <memory>
|
|
|
|
namespace Catch {
|
|
|
|
struct ReporterConfig {
|
|
explicit ReporterConfig( IConfigPtr const& _fullConfig );
|
|
|
|
ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream );
|
|
|
|
std::ostream& stream() const;
|
|
IConfigPtr fullConfig() const;
|
|
|
|
private:
|
|
std::ostream* m_stream;
|
|
IConfigPtr m_fullConfig;
|
|
};
|
|
|
|
struct ReporterPreferences {
|
|
bool shouldRedirectStdOut = false;
|
|
};
|
|
|
|
template<typename T>
|
|
struct LazyStat : Option<T> {
|
|
LazyStat& operator=( T const& _value ) {
|
|
Option<T>::operator=( _value );
|
|
used = false;
|
|
return *this;
|
|
}
|
|
void reset() {
|
|
Option<T>::reset();
|
|
used = false;
|
|
}
|
|
bool used = false;
|
|
};
|
|
|
|
struct TestRunInfo {
|
|
TestRunInfo( std::string const& _name );
|
|
std::string name;
|
|
};
|
|
struct GroupInfo {
|
|
GroupInfo( std::string const& _name,
|
|
std::size_t _groupIndex,
|
|
std::size_t _groupsCount );
|
|
|
|
std::string name;
|
|
std::size_t groupIndex;
|
|
std::size_t groupsCounts;
|
|
};
|
|
|
|
struct AssertionStats {
|
|
AssertionStats( AssertionResult const& _assertionResult,
|
|
std::vector<MessageInfo> const& _infoMessages,
|
|
Totals const& _totals );
|
|
|
|
AssertionStats( AssertionStats const& ) = default;
|
|
AssertionStats( AssertionStats && ) = default;
|
|
AssertionStats& operator = ( AssertionStats const& ) = default;
|
|
AssertionStats& operator = ( AssertionStats && ) = default;
|
|
virtual ~AssertionStats();
|
|
|
|
AssertionResult assertionResult;
|
|
std::vector<MessageInfo> infoMessages;
|
|
Totals totals;
|
|
};
|
|
|
|
struct SectionStats {
|
|
SectionStats( SectionInfo const& _sectionInfo,
|
|
Counts const& _assertions,
|
|
double _durationInSeconds,
|
|
bool _missingAssertions );
|
|
SectionStats( SectionStats const& ) = default;
|
|
SectionStats( SectionStats && ) = default;
|
|
SectionStats& operator = ( SectionStats const& ) = default;
|
|
SectionStats& operator = ( SectionStats && ) = default;
|
|
virtual ~SectionStats();
|
|
|
|
SectionInfo sectionInfo;
|
|
Counts assertions;
|
|
double durationInSeconds;
|
|
bool missingAssertions;
|
|
};
|
|
|
|
struct TestCaseStats {
|
|
TestCaseStats( TestCaseInfo const& _testInfo,
|
|
Totals const& _totals,
|
|
std::string const& _stdOut,
|
|
std::string const& _stdErr,
|
|
bool _aborting );
|
|
|
|
TestCaseStats( TestCaseStats const& ) = default;
|
|
TestCaseStats( TestCaseStats && ) = default;
|
|
TestCaseStats& operator = ( TestCaseStats const& ) = default;
|
|
TestCaseStats& operator = ( TestCaseStats && ) = default;
|
|
virtual ~TestCaseStats();
|
|
|
|
TestCaseInfo testInfo;
|
|
Totals totals;
|
|
std::string stdOut;
|
|
std::string stdErr;
|
|
bool aborting;
|
|
};
|
|
|
|
struct TestGroupStats {
|
|
TestGroupStats( GroupInfo const& _groupInfo,
|
|
Totals const& _totals,
|
|
bool _aborting );
|
|
TestGroupStats( GroupInfo const& _groupInfo );
|
|
|
|
TestGroupStats( TestGroupStats const& ) = default;
|
|
TestGroupStats( TestGroupStats && ) = default;
|
|
TestGroupStats& operator = ( TestGroupStats const& ) = default;
|
|
TestGroupStats& operator = ( TestGroupStats && ) = default;
|
|
virtual ~TestGroupStats();
|
|
|
|
GroupInfo groupInfo;
|
|
Totals totals;
|
|
bool aborting;
|
|
};
|
|
|
|
struct TestRunStats {
|
|
TestRunStats( TestRunInfo const& _runInfo,
|
|
Totals const& _totals,
|
|
bool _aborting );
|
|
|
|
TestRunStats( TestRunStats const& ) = default;
|
|
TestRunStats( TestRunStats && ) = default;
|
|
TestRunStats& operator = ( TestRunStats const& ) = default;
|
|
TestRunStats& operator = ( TestRunStats && ) = default;
|
|
virtual ~TestRunStats();
|
|
|
|
TestRunInfo runInfo;
|
|
Totals totals;
|
|
bool aborting;
|
|
};
|
|
|
|
struct BenchmarkInfo {
|
|
std::string name;
|
|
};
|
|
struct BenchmarkStats {
|
|
BenchmarkInfo info;
|
|
std::size_t iterations;
|
|
uint64_t elapsedTimeInNanoseconds;
|
|
};
|
|
|
|
struct IStreamingReporter {
|
|
virtual ~IStreamingReporter() = default;
|
|
|
|
// Implementing class must also provide the following static methods:
|
|
// static std::string getDescription();
|
|
// static std::set<Verbosity> getSupportedVerbosities()
|
|
|
|
virtual ReporterPreferences getPreferences() const = 0;
|
|
|
|
virtual void noMatchingTestCases( std::string const& spec ) = 0;
|
|
|
|
virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
|
|
virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
|
|
|
|
virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
|
|
virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
|
|
|
|
// *** experimental ***
|
|
virtual void benchmarkStarting( BenchmarkInfo const& ) {}
|
|
|
|
virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
|
|
|
|
// The return value indicates if the messages buffer should be cleared:
|
|
virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;
|
|
|
|
// *** experimental ***
|
|
virtual void benchmarkEnded( BenchmarkStats const& ) {}
|
|
|
|
virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
|
|
virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
|
|
virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
|
|
virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
|
|
|
|
virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
|
|
|
|
// Default empty implementation provided
|
|
virtual void fatalErrorEncountered( StringRef name );
|
|
|
|
virtual bool isMulti() const;
|
|
};
|
|
using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>;
|
|
|
|
struct IReporterFactory {
|
|
virtual ~IReporterFactory();
|
|
virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0;
|
|
virtual std::string getDescription() const = 0;
|
|
};
|
|
using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;
|
|
|
|
struct IReporterRegistry {
|
|
using FactoryMap = std::map<std::string, IReporterFactoryPtr>;
|
|
using Listeners = std::vector<IReporterFactoryPtr>;
|
|
|
|
virtual ~IReporterRegistry();
|
|
virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0;
|
|
virtual FactoryMap const& getFactories() const = 0;
|
|
virtual Listeners const& getListeners() const = 0;
|
|
};
|
|
|
|
} // end namespace Catch
|
|
|
|
#endif // TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
|