Added AnyMatch, AllMatch and NoneMatch

This commit is contained in:
Uriel García Rivas
2020-12-07 17:23:54 -06:00
committed by Martin Hořeňovský
parent ce54ec185f
commit 552af8920d
13 changed files with 518 additions and 10 deletions

View File

@@ -88,6 +88,7 @@ set(INTERNAL_HEADERS
${SOURCES_DIR}/matchers/catch_matchers_exception.hpp
${SOURCES_DIR}/matchers/catch_matchers_floating_point.hpp
${SOURCES_DIR}/matchers/catch_matchers_predicate.hpp
${SOURCES_DIR}/matchers/catch_matchers_quantifiers.hpp
${SOURCES_DIR}/matchers/catch_matchers_string.hpp
${SOURCES_DIR}/matchers/catch_matchers_templated.hpp
${SOURCES_DIR}/matchers/catch_matchers_vector.hpp

View File

@@ -26,6 +26,7 @@
#include <catch2/matchers/catch_matchers_exception.hpp>
#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_string.hpp>
#include <catch2/matchers/catch_matchers_templated.hpp>
#include <catch2/matchers/catch_matchers_vector.hpp>

View File

@@ -0,0 +1,109 @@
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
#ifndef CATCH_MATCHERS_QUANTIFIERS_HPP_INCLUDED
#define CATCH_MATCHERS_QUANTIFIERS_HPP_INCLUDED
#include <catch2/matchers/catch_matchers_templated.hpp>
#include <utility>
namespace Catch {
namespace Matchers {
// Matcher for checking that all elements in range matches a given matcher.
template <typename Matcher>
class AllMatchMatcher final : public MatcherGenericBase {
Matcher m_matcher;
public:
AllMatchMatcher(Matcher matcher):
m_matcher(std::move(matcher))
{}
std::string describe() const override {
return "all match " + m_matcher.describe();
}
template <typename RangeLike>
bool match(RangeLike&& rng) const {
for (auto&& elem : rng) {
if (!m_matcher.match(elem)) {
return false;
}
}
return true;
}
};
// Matcher for checking that no element in range matches a given matcher.
template <typename Matcher>
class NoneMatchMatcher final : public MatcherGenericBase {
Matcher m_matcher;
public:
NoneMatchMatcher(Matcher matcher):
m_matcher(std::move(matcher))
{}
std::string describe() const override {
return "none match " + m_matcher.describe();
}
template <typename RangeLike>
bool match(RangeLike&& rng) const {
for (auto&& elem : rng) {
if (m_matcher.match(elem)) {
return false;
}
}
return true;
}
};
// Matcher for checking that at least one element in range matches a given matcher.
template <typename Matcher>
class AnyMatchMatcher final : public MatcherGenericBase {
Matcher m_matcher;
public:
AnyMatchMatcher(Matcher matcher):
m_matcher(std::move(matcher))
{}
std::string describe() const override {
return "any match " + m_matcher.describe();
}
template <typename RangeLike>
bool match(RangeLike&& rng) const {
for (auto&& elem : rng) {
if (m_matcher.match(elem)) {
return true;
}
}
return false;
}
};
// Creates a matcher that checks whether a range contains element matching a matcher
template <typename Matcher>
AllMatchMatcher<Matcher> AllMatch(Matcher&& matcher) {
return { std::forward<Matcher>(matcher) };
}
// Creates a matcher that checks whether no element in a range matches a matcher.
template <typename Matcher>
NoneMatchMatcher<Matcher> NoneMatch(Matcher&& matcher) {
return { std::forward<Matcher>(matcher) };
}
// Creates a matcher that checks whether any element in a range matches a matcher.
template <typename Matcher>
AnyMatchMatcher<Matcher> AnyMatch(Matcher&& matcher) {
return { std::forward<Matcher>(matcher) };
}
}
}
#endif // CATCH_MATCHERS_QUANTIFIERS_HPP_INCLUDED