#pragma once namespace lt::test { template class Mock; template class Mock { public: auto at_least() -> Mock & { return *this; } auto operator&&(Mock &mock) -> Mock & { return mock; } auto operator()(Arg_Types... arguments) -> Return_Type { ++m_call_index; for (auto &side_effect : m_side_effects) { side_effect(std::forward(arguments)...); } if (m_return_func) { return m_return_func(std::forward(arguments)...); } return m_return_value; } /** With any arguments. */ template auto expect() -> Mock & { m_expected_counter = counter; return *this; } auto apply(std::function side_effect) -> Mock & { m_side_effects.emplace_back(std::move(side_effect)); return *this; } /** Returns a fixed value. */ auto returns(Return_Type value) -> Mock & { m_return_value = value; return *this; } /** Returns a value based on input. */ auto returns(std::function func) -> Mock & { m_return_func = std::move(func); return *this; } private: Return_Type m_return_value {}; std::function m_return_func {}; std::vector> m_side_effects {}; uint32_t m_call_index = 0; std::vector, uint32_t>> m_expected_args; uint32_t m_expected_counter {}; }; namespace mock::range { [[nodiscard]] auto is_empty() -> bool { return false; } }; // namespace mock::range [[nodiscard]] auto eq(auto rhs) -> bool { return false; } } // namespace lt::test