mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-24 06:16:10 +01:00
e340ab8db6
* Units from <ratio> are no longer redeclared in our own namespace * The default clock is `steady_clock`, not `high_resolution_clock`, because, as HH says "high_resolution_clock is useless. If you want measure the passing of time, use steady_clock. If you want user friendly time, use system_clock". * Benchmarking support is opt-in, not opt-out, to avoid the large (~10%) compile time penalty. * Benchmarking-related options in CLI are always present, to decrease the amount of code that is only compiled conditionally and making the whole shebang more maintainble.
269 lines
9.1 KiB
C++
269 lines
9.1 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"
|
|
|
|
#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 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
|