==========================
Class and Function Mocking
==========================

This file documents class and function mocking features.

.. note::
   If possible, prefer class mocking over arbitrary function mocking. Class
   mocking has a much more limited scope and provides more control.
   This file documents class mocking and most mocking features that do not
   depend on function or platform mocking.

Readability Macros
------------------
When defining and declaring mock stubs, use these readability macros.

.. code-block:: c

        #define CLASS(struct_name) struct_name
        #define HANDLE_INDEX(index) index
        #define METHOD(method_name) method_name
        #define RETURNS(return_type) return_type
        #define PARAMS(...) __VA_ARGS__

Consider a ``struct Foo`` with a member function
``int add(struct Foo*, int a, int b);``

When generating a mock stub with :c:func:`DEFINE_STRUCT_CLASS_MOCK`, which
takes a method name, struct name, return type, and method parameters, the
arguments should be passed in with the readability macros.

.. code-block:: c

        DEFINE_STRUCT_CLASS_MOCK(
                METHOD(add),
                CLASS(Foo),
                RETURNS(int),
                PARAMS(struct Foo *, int, int)
        );

For a more detailed example of this, take a look at the example in
:doc:`../start`

These macros should only be used in the context of the mock stub generators.


Built in Matchers
-----------------

.. kernel-doc:: include/test/mock.h
   :doc: Built In Matchers

Mock Returns
------------
These functions can be used to specify a value to be returned (``ret``) when a
mocked function is intercepted via :c:func:`EXPECT_CALL`.

.. code-block:: c

        struct mock_action *int_return(struct test *test, int ret);
        struct mock_action *u32_return(struct test *test, u32 ret);

API
---
.. kernel-doc:: include/test/mock.h
   :internal:
