File indexing completed on 2024-06-16 05:02:04

0001 /*
0002  * SPDX-FileCopyrightText: 2008 Trevor Pounds
0003  * SPDX-License-Identifier: MIT
0004  */
0005 
0006 #ifndef __MOCKITOPP_MOCK_OBJECT_HPP__
0007 #define __MOCKITOPP_MOCK_OBJECT_HPP__
0008 
0009 #include <mockitopp/detail/stubbing/dynamic_object.hpp>
0010 
0011 /**
0012 * helper macro to make mocking of overloaded functions less verbose
0013 */
0014 #define overloaded_method(return_type, type, method, ...) \
0015    static_cast<return_type (type::*)(__VA_ARGS__)>(&type::method)
0016 
0017 namespace mockitopp
0018 {
0019    /**
0020     * provides a base implementation of a mock object
0021     *
0022     * @author Trevor Pounds
0023     */
0024    template <typename T>
0025    struct mock_object : protected detail::dynamic_object
0026    {
0027       /**
0028        * returns a mock object of the given abstract base class/interface
0029        *
0030        * @return mock object
0031        */
0032       T& getInstance()
0033          { return reinterpret_cast<T&>(*this); }
0034 
0035       /**
0036        * stub functionality for a given method
0037        *
0038        * @param ptr2member method to be stubbed
0039        */
0040       template <typename M>
0041       detail::dynamic_vfunction<typename detail::remove_member_function_pointer_cv<M>::type>& expect(M ptr2member)
0042          { return define_function(ptr2member); }
0043 
0044       template <typename M>
0045       detail::dynamic_vfunction<typename detail::remove_member_function_pointer_cv<M>::type>& operator() (M ptr2member)
0046          { return expect(ptr2member); }
0047    };
0048 } // namespace mockitopp
0049 
0050 #endif //__MOCKITOPP_MOCK_OBJECT_HPP__