|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
/*
|
|
|
|
|
* Catch v2.12.1
|
|
|
|
|
* Generated: 2020-04-21 19:29:20.964532
|
|
|
|
|
* Catch v2.12.2
|
|
|
|
|
* Generated: 2020-05-25 15:09:23.791719
|
|
|
|
|
* ----------------------------------------------------------
|
|
|
|
|
* This file has been merged from multiple headers. Please don't edit it directly
|
|
|
|
|
* Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved.
|
|
|
|
@ -15,7 +15,7 @@
|
|
|
|
|
|
|
|
|
|
#define CATCH_VERSION_MAJOR 2
|
|
|
|
|
#define CATCH_VERSION_MINOR 12
|
|
|
|
|
#define CATCH_VERSION_PATCH 1
|
|
|
|
|
#define CATCH_VERSION_PATCH 2
|
|
|
|
|
|
|
|
|
|
#ifdef __clang__
|
|
|
|
|
# pragma clang system_header
|
|
|
|
@ -163,7 +163,7 @@ namespace Catch {
|
|
|
|
|
//
|
|
|
|
|
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
|
|
|
|
# if !defined(__ibmxl__)
|
|
|
|
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg) */
|
|
|
|
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
|
|
|
|
|
# endif
|
|
|
|
|
|
|
|
|
|
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
|
|
|
@ -944,13 +944,13 @@ namespace Catch {
|
|
|
|
|
|
|
|
|
|
#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
|
|
|
|
|
// std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
|
|
|
|
|
// replaced with std::invoke_result here. Also *_t format is preferred over
|
|
|
|
|
// typename *::type format.
|
|
|
|
|
template <typename Func, typename U>
|
|
|
|
|
using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>;
|
|
|
|
|
// replaced with std::invoke_result here.
|
|
|
|
|
template <typename Func, typename... U>
|
|
|
|
|
using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>;
|
|
|
|
|
#else
|
|
|
|
|
template <typename Func, typename U>
|
|
|
|
|
using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type;
|
|
|
|
|
// Keep ::type here because we still support C++11
|
|
|
|
|
template <typename Func, typename... U>
|
|
|
|
|
using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} // namespace Catch
|
|
|
|
@ -1988,20 +1988,27 @@ namespace Catch {
|
|
|
|
|
#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
|
|
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
struct not_this_one {}; // Tag type for detecting which begin/ end are being selected
|
|
|
|
|
|
|
|
|
|
// Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace
|
|
|
|
|
// Import begin/ end from std here
|
|
|
|
|
using std::begin;
|
|
|
|
|
using std::end;
|
|
|
|
|
|
|
|
|
|
not_this_one begin( ... );
|
|
|
|
|
not_this_one end( ... );
|
|
|
|
|
namespace detail {
|
|
|
|
|
template <typename...>
|
|
|
|
|
struct void_type {
|
|
|
|
|
using type = void;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T, typename = void>
|
|
|
|
|
struct is_range_impl : std::false_type {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type {
|
|
|
|
|
};
|
|
|
|
|
} // namespace detail
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
struct is_range {
|
|
|
|
|
static const bool value =
|
|
|
|
|
!std::is_same<decltype(begin(std::declval<T>())), not_this_one>::value &&
|
|
|
|
|
!std::is_same<decltype(end(std::declval<T>())), not_this_one>::value;
|
|
|
|
|
struct is_range : detail::is_range_impl<T> {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#if defined(_MANAGED) // Managed types are never ranges
|
|
|
|
@ -3714,8 +3721,6 @@ namespace Matchers {
|
|
|
|
|
struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
|
|
|
|
|
UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {}
|
|
|
|
|
bool match(std::vector<T, AllocMatch> const& vec) const override {
|
|
|
|
|
// Note: This is a reimplementation of std::is_permutation,
|
|
|
|
|
// because I don't want to include <algorithm> inside the common path
|
|
|
|
|
if (m_target.size() != vec.size()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
@ -6552,20 +6557,18 @@ namespace Catch {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
template <typename Sig>
|
|
|
|
|
using ResultOf_t = typename std::result_of<Sig>::type;
|
|
|
|
|
|
|
|
|
|
// invoke and not return void :(
|
|
|
|
|
template <typename Fun, typename... Args>
|
|
|
|
|
CompleteType_t<ResultOf_t<Fun(Args...)>> complete_invoke(Fun&& fun, Args&&... args) {
|
|
|
|
|
return CompleteInvoker<ResultOf_t<Fun(Args...)>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);
|
|
|
|
|
CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) {
|
|
|
|
|
return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
|
|
|
|
|
} // namespace Detail
|
|
|
|
|
|
|
|
|
|
template <typename Fun>
|
|
|
|
|
Detail::CompleteType_t<Detail::ResultOf_t<Fun()>> user_code(Fun&& fun) {
|
|
|
|
|
Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {
|
|
|
|
|
CATCH_TRY{
|
|
|
|
|
return Detail::complete_invoke(std::forward<Fun>(fun));
|
|
|
|
|
} CATCH_CATCH_ALL{
|
|
|
|
@ -6810,8 +6813,8 @@ namespace Catch {
|
|
|
|
|
Result result;
|
|
|
|
|
int iterations;
|
|
|
|
|
};
|
|
|
|
|
template <typename Clock, typename Sig>
|
|
|
|
|
using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<Detail::ResultOf_t<Sig>>>;
|
|
|
|
|
template <typename Clock, typename Func, typename... Args>
|
|
|
|
|
using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>;
|
|
|
|
|
} // namespace Benchmark
|
|
|
|
|
} // namespace Catch
|
|
|
|
|
|
|
|
|
@ -6822,7 +6825,7 @@ namespace Catch {
|
|
|
|
|
namespace Benchmark {
|
|
|
|
|
namespace Detail {
|
|
|
|
|
template <typename Clock, typename Fun, typename... Args>
|
|
|
|
|
TimingOf<Clock, Fun(Args...)> measure(Fun&& fun, Args&&... args) {
|
|
|
|
|
TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
|
|
|
|
|
auto start = Clock::now();
|
|
|
|
|
auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);
|
|
|
|
|
auto end = Clock::now();
|
|
|
|
@ -6841,11 +6844,11 @@ namespace Catch {
|
|
|
|
|
namespace Benchmark {
|
|
|
|
|
namespace Detail {
|
|
|
|
|
template <typename Clock, typename Fun>
|
|
|
|
|
TimingOf<Clock, Fun(int)> measure_one(Fun&& fun, int iters, std::false_type) {
|
|
|
|
|
TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) {
|
|
|
|
|
return Detail::measure<Clock>(fun, iters);
|
|
|
|
|
}
|
|
|
|
|
template <typename Clock, typename Fun>
|
|
|
|
|
TimingOf<Clock, Fun(Chronometer)> measure_one(Fun&& fun, int iters, std::true_type) {
|
|
|
|
|
TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) {
|
|
|
|
|
Detail::ChronometerModel<Clock> meter;
|
|
|
|
|
auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));
|
|
|
|
|
|
|
|
|
@ -6862,7 +6865,7 @@ namespace Catch {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename Clock, typename Fun>
|
|
|
|
|
TimingOf<Clock, Fun(run_for_at_least_argument_t<Clock, Fun>)> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
|
|
|
|
|
TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
|
|
|
|
|
auto iters = seed;
|
|
|
|
|
while (iters < (1 << 30)) {
|
|
|
|
|
auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());
|
|
|
|
@ -11768,10 +11771,10 @@ namespace Catch {
|
|
|
|
|
|
|
|
|
|
Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {
|
|
|
|
|
auto trimmed = [&] (size_t start, size_t end) {
|
|
|
|
|
while (names[start] == ',' || isspace(names[start])) {
|
|
|
|
|
while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {
|
|
|
|
|
++start;
|
|
|
|
|
}
|
|
|
|
|
while (names[end] == ',' || isspace(names[end])) {
|
|
|
|
|
while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) {
|
|
|
|
|
--end;
|
|
|
|
|
}
|
|
|
|
|
return names.substr(start, end - start + 1);
|
|
|
|
@ -15159,7 +15162,7 @@ namespace Catch {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Version const& libraryVersion() {
|
|
|
|
|
static Version version( 2, 12, 1, "", 0 );
|
|
|
|
|
static Version version( 2, 12, 2, "", 0 );
|
|
|
|
|
return version;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -16738,6 +16741,11 @@ namespace Catch {
|
|
|
|
|
xml.writeAttribute( "name", name );
|
|
|
|
|
}
|
|
|
|
|
xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) );
|
|
|
|
|
// This is not ideal, but it should be enough to mimic gtest's
|
|
|
|
|
// junit output.
|
|
|
|
|
// Ideally the JUnit reporter would also handle `skipTest`
|
|
|
|
|
// events and write those out appropriately.
|
|
|
|
|
xml.writeAttribute( "status", "run" );
|
|
|
|
|
|
|
|
|
|
writeAssertions( sectionNode );
|
|
|
|
|
|
|
|
|
|