94 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
namespace lt::test {
 | 
						|
 | 
						|
template<typename _Signature>
 | 
						|
class Mock;
 | 
						|
 | 
						|
template<typename Return_Type, typename... Arg_Types>
 | 
						|
class Mock<Return_Type(Arg_Types...)>
 | 
						|
{
 | 
						|
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<Arg_Types>(arguments)...);
 | 
						|
		}
 | 
						|
 | 
						|
		if (m_return_func)
 | 
						|
		{
 | 
						|
			return m_return_func(std::forward<Arg_Types>(arguments)...);
 | 
						|
		}
 | 
						|
		return m_return_value;
 | 
						|
	}
 | 
						|
 | 
						|
	/** With any arguments. */
 | 
						|
	template<uint32_t counter = 1>
 | 
						|
	auto expect() -> Mock &
 | 
						|
	{
 | 
						|
		m_expected_counter = counter;
 | 
						|
		return *this;
 | 
						|
	}
 | 
						|
 | 
						|
	auto apply(std::function<void(Arg_Types...)> 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<Return_Type(Arg_Types...)> func) -> Mock &
 | 
						|
	{
 | 
						|
		m_return_func = std::move(func);
 | 
						|
		return *this;
 | 
						|
	}
 | 
						|
 | 
						|
private:
 | 
						|
	Return_Type m_return_value {};
 | 
						|
 | 
						|
	std::function<Return_Type(Arg_Types...)> m_return_func {};
 | 
						|
 | 
						|
	std::vector<std::function<void(Arg_Types...)>> m_side_effects {};
 | 
						|
 | 
						|
	uint32_t m_call_index = 0;
 | 
						|
 | 
						|
	std::vector<std::pair<std::tuple<Arg_Types...>, 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
 |