123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- /*
- * 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"
- #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
- #include "benchmark/catch_estimate.hpp"
- #include "benchmark/catch_outlier_classification.hpp"
- #endif // CATCH_CONFIG_ENABLE_BENCHMARKING
- #include <string>
- #include <iosfwd>
- #include <map>
- #include <set>
- #include <memory>
- #include <algorithm>
- 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;
- bool shouldReportAllAssertions = 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& ) = delete;
- AssertionStats& operator = ( AssertionStats && ) = delete;
- 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;
- };
- #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
- struct BenchmarkInfo {
- std::string name;
- double estimatedDuration;
- int iterations;
- int samples;
- unsigned int resamples;
- double clockResolution;
- double clockCost;
- };
- template <class Duration>
- struct BenchmarkStats {
- BenchmarkInfo info;
- std::vector<Duration> samples;
- Benchmark::Estimate<Duration> mean;
- Benchmark::Estimate<Duration> standardDeviation;
- Benchmark::OutlierClassification outliers;
- double outlierVariance;
- template <typename Duration2>
- operator BenchmarkStats<Duration2>() const {
- std::vector<Duration2> samples2;
- samples2.reserve(samples.size());
- std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });
- return {
- info,
- std::move(samples2),
- mean,
- standardDeviation,
- outliers,
- outlierVariance,
- };
- }
- };
- #endif // CATCH_CONFIG_ENABLE_BENCHMARKING
- 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 reportInvalidArguments(std::string const&) {}
-
- 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;
- #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
- virtual void benchmarkPreparing( std::string const& ) {}
- virtual void benchmarkStarting( BenchmarkInfo const& ) {}
- virtual void benchmarkEnded( BenchmarkStats<> const& ) {}
- virtual void benchmarkFailed( std::string const& ) {}
- #endif // CATCH_CONFIG_ENABLE_BENCHMARKING
- 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;
- 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
|