6#ifndef MIMICPP_MATCHERS_RANGE_MATCHERS_HPP
7#define MIMICPP_MATCHERS_RANGE_MATCHERS_HPP
15#ifndef MIMICPP_DETAIL_IS_MODULE
24namespace mimicpp::matches::range::detail
26#if MIMICPP_DETAIL_IS_GCC \
30 template <std::ranges::range Range>
32 constexpr auto store(Range&&
range)
34 if constexpr (std::ranges::view<std::decay_t<Range>>)
36 return std::forward<Range>(
range);
38 else if constexpr (
requires { std::ranges::ref_view{std::declval<Range>()}; })
40 return std::ranges::ref_view{std::forward<Range>(
range)};
44 return std::forward<Range>(
range);
49 constexpr auto store = std::views::all;
70 template <std::ranges::forward_range Range,
typename Comparator = std::equal_to<>>
72 constexpr auto eq(Range&& expected, Comparator comparator = Comparator{})
75 [comp = std::move(comparator)]<
typename Target>(Target&& target,
auto&
range)
76 requires std::predicate<
78 std::ranges::range_reference_t<Target>,
79 std::ranges::range_reference_t<Range>>
81 return std::ranges::equal(
87 "elements are not {}",
88 std::make_tuple(detail::store(std::forward<Range>(expected)))};
98 template <std::ranges::forward_range Range,
typename Comparator = std::equal_to<>>
100 constexpr auto unordered_eq(Range&& expected, Comparator comparator = Comparator{})
103 [comp = std::move(comparator)]<
typename Target>(Target&& target,
auto&
range)
104 requires std::predicate<
106 std::ranges::range_reference_t<Target>,
107 std::ranges::range_reference_t<Range>>
109 return std::ranges::is_permutation(
114 "is a permutation of {}",
115 "is not a permutation of {}",
116 std::make_tuple(detail::store(std::forward<Range>(expected)))};
124 template <
typename Relation = std::ranges::less>
126 constexpr auto is_sorted(Relation relation = Relation{})
129 [rel = std::move(relation)]<
typename Target>(Target&& target)
130 requires std::equivalence_relation<
132 std::ranges::range_reference_t<Target>,
133 std::ranges::range_reference_t<Target>>
135 return std::ranges::is_sorted(
140 "is an unsorted range"};
150 [](std::ranges::range
auto&& target) {
151 return std::ranges::empty(target);
154 "is not an empty range"};
162 constexpr auto has_size(
const std::integral
auto expected)
165 [](std::ranges::range
auto&& target,
const std::integral
auto size) {
166 return std::cmp_equal(
168 std::ranges::size(target));
171 "has different size than {}",
172 std::make_tuple(expected)};
179 template <
typename Matcher>
183 using MatcherType = std::remove_cvref_t<Matcher>;
184 using arg_storage = mimicpp::detail::arg_storage<
187 mimicpp::detail::describe_hook::describe_fn>;
190 []<std::ranges::range Range>(Range&& target, MatcherType
const& m) {
191 return std::ranges::all_of(
192 std::forward<Range>(target),
193 [&](
auto&& element) {
194 return std::holds_alternative<expectation::MatchSuccess>(mimicpp::detail::matches_hook::matches(m, element));
197 "each el in range: el {}",
198 "not each el in range: el {}",
199 std::tuple<arg_storage>{std::forward<Matcher>(matcher)}};
206 template <
typename Matcher>
210 using MatcherType = std::remove_cvref_t<Matcher>;
211 using arg_storage = mimicpp::detail::arg_storage<
214 mimicpp::detail::describe_hook::describe_fn>;
217 []<std::ranges::range Range>(Range&& target, MatcherType
const& m) {
218 return std::ranges::any_of(
219 std::forward<Range>(target),
220 [&](
auto&& element) {
221 return std::holds_alternative<expectation::MatchSuccess>(mimicpp::detail::matches_hook::matches(m, element));
224 "any el in range: el {}",
225 "none el in range: el {}",
226 std::tuple<arg_storage>{std::forward<Matcher>(matcher)}};
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Generic matcher and the basic building block of most of the built-in matchers.
Definition GeneralMatchers.hpp:78
constexpr auto eq(Range &&expected, Comparator comparator=Comparator{})
Tests, whether the target range compares equal to the expected range, by comparing them element-wise.
Definition RangeMatchers.hpp:72
constexpr auto each_element(Matcher &&matcher)
Tests, whether each element of the target range matches the specified matcher.
Definition RangeMatchers.hpp:181
constexpr auto unordered_eq(Range &&expected, Comparator comparator=Comparator{})
Tests, whether the target range is a permutation of the expected range, by comparing them element-wis...
Definition RangeMatchers.hpp:100
constexpr auto any_element(Matcher &&matcher)
Tests, whether any element of the target range matches the specified matcher.
Definition RangeMatchers.hpp:208
constexpr auto has_size(const std::integral auto expected)
Tests, whether the target range has the expected size.
Definition RangeMatchers.hpp:162
constexpr auto is_sorted(Relation relation=Relation{})
Tests, whether the target range is sorted, by applying the relation on each adjacent elements.
Definition RangeMatchers.hpp:126
constexpr auto is_empty()
Tests, whether the target range is empty.
Definition RangeMatchers.hpp:147
Definition RangeMatchers.hpp:25