52 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <test/mock.hpp>
 | |
| #include <test/test.hpp>
 | |
| 
 | |
| using namespace lt::test;
 | |
| using namespace lt::test::mock;
 | |
| 
 | |
| class ExpensiveClass
 | |
| {
 | |
| private:
 | |
| public:
 | |
| 	virtual int expensive(std::string str, std::optional<int> opt)
 | |
| 	{
 | |
| 		return 0;
 | |
| 	}
 | |
| };
 | |
| 
 | |
| class MockClass: public ExpensiveClass
 | |
| {
 | |
| public:
 | |
| 	int expensive(std::string str, std::optional<int> opt) override
 | |
| 	{
 | |
| 		return expensive_mock(str, opt);
 | |
| 	};
 | |
| 
 | |
| 	Mock<int(std::string, std::optional<int>)> expensive_mock {};
 | |
| };
 | |
| 
 | |
| class ExpensiveUser
 | |
| {
 | |
| public:
 | |
| 	ExpensiveUser(ExpensiveClass &dependency)
 | |
| 	{
 | |
| 		dependency.expensive("", 10);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| 
 | |
| // problem #1: matcher functions should construct an invokable object to test against the indexed
 | |
| // argument.
 | |
| 
 | |
| Suite raii = "mock_raii"_suite = [] {
 | |
| 	Case { "happy path won't throw" } = [] {
 | |
| 		auto a = std::function<int(int)> {};
 | |
| 		auto expensive = MockClass {};
 | |
| 		auto side_effect = false;
 | |
| 		expensive.expensive_mock.expect("test", std::nullopt)
 | |
| 		    .apply([&](auto str, auto opt) { side_effect = true; })
 | |
| 		    .returns(69);
 | |
| 
 | |
| 		auto user = ExpensiveUser { expensive };
 | |
| 	};
 | |
| };
 |