6#ifndef MIMICPP_MOCK_HPP
7#define MIMICPP_MOCK_HPP
16namespace mimicpp::detail
18 template <
typename T,
typename Target>
19 concept requirement_for = std::equality_comparable_with<T, Target>
20 || matcher_for<std::remove_cvref_t<T>, Target>;
23 class BasicMockFrontend
26 using ExpectationCollectionT = ExpectationCollection<Return(Params...)>;
29 explicit BasicMockFrontend(
30 std::shared_ptr<ExpectationCollectionT> collection
32 : m_Expectations{std::move(collection)}
37 constexpr Return handle_call(
38 std::tuple<std::reference_wrapper<std::remove_reference_t<Params>>...> params,
39 const std::source_location& from
42 using CallInfoT = call::Info<Return, Params...>;
44 return m_Expectations->handle_call(
46 .args = std::move(params),
47 .fromCategory = category,
48 .fromConstness = constness,
49 .fromSourceLocation = from
53 template <
typename... Args>
54 requires (... && requirement_for<Args, Params>)
56 constexpr auto make_expectation_builder(Args&&... args)
const
58 return detail::make_expectation_builder(
60 std::forward<Args>(args)...)
61 && expectation_policies::Category<category>{}
62 && expectation_policies::Constness<constness>{};
66 std::shared_ptr<ExpectationCollectionT> m_Expectations;
69 template <
typename Signature>
72 template <
typename Return,
typename... Params>
73 class MockFrontend<Return(Params...)>
74 :
protected BasicMockFrontend<
80 using SuperT = BasicMockFrontend<
87 using SignatureT = Return(Params...);
89 constexpr Return operator ()(Params... params,
const std::source_location& from = std::source_location::current())
91 return SuperT::handle_call(
92 std::tuple{std::ref(params)...},
96 template <
typename... Args>
97 requires (... && requirement_for<Args, Params>)
99 constexpr auto expect_call(Args&&... args)
101 return SuperT::make_expectation_builder(
102 std::forward<Args>(args)...);
106 using SuperT::SuperT;
109 template <
typename Return,
typename... Params>
110 class MockFrontend<Return(Params...) const>
111 :
protected BasicMockFrontend<
117 using SuperT = BasicMockFrontend<
124 using SignatureT = Return(Params...)
const;
126 constexpr Return operator ()(Params... params,
const std::source_location& from = std::source_location::current())
const
128 return SuperT::handle_call(
129 std::tuple{std::ref(params)...},
133 template <
typename... Args>
134 requires (... && requirement_for<Args, Params>)
136 constexpr auto expect_call(Args&&... args)
const
138 return SuperT::make_expectation_builder(
139 std::forward<Args>(args)...);
143 using SuperT::SuperT;
146 template <
typename Return,
typename... Params>
147 class MockFrontend<Return(Params...) &>
148 :
protected BasicMockFrontend<
154 using SuperT = BasicMockFrontend<
161 using SignatureT = Return(Params...) &;
163 constexpr Return operator ()(Params... params,
const std::source_location& from = std::source_location::current()) &
165 return SuperT::handle_call(
166 std::tuple{std::ref(params)...},
170 template <
typename... Args>
171 requires (... && requirement_for<Args, Params>)
173 constexpr auto expect_call(Args&&... args) &
175 return SuperT::make_expectation_builder(
176 std::forward<Args>(args)...);
180 using SuperT::SuperT;
183 template <
typename Return,
typename... Params>
184 class MockFrontend<Return(Params...) const &>
185 :
protected BasicMockFrontend<
191 using SuperT = BasicMockFrontend<
198 using SignatureT = Return(Params...) const &;
200 constexpr Return operator ()(Params... params, const std::source_location& from = std::source_location::current()) const &
202 return SuperT::handle_call(
203 std::tuple{std::ref(params)...},
207 template <
typename... Args>
208 requires (... && requirement_for<Args, Params>)
210 constexpr auto expect_call(Args&&... args)
const &
212 return SuperT::make_expectation_builder(
213 std::forward<Args>(args)...);
217 using SuperT::SuperT;
220 template <
typename Return,
typename... Params>
221 class MockFrontend<Return(Params...) &&>
222 :
protected BasicMockFrontend<
228 using SuperT = BasicMockFrontend<
235 using SignatureT = Return(Params...) &&;
237 constexpr Return operator ()(Params... params,
const std::source_location& from = std::source_location::current()) &&
239 return SuperT::handle_call(
240 std::tuple{std::ref(params)...},
244 template <
typename... Args>
245 requires (... && requirement_for<Args, Params>)
247 constexpr auto expect_call(Args&&... args) &&
249 return SuperT::make_expectation_builder(
250 std::forward<Args>(args)...);
254 using SuperT::SuperT;
257 template <
typename Return,
typename... Params>
258 class MockFrontend<Return(Params...) const &&>
259 :
protected BasicMockFrontend<
265 using SuperT = BasicMockFrontend<
272 using SignatureT = Return(Params...) const &&;
274 constexpr Return operator ()(Params... params, const std::source_location& from = std::source_location::current()) const &&
276 return SuperT::handle_call(
277 std::tuple{std::ref(params)...},
281 template <
typename... Args>
282 requires (... && requirement_for<Args, Params>)
284 constexpr auto expect_call(Args&&... args)
const &&
286 return SuperT::make_expectation_builder(
287 std::forward<Args>(args)...);
291 using SuperT::SuperT;
294 template <
typename Return,
typename... Params>
295 class MockFrontend<Return(Params...) noexcept>
296 :
protected BasicMockFrontend<
298 Constness::non_const,
302 using SuperT = BasicMockFrontend<
309 using SignatureT = Return(Params...) noexcept;
311 constexpr Return operator ()(Params... params, const std::source_location& from = std::source_location::current()) noexcept
313 return SuperT::handle_call(
314 std::tuple{std::ref(params)...},
318 template <
typename... Args>
319 requires (... && requirement_for<Args, Params>)
321 constexpr auto expect_call(Args&&... args)
323 return SuperT::make_expectation_builder(
324 std::forward<Args>(args)...);
328 using SuperT::SuperT;
331 template <
typename Return,
typename... Params>
332 class MockFrontend<Return(Params...) const noexcept>
333 :
protected BasicMockFrontend<
339 using SuperT = BasicMockFrontend<
346 using SignatureT = Return(Params...) const noexcept;
348 constexpr Return operator ()(
350 const std::source_location& from = std::source_location::current()
353 return SuperT::handle_call(
354 std::tuple{std::ref(params)...},
358 template <
typename... Args>
359 requires (... && requirement_for<Args, Params>)
361 constexpr auto expect_call(Args&&... args)
const
363 return SuperT::make_expectation_builder(
364 std::forward<Args>(args)...);
368 using SuperT::SuperT;
371 template <
typename Return,
typename... Params>
372 class MockFrontend<Return(Params...) &
noexcept>
373 :
protected BasicMockFrontend<
379 using SuperT = BasicMockFrontend<
386 using SignatureT = Return(Params...) &
noexcept;
388 constexpr Return operator ()(Params... params,
const std::source_location& from = std::source_location::current()) &
noexcept
390 return SuperT::handle_call(
391 std::tuple{std::ref(params)...},
395 template <
typename... Args>
396 requires (... && requirement_for<Args, Params>)
398 constexpr auto expect_call(Args&&... args) &
400 return SuperT::make_expectation_builder(
401 std::forward<Args>(args)...);
405 using SuperT::SuperT;
408 template <
typename Return,
typename... Params>
409 class MockFrontend<Return(Params...) const &
noexcept>
410 :
protected BasicMockFrontend<
416 using SuperT = BasicMockFrontend<
423 using SignatureT = Return(Params...) const & noexcept;
425 constexpr Return operator ()(
427 const std::source_location& from = std::source_location::current()
430 return SuperT::handle_call(
431 std::tuple{std::ref(params)...},
435 template <
typename... Args>
436 requires (... && requirement_for<Args, Params>)
438 constexpr auto expect_call(Args&&... args)
const &
440 return SuperT::make_expectation_builder(
441 std::forward<Args>(args)...);
445 using SuperT::SuperT;
448 template <
typename Return,
typename... Params>
449 class MockFrontend<Return(Params...) &&
noexcept>
450 :
protected BasicMockFrontend<
456 using SuperT = BasicMockFrontend<
463 using SignatureT = Return(Params...) &&
noexcept;
465 constexpr Return operator ()(Params... params,
const std::source_location& from = std::source_location::current()) &&
noexcept
467 return SuperT::handle_call(
468 std::tuple{std::ref(params)...},
472 template <
typename... Args>
473 requires (... && requirement_for<Args, Params>)
475 constexpr auto expect_call(Args&&... args) &&
477 return SuperT::make_expectation_builder(
478 std::forward<Args>(args)...);
482 using SuperT::SuperT;
485 template <
typename Return,
typename... Params>
486 class MockFrontend<Return(Params...) const &&
noexcept>
487 :
protected BasicMockFrontend<
493 using SuperT = BasicMockFrontend<
500 using SignatureT = Return(Params...) const && noexcept;
502 constexpr Return operator ()(
504 const std::source_location& from = std::source_location::current()
507 return SuperT::handle_call(
508 std::tuple{std::ref(params)...},
512 template <
typename... Args>
513 requires (... && requirement_for<Args, Params>)
515 constexpr auto expect_call(Args&&... args)
const &&
517 return SuperT::make_expectation_builder(
518 std::forward<Args>(args)...);
522 using SuperT::SuperT;
525 template <
typename List>
526 struct expectation_collection_factory;
528 template <
typename... UniqueSignatures>
529 struct expectation_collection_factory<std::tuple<UniqueSignatures...>>
535 std::make_shared<ExpectationCollection<UniqueSignatures>>()...
599 template <
typename FirstSignature,
typename... OtherSignatures>
602 :
public detail::MockFrontend<FirstSignature>,
603 public detail::MockFrontend<OtherSignatures>...
606 using detail::MockFrontend<FirstSignature>::operator();
607 using detail::MockFrontend<FirstSignature>::expect_call;
608 using detail::MockFrontend<OtherSignatures>::operator()...;
609 using detail::MockFrontend<OtherSignatures>::expect_call...;
622 detail::expectation_collection_factory<
623 detail::unique_list_t<
652 template <
typename... Collections>
653 explicit Mock(std::tuple<Collections...> collections)
654 : detail::MockFrontend<FirstSignature>{
655 std::get<std::shared_ptr<ExpectationCollection<signature_decay_t<FirstSignature>>>>(collections)
657 detail::MockFrontend<OtherSignatures>{
658 std::get<std::shared_ptr<ExpectationCollection<signature_decay_t<OtherSignatures>>>>(collections)
A Mock type, which fully supports overload sets.
Definition Mock.hpp:604
~Mock()=default
Defaulted destructor.
Mock(Mock &&)=default
Defaulted move constructor.
Mock(const Mock &)=delete
Deleted copy constructor.
Mock & operator=(const Mock &)=delete
Deleted copy assignment operator.
Mock()
Default constructor.
Definition Mock.hpp:620
Definition BoostTest.hpp:20
constexpr bool is_overload_set_v
Definition Fwd.hpp:67
ValueCategory
Definition Fwd.hpp:100
Constness
Definition Fwd.hpp:93
typename signature_decay< Signature >::type signature_decay_t
Definition Fwd.hpp:37