mirror of
https://github.com/catchorg/Catch2.git
synced 2025-08-02 21:35:40 +02:00
Added ElementsAre and UnorderedElementsAre (#2377)
Co-authored-by: Garz4 <fancygarz4@gmail.com> Co-authored-by: Martin Hořeňovský <martin.horenovsky@gmail.com>
This commit is contained in:
@@ -252,6 +252,7 @@ set(MATCHER_HEADERS
|
||||
${SOURCES_DIR}/matchers/catch_matchers_all.hpp
|
||||
${SOURCES_DIR}/matchers/catch_matchers_container_properties.hpp
|
||||
${SOURCES_DIR}/matchers/catch_matchers_contains.hpp
|
||||
${SOURCES_DIR}/matchers/catch_matchers_range_equals.hpp
|
||||
${SOURCES_DIR}/matchers/catch_matchers_exception.hpp
|
||||
${SOURCES_DIR}/matchers/catch_matchers_floating_point.hpp
|
||||
${SOURCES_DIR}/matchers/catch_matchers_predicate.hpp
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include <catch2/matchers/catch_matchers_floating_point.hpp>
|
||||
#include <catch2/matchers/catch_matchers_predicate.hpp>
|
||||
#include <catch2/matchers/catch_matchers_quantifiers.hpp>
|
||||
#include <catch2/matchers/catch_matchers_range_equals.hpp>
|
||||
#include <catch2/matchers/catch_matchers_string.hpp>
|
||||
#include <catch2/matchers/catch_matchers_templated.hpp>
|
||||
#include <catch2/matchers/catch_matchers_vector.hpp>
|
||||
|
136
src/catch2/matchers/catch_matchers_range_equals.hpp
Normal file
136
src/catch2/matchers/catch_matchers_range_equals.hpp
Normal file
@@ -0,0 +1,136 @@
|
||||
|
||||
// Copyright Catch2 Authors
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE.txt or copy at
|
||||
// https://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
#ifndef CATCH_MATCHERS_RANGE_EQUALS_HPP_INCLUDED
|
||||
#define CATCH_MATCHERS_RANGE_EQUALS_HPP_INCLUDED
|
||||
|
||||
#include <algorithm>
|
||||
#include <catch2/matchers/catch_matchers_templated.hpp>
|
||||
#include <utility>
|
||||
|
||||
namespace Catch {
|
||||
namespace Matchers {
|
||||
|
||||
/**
|
||||
* Matcher for checking that an element contains the same
|
||||
* elements in the same order
|
||||
*/
|
||||
template <typename TargetRangeLike, typename Equality>
|
||||
class RangeEqualsMatcher final : public MatcherGenericBase {
|
||||
TargetRangeLike m_desired;
|
||||
Equality m_predicate;
|
||||
|
||||
public:
|
||||
template <typename TargetRangeLike2, typename Equality2>
|
||||
RangeEqualsMatcher( TargetRangeLike2&& range,
|
||||
Equality2&& predicate ):
|
||||
m_desired( CATCH_FORWARD( range ) ),
|
||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||
|
||||
template <typename RangeLike>
|
||||
bool match( RangeLike&& rng ) const {
|
||||
using std::begin;
|
||||
using std::end;
|
||||
return std::equal( begin(m_desired),
|
||||
end(m_desired),
|
||||
begin(rng),
|
||||
end(rng),
|
||||
m_predicate );
|
||||
}
|
||||
|
||||
std::string describe() const override {
|
||||
return "elements are " + Catch::Detail::stringify( m_desired );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Matcher for checking that an element contains the same
|
||||
* elements (but not necessarily in the same order)
|
||||
*/
|
||||
template <typename TargetRangeLike, typename Equality>
|
||||
class UnorderedRangeEqualsMatcher final : public MatcherGenericBase {
|
||||
TargetRangeLike m_desired;
|
||||
Equality m_predicate;
|
||||
|
||||
public:
|
||||
template <typename TargetRangeLike2, typename Equality2>
|
||||
UnorderedRangeEqualsMatcher( TargetRangeLike2&& range,
|
||||
Equality2&& predicate ):
|
||||
m_desired( CATCH_FORWARD( range ) ),
|
||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||
|
||||
template <typename RangeLike>
|
||||
bool match( RangeLike&& rng ) const {
|
||||
using std::begin;
|
||||
using std::end;
|
||||
return std::is_permutation( begin( m_desired ),
|
||||
end( m_desired ),
|
||||
begin( rng ),
|
||||
end( rng ),
|
||||
m_predicate );
|
||||
}
|
||||
|
||||
std::string describe() const override {
|
||||
return "unordered elements are " +
|
||||
::Catch::Detail::stringify( m_desired );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range.
|
||||
*
|
||||
* Uses `std::equal_to` to do the comparison
|
||||
*/
|
||||
template <typename RangeLike>
|
||||
std::enable_if_t<!Detail::is_matcher<RangeLike>::value,
|
||||
RangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
||||
RangeEquals( RangeLike&& range ) {
|
||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range.
|
||||
*
|
||||
* Uses to provided predicate `predicate` to do the comparisons
|
||||
*/
|
||||
template <typename RangeLike, typename Equality>
|
||||
RangeEqualsMatcher<RangeLike, Equality>
|
||||
RangeEquals( RangeLike&& range, Equality&& predicate ) {
|
||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range, in some permutation
|
||||
*
|
||||
* Uses `std::equal_to` to do the comparison
|
||||
*/
|
||||
template <typename RangeLike>
|
||||
std::enable_if_t<
|
||||
!Detail::is_matcher<RangeLike>::value,
|
||||
UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
||||
UnorderedRangeEquals( RangeLike&& range ) {
|
||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range, in some permuation.
|
||||
*
|
||||
* Uses to provided predicate `predicate` to do the comparisons
|
||||
*/
|
||||
template <typename RangeLike, typename Equality>
|
||||
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
||||
UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) {
|
||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||
}
|
||||
} // namespace Matchers
|
||||
} // namespace Catch
|
||||
|
||||
#endif // CATCH_MATCHERS_RANGE_EQUALS_HPP_INCLUDED
|
Reference in New Issue
Block a user