6#ifndef MIMICPP_EXPECTATION_EXPECTATION_HPP
7#define MIMICPP_EXPECTATION_EXPECTATION_HPP
18#ifndef MIMICPP_DETAIL_IS_MODULE
23 #include <type_traits>
75 virtual ~Concept()
noexcept(
false)
79 Concept(
const Concept&) =
delete;
80 Concept&
operator=(
const Concept&) =
delete;
81 Concept(Concept&&) =
delete;
100 virtual std::optional<MatchResults>
matches(std::any&& opaqueCallInfo)
const = 0;
103 virtual std::any
consume(std::any&& opaqueCallInfo) = 0;
118 using CallInfoRef = std::reference_wrapper<call::info_for_signature_t<Signature>
const>;
120 using PolicyList = std::tuple<Policies...>;
122 template <
typename ControlPolicyArg,
typename FinalizerArg,
typename... PolicyArgs>
124 explicit constexpr Model(
127 ControlPolicyArg&& controlArg,
128 FinalizerArg&& finalizerArg,
129 PolicyArgs&&... args)
130 : m_From{std::move(
from)},
131 m_Target{std::move(target)},
132 m_ControlPolicy{std::forward<ControlPolicyArg>(controlArg)},
133 m_Policies{std::forward<PolicyArgs>(args)...},
134 m_Finalizer{std::forward<FinalizerArg>(finalizerArg)}
147 return m_Target.
name;
156 .controlReport = m_ControlPolicy.state(),
157 .finalizerDescription = std::nullopt,
164 return m_ControlPolicy.is_satisfied()
173 return std::holds_alternative<reporting::state_applicable>(m_ControlPolicy.state());
177 std::optional<MatchResults>
matches(std::any&& opaqueCallInfo)
const override
179 MIMICPP_ASSERT(opaqueCallInfo.has_value(),
"Empty call is not allowed.");
180 if (
auto const*
const info = std::any_cast<CallInfoRef>(&opaqueCallInfo))
182 return {gather_requirement_outcomes(info->get())};
189 std::any
consume(std::any&& opaqueCallInfo)
override
191 auto const*
const info = std::any_cast<CallInfoRef>(&opaqueCallInfo);
194 m_ControlPolicy.consume();
199 return finalize(info->get());
205 ControlPolicy m_ControlPolicy;
206 PolicyList m_Policies;
207 [[no_unique_address]] FinalizePolicy m_Finalizer{};
225 if constexpr (std::is_void_v<Return>)
227 m_Finalizer.finalize_call(
call);
228 result = std::make_any<call::ResultStorage<void>>();
232 result = std::make_any<call::ResultStorage<Return>>(m_Finalizer.finalize_call(
call));
284 std::in_place_type_t<Signature>
const ,
287 ControlPolicy controlPolicy,
288 FinalizePolicy finalizePolicy,
291 std::make_shared<Model<Signature, ControlPolicy, FinalizePolicy, Policies...>>(
294 std::move(controlPolicy),
295 std::move(finalizePolicy),
307 return m_Inner->from();
317 return m_Inner->mock_name();
327 return m_Inner->report();
337 return m_Inner->is_satisfied();
347 return m_Inner->is_applicable();
356 template <
typename Return,
typename... Args>
360 return m_Inner->matches(std::any{std::ref(callInfo)});
368 template <
typename Return,
typename... Args>
372 std::any opaqueResult = m_Inner->consume(std::any{std::ref(callInfo)});
373 auto*
const resultStorage = std::any_cast<call::ResultStorage<Return>>(&opaqueResult);
376 return resultStorage->extract();
383 std::shared_ptr<Concept> m_Inner;
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:54
bool is_satisfied() const noexcept
Queries all policies, whether they are satisfied.
Definition Expectation.hpp:335
bool is_applicable() const noexcept
Queries the control policy, whether it's in the applicable state.
Definition Expectation.hpp:345
Expectation & operator=(Expectation const &)=default
Defaulted copy-assignment-operator.
Expectation(std::in_place_type_t< Signature > const, util::SourceLocation from, reporting::TargetReport target, ControlPolicy controlPolicy, FinalizePolicy finalizePolicy, Policies... policies)
Constructs the expectation with the given arguments.
Definition Expectation.hpp:283
StringT const & mock_name() const noexcept
Returns the name of the related mock.
Definition Expectation.hpp:315
virtual ~Expectation()=default
Defaulted virtual destructor.
reporting::ExpectationReport report() const
Creates a report of the internal state.
Definition Expectation.hpp:325
util::SourceLocation const & from() const noexcept
Returns the source-location, where this expectation was created.
Definition Expectation.hpp:305
std::optional< MatchResults > matches(call::Info< Return, Args... > const &callInfo) const
Queries all policies, whether they accept the given call.
Definition Expectation.hpp:358
Expectation(Expectation &&)=default
Defaulted move-constructor.
friend bool operator==(Expectation const &, Expectation const &)=default
Return consume(call::Info< Return, Args... > const &callInfo)
Informs all policies that the given call was accepted.
Definition Expectation.hpp:370
Expectation & operator=(Expectation &&)=default
Defaulted move-assignment-operator.
Expectation(Expectation const &)=default
Defaulted copy-constructor.
Contains the extracted info from a typed expectation.
Definition ExpectationReport.hpp:85
Contains the extracted mock info.
Definition TargetReport.hpp:22
StringT name
Definition TargetReport.hpp:24
A thin wrapper around general source-location info.
Definition SourceLocation.hpp:33
Determines whether the given type satisfies the requirements of a control-policy.
Definition Common.hpp:75
Determines whether the given type satisfies the requirements of an expectation-policy for the given s...
Definition Common.hpp:49
Determines whether the given type satisfies the requirements of a finalize-policy for the given signa...
Definition Common.hpp:63
typename signature_return_type< Signature >::type signature_return_type_t
Convenience alias, exposing the type member alias of the actual type-trait.
Definition Fwd.hpp:230
typename info_for_signature< Signature >::type info_for_signature_t
Definition Call.hpp:47
Definition ArgumentList.hpp:24
Definition Builder.hpp:33
std::vector< MatchResult > MatchResults
Definition Common.hpp:42
std::basic_string< CharT, CharTraitsT > StringT
Definition Fwd.hpp:397