6#ifndef MIMICPP_EXPECTATION_BUILDER_HPP
7#define MIMICPP_EXPECTATION_BUILDER_HPP
27#ifndef MIMICPP_DETAIL_IS_MODULE
38 typename SequenceConfig,
40 typename FinalizePolicy,
51 template <
typename FinalizePolicyArg,
typename PolicyListArg>
52 requires std::constructible_from<FinalizePolicy, FinalizePolicyArg>
53 && std::constructible_from<PolicyListT, PolicyListArg>
56 std::shared_ptr<StorageT> storage,
58 detail::TimesConfig timesConfig,
59 SequenceConfig sequenceConfig,
60 FinalizePolicyArg&& finalizePolicyArg,
61 PolicyListArg&& policyListArg) noexcept
62 : m_Storage{std::move(storage)},
63 m_TargetReport{std::move(target)},
64 m_TimesConfig{std::move(timesConfig)},
65 m_SequenceConfig{std::move(sequenceConfig)},
66 m_FinalizePolicy{std::forward<FinalizePolicyArg>(finalizePolicyArg)},
67 m_ExpectationPolicies{std::forward<PolicyListArg>(policyListArg)}
79 template <
typename Policy>
85 !std::same_as<expectation_policies::InitFinalize, std::remove_cvref_t<Policy>>,
86 "Explicitly specifying the `expectation_policies::InitFinalize` is disallowed.");
89 std::same_as<expectation_policies::InitFinalize, FinalizePolicy>,
90 "Only one finalize-policy may be specified per expectation. "
91 "See: https://dnkpp.github.io/mimicpp/db/d7a/group___e_x_p_e_c_t_a_t_i_o_n___f_i_n_a_l_i_z_e_r.html#details");
97 std::remove_cvref_t<Policy>,
101 std::move(builder.m_Storage),
102 std::move(builder.m_TargetReport),
103 std::move(builder.m_TimesConfig),
104 std::move(builder.m_SequenceConfig),
105 std::forward<Policy>(policy),
106 std::move(builder.m_ExpectationPolicies)};
109 template <
typename Policy>
120 std::remove_cvref_t<Policy>>;
122 return ExtendedExpectationBuilderT{
123 std::move(builder.m_Storage),
124 std::move(builder.m_TargetReport),
125 std::move(builder.m_TimesConfig),
126 std::move(builder.m_SequenceConfig),
127 std::move(builder.m_FinalizePolicy),
129 std::move(builder.m_ExpectationPolicies),
130 std::forward_as_tuple(std::forward<Policy>(policy)))};
138 "Only one times-policy may be specified per expectation. "
139 "See: https://dnkpp.github.io/mimicpp/d7/d32/group___e_x_p_e_c_t_a_t_i_o_n___t_i_m_e_s.html#details");
149 std::move(builder.m_Storage),
150 std::move(builder.m_TargetReport),
152 std::move(builder.m_SequenceConfig),
153 std::move(builder.m_FinalizePolicy),
154 std::move(builder.m_ExpectationPolicies)};
157 template <
typename... Sequences>
161 sequence::detail::Config newConfig = builder.m_SequenceConfig.concat(std::move(config));
170 return ExtendedExpectationBuilderT{
171 std::move(builder.m_Storage),
172 std::move(builder.m_TargetReport),
173 std::move(builder.m_TimesConfig),
174 std::move(newConfig),
175 std::move(builder.m_FinalizePolicy),
176 std::move(builder.m_ExpectationPolicies)};
184 "For non-void return types, a finalize-policy must be specified. "
185 "See: https://dnkpp.github.io/mimicpp/db/d7a/group___e_x_p_e_c_t_a_t_i_o_n___f_i_n_a_l_i_z_e_r.html#details");
188 std::move(m_Storage),
190 [&](
auto&... policies) {
193 std::move(m_TimesConfig),
194 std::move(m_SequenceConfig)};
198 decltype(controlPolicy),
202 return std::make_unique<Expectation>(
203 std::move(sourceLocation),
204 std::move(m_TargetReport),
205 std::move(controlPolicy),
206 std::move(m_FinalizePolicy),
207 std::move(policies)...);
209 m_ExpectationPolicies)};
213 std::shared_ptr<StorageT> m_Storage;
215 detail::TimesConfig m_TimesConfig{};
216 SequenceConfig m_SequenceConfig{};
217 FinalizePolicy m_FinalizePolicy{};
222namespace mimicpp::detail
224 template <
typename Param,
typename... Canary, matcher_for<Param> Arg>
226 constexpr auto make_arg_matcher([[maybe_unused]] util::priority_tag<2>
const, Arg arg)
234 template <
string Param,
typename... Canary,
string Arg>
235 requires(!std::is_pointer_v<std::remove_reference_t<Param>>)
236 || (!std::is_pointer_v<std::remove_reference_t<Arg>>)
238 constexpr auto make_arg_matcher([[maybe_unused]] util::priority_tag<1>
const, Arg&& arg)
243 template <
typename Param,
typename... Canary, util::weakly_equality_comparable_with<Param> Arg>
245 constexpr auto make_arg_matcher([[maybe_unused]] util::priority_tag<0>
const, Arg&& arg)
250 inline constexpr util::priority_tag<2> maxMakeArgMatcherTag{};
252 template <
typename Arg,
typename Target>
253 concept requirement_for =
requires {
255 detail::make_arg_matcher<Target>(maxMakeArgMatcherTag, std::declval<Arg>())
256 } -> matcher_for<Target>;
265 requires requirement_for<Arg, Param>
266 constexpr auto make_arg_policy(Arg&& arg)
269 detail::make_arg_matcher<Param>(maxMakeArgMatcherTag, std::forward<Arg>(arg)));
272 template <
typename Signature,
typename Builder, std::size_t... indices,
typename... Args>
274 constexpr auto extend_builder_with_arg_policies(
276 [[maybe_unused]] std::index_sequence<indices...>
const,
280 std::forward<Builder>(builder)
282 && detail::make_arg_policy<Signature, indices>(std::forward<Args>(args)));
285 template <
typename Signature,
typename... Args>
286 constexpr auto make_expectation_builder(
287 std::shared_ptr<ExpectationCollection<Signature>> expectations,
288 reporting::TargetReport target,
291 using BaseBuilderT = BasicExpectationBuilder<
293 sequence::detail::Config<>,
295 expectation_policies::InitFinalize>;
297 return detail::extend_builder_with_arg_policies<Signature>(
299 std::move(expectations),
302 sequence::detail::Config<>{},
303 expectation_policies::InitFinalize{},
305 std::index_sequence_for<Args...>{},
306 std::forward<Args>(args)...);
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:51
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
ScopedExpectation finalize(util::SourceLocation sourceLocation) &&
Definition ExpectationBuilder.hpp:180
BasicExpectationBuilder(BasicExpectationBuilder &&)=default
friend constexpr auto operator&&(BasicExpectationBuilder &&builder, Policy &&policy)
Definition ExpectationBuilder.hpp:112
BasicExpectationBuilder & operator=(BasicExpectationBuilder &&)=default
friend constexpr auto operator&&(BasicExpectationBuilder &&builder, detail::TimesConfig &&config)
Definition ExpectationBuilder.hpp:134
ExpectationCollection< Signature > StorageT
Definition ExpectationBuilder.hpp:45
friend constexpr auto operator&&(BasicExpectationBuilder &&builder, sequence::detail::Config< Sequences... > &&config)
Definition ExpectationBuilder.hpp:159
std::tuple< Policies... > PolicyListT
Definition ExpectationBuilder.hpp:46
BasicExpectationBuilder & operator=(const BasicExpectationBuilder &)=delete
typename Expectation< Signature >::ReturnT ReturnT
Definition ExpectationBuilder.hpp:47
BasicExpectationBuilder(const BasicExpectationBuilder &)=delete
friend constexpr auto operator&&(BasicExpectationBuilder &&builder, Policy &&policy)
Definition ExpectationBuilder.hpp:82
constexpr BasicExpectationBuilder(std::shared_ptr< StorageT > storage, reporting::TargetReport target, detail::TimesConfig timesConfig, SequenceConfig sequenceConfig, FinalizePolicyArg &&finalizePolicyArg, PolicyListArg &&policyListArg) noexcept
Definition ExpectationBuilder.hpp:55
~BasicExpectationBuilder()=default
The actual expectation template.
Definition Expectation.hpp:487
Definition ControlPolicies.hpp:161
Collects all expectations for a specific (decayed) signature.
Definition Expectation.hpp:258
The base interface for expectations.
Definition Expectation.hpp:148
signature_return_type_t< Signature > ReturnT
The return type.
Definition Expectation.hpp:158
Takes the ownership of an expectation and check whether it's satisfied during destruction.
Definition Expectation.hpp:645
Contains the extracted mock info.
Definition TargetReport.hpp:22
A thin wrapper around general source-location info.
Definition SourceLocation.hpp:38
Determines, whether the given type satisfies the requirements of an expectation-policy for the given ...
Definition Expectation.hpp:439
Determines, whether the given type satisfies the requirements of a finalize-policy for the given sign...
Definition Expectation.hpp:453
constexpr auto arg(Matcher &&matcher, Projection &&projection={}) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Matcher >, Matcher > &&std::is_nothrow_constructible_v< std::remove_cvref_t< Projection >, Projection >)
Checks whether the selected argument satisfies the given matcher.
Definition ArgRequirementPolicies.hpp:207
constexpr auto eq(Pattern &&pattern)
Tests, whether the target string compares equal to the expected string.
Definition StringMatchers.hpp:157
constexpr auto eq(T &&value)
Tests, whether the target compares equal to the expected value.
Definition GeneralMatchers.hpp:306
typename signature_param_type< index, Signature >::type signature_param_type_t
Convenience alias, exposing the type member alias of the actual type-trait.
Definition Fwd.hpp:278