#define CMOCKA_H_
#ifdef _WIN32
-#if _MSC_VER < 1500
-#ifdef __cplusplus
+# ifdef _MSC_VER
+
+# ifndef inline
+#define inline __inline
+# endif /* inline */
+
+# if _MSC_VER < 1500
+# ifdef __cplusplus
extern "C" {
-#endif /* __cplusplus */
+# endif /* __cplusplus */
int __stdcall IsDebuggerPresent();
-#ifdef __cplusplus
+# ifdef __cplusplus
} /* extern "C" */
-#endif /* __cplusplus */
-#endif /* _MSC_VER < 1500 */
+# endif /* __cplusplus */
+# endif /* _MSC_VER < 1500 */
+# endif /* _MSC_VER */
#endif /* _WIN32 */
/*
/* GCC have printf type attribute check. */
#ifdef __GNUC__
-#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
+#define CMOCKA_PRINTF_ATTRIBUTE(a,b) \
+ __attribute__ ((__format__ (__printf__, a, b)))
#else
-#define PRINTF_ATTRIBUTE(a,b)
+#define CMOCKA_PRINTF_ATTRIBUTE(a,b)
#endif /* __GNUC__ */
/**
/* Printf format used to display LargestIntegralType. */
#ifndef LargestIntegralTypePrintfFormat
#ifdef _WIN32
-#define LargestIntegralTypePrintfFormat "%I64x"
+#define LargestIntegralTypePrintfFormat "0x%I64x"
#else
-#define LargestIntegralTypePrintfFormat "%llx"
+#define LargestIntegralTypePrintfFormat "%#llx"
#endif /* _WIN32 */
#endif /* LargestIntegralTypePrintfFormat */
void will_return_always(#function, void *value);
#else
#define will_return_always(function, value) \
- will_return_count(#function, (value), -1)
+ will_return_count(function, (value), -1)
#endif
/** @} */
* by this function. If the parameter is provided it must be allocated on the
* heap and doesn't need to be deallocated by the caller.
*
- * @param[in] #function The fuction to add a custom paramater checking function
- * for.
+ * @param[in] #function The function to add a custom parameter checking
+ * function for.
*
- * @param[in] #parameter The parametes passed to the function.
+ * @param[in] #parameter The parameters passed to the function.
*
* @param[in] #check_function The check function to call.
*
#else
#define expect_check(function, parameter, check_function, check_data) \
_expect_check(#function, #parameter, __FILE__, __LINE__, check_function, \
- cast_to_largest_integral_type(check_data), NULL, 0)
+ cast_to_largest_integral_type(check_data), NULL, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value is part of the provided
* array.
expect_in_set_count(function, parameter, value_array, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value is part of the provided
* array.
sizeof(value_array) / sizeof((value_array)[0]), count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value is not part of the
* provided array.
expect_not_in_set_count(function, parameter, value_array, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value is not part of the
* provided array.
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check a parameter is inside a numerical range.
* The check would succeed if minimum <= value <= maximum.
expect_in_range_count(function, parameter, minimum, maximum, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check a parameter is inside a
* numerical range. The check would succeed if minimum <= value <= maximum.
maximum, count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check a parameter is outside a numerical range.
* The check would succeed if minimum > value > maximum.
expect_not_in_range_count(function, parameter, minimum, maximum, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check a parameter is outside a
* numerical range. The check would succeed if minimum > value > maximum.
minimum, maximum, count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if a parameter is the given value.
*
expect_value_count(function, parameter, value, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check if a parameter is the given value.
*
cast_to_largest_integral_type(value), count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if a parameter isn't the given value.
*
expect_not_value_count(function, parameter, value, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check if a parameter isn't the given value.
*
cast_to_largest_integral_type(value), count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value is equal to the
* provided string.
expect_string_count(function, parameter, string, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value is equal to the
* provided string.
(const char*)(string), count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value isn't equal to the
* provided string.
expect_not_string_count(function, parameter, string, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter value isn't equal to the
* provided string.
(const char*)(string), count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter does match an area of memory.
*
expect_memory_count(function, parameter, memory, size, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check if the parameter does match an area
* of memory.
(const void*)(memory), size, count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if the parameter doesn't match an area of
* memory.
expect_not_memory_count(function, parameter, memory, size, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check if the parameter doesn't match an
* area of memory.
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to check if a parameter (of any value) has been passed.
*
expect_any_count(function, parameter, 1)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Add an event to repeatedly check if a parameter (of any value) has
* been passed.
_expect_any(#function, #parameter, __FILE__, __LINE__, count)
#endif
-#if DOXYGEN
+#ifdef DOXYGEN
/**
* @brief Determine whether a function parameter is correct.
*
__FILE__, __LINE__)
#endif
+#ifdef DOXYGEN
+/**
+ * @brief Assert if the return_code is smaller than 0.
+ *
+ * The function prints an error message to standard error and terminates the
+ * test by calling fail() if the return code is smaller than 0. If the function
+ * you check sets an errno if it fails you can pass it to the function and
+ * it will be printed as part of the error message.
+ *
+ * @param[in] rc The return code to evaluate.
+ *
+ * @param[in] error Pass errno here or 0.
+ */
+void assert_return_code(int rc, int error);
+#else
+#define assert_return_code(rc, error) \
+ _assert_return_code(cast_to_largest_integral_type(rc), \
+ sizeof(rc), \
+ cast_to_largest_integral_type(error), \
+ #rc, __FILE__, __LINE__)
+#endif
+
#ifdef DOXYGEN
/**
* @brief Assert that the given pointer is non-NULL.
#define run_test(f) _run_test(#f, f, NULL, UNIT_TEST_FUNCTION_TYPE_TEST, NULL)
#endif
+static inline void _unit_test_dummy(void **state) {
+ (void)state;
+}
+
/** Initializes a UnitTest structure. */
#define unit_test(f) { #f, f, UNIT_TEST_FUNCTION_TYPE_TEST }
/** Initializes a UnitTest structure with a setup function. */
#define unit_test_setup(test, setup) \
_unit_test_setup(test, setup), \
- unit_test(test)
+ unit_test(test), \
+ _unit_test_teardown(test, _unit_test_dummy)
#define _unit_test_teardown(test, teardown) \
{ #test "_" #teardown, teardown, UNIT_TEST_FUNCTION_TYPE_TEARDOWN }
/** Initializes a UnitTest structure with a teardown function. */
#define unit_test_teardown(test, teardown) \
- _unit_test_setup(test, setup), \
+ _unit_test_setup(test, _unit_test_dummy), \
unit_test(test), \
_unit_test_teardown(test, teardown)
+#define group_test_setup(setup) \
+ { "group_" #setup, setup, UNIT_TEST_FUNCTION_TYPE_GROUP_SETUP }
+
+#define group_test_teardown(teardown) \
+ { "group_" #teardown, teardown, UNIT_TEST_FUNCTION_TYPE_GROUP_TEARDOWN }
+
/**
* Initialize an array of UnitTest structures with a setup function for a test
* and a teardown function. Either setup or teardown can be NULL.
#define run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof(tests)[0])
#endif
+#define run_group_tests(tests) _run_group_tests(tests, sizeof(tests) / sizeof(tests)[0])
+
/** @} */
/**
* @return A pointer to the allocated memory or NULL on error.
*
* @code
- * #if UNIT_TESTING
+ * #ifdef UNIT_TESTING
* extern void* _test_malloc(const size_t size, const char* file, const int line);
*
* #define malloc(size) _test_malloc(size, __FILE__, __LINE__)
#endif
/* Redirect malloc, calloc and free to the unit test allocators. */
-#if UNIT_TESTING
+#ifdef UNIT_TESTING
#define malloc test_malloc
#define calloc test_calloc
#define free test_free
* @param[in] line The line mock_assert() is called.
*
* @code
- * #if UNIT_TESTING
+ * #ifdef UNIT_TESTING
* extern void mock_assert(const int result, const char* const expression,
* const char * const file, const int line);
*
UNIT_TEST_FUNCTION_TYPE_TEST = 0,
UNIT_TEST_FUNCTION_TYPE_SETUP,
UNIT_TEST_FUNCTION_TYPE_TEARDOWN,
+ UNIT_TEST_FUNCTION_TYPE_GROUP_SETUP,
+ UNIT_TEST_FUNCTION_TYPE_GROUP_TEARDOWN,
} UnitTestFunctionType;
/*
UnitTestFunctionType function_type;
} UnitTest;
+typedef struct GroupTest {
+ UnitTestFunction setup;
+ UnitTestFunction teardown;
+ const UnitTest *tests;
+ const size_t number_of_tests;
+} GroupTest;
/* Location within some source code. */
typedef struct SourceLocation {
void _assert_true(const LargestIntegralType result,
const char* const expression,
const char * const file, const int line);
+void _assert_return_code(const LargestIntegralType result,
+ size_t rlen,
+ const LargestIntegralType error,
+ const char * const expression,
+ const char * const file,
+ const int line);
void _assert_int_equal(
const LargestIntegralType a, const LargestIntegralType b,
const char * const file, const int line);
void ** const volatile state, const UnitTestFunctionType function_type,
const void* const heap_check_point);
int _run_tests(const UnitTest * const tests, const size_t number_of_tests);
+int _run_group_tests(const UnitTest * const tests,
+ const size_t number_of_tests);
/* Standard output and error print methods. */
-void print_message(const char* const format, ...) PRINTF_ATTRIBUTE(1, 2);
-void print_error(const char* const format, ...) PRINTF_ATTRIBUTE(1, 2);
-void vprint_message(const char* const format, va_list args) PRINTF_ATTRIBUTE(1, 0);
-void vprint_error(const char* const format, va_list args) PRINTF_ATTRIBUTE(1, 0);
+void print_message(const char* const format, ...) CMOCKA_PRINTF_ATTRIBUTE(1, 2);
+void print_error(const char* const format, ...) CMOCKA_PRINTF_ATTRIBUTE(1, 2);
+void vprint_message(const char* const format, va_list args) CMOCKA_PRINTF_ATTRIBUTE(1, 0);
+void vprint_error(const char* const format, va_list args) CMOCKA_PRINTF_ATTRIBUTE(1, 0);
/** @} */