1bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/*
2bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * Copyright 2008 Google Inc.
3bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
4bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * you may not use this file except in compliance with the License.
6bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * You may obtain a copy of the License at
7bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
8bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * http://www.apache.org/licenses/LICENSE-2.0
9bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
10bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * Unless required by applicable law or agreed to in writing, software
11bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * See the License for the specific language governing permissions and
14bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * limitations under the License.
15bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
16bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#ifndef CMOCKERY_H_
17bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define CMOCKERY_H_
18bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/*
19bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * These headers or their equivalents should be included prior to including
20bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * this header file.
21bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
22bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * #include <stdarg.h>
23bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * #include <stddef.h>
24bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * #include <setjmp.h>
25bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
26bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * This allows test applications to use custom definitions of C standard
27bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * library functions and types.
28bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
29bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
30bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// For those who are used to __func__ from gcc.
31bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#ifndef __func__
32bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define __func__ __FUNCTION__
33bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#endif
34bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
35bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Retrieves a return value for the current function.
36bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define mock() _mock(__func__, __FILE__, __LINE__)
37bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
38bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Stores a value to be returned by the specified function later.
39bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * The count parameter returns the number of times the value should be returned
40bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * by mock().  If count is set to -1 the value will always be returned.
41bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
42bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define will_return(function, value) \
43bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    _will_return(#function, __FILE__, __LINE__, (void*)value, 1)
44bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define will_return_count(function, value, count) \
45bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    _will_return(#function, __FILE__, __LINE__, (void*)value, count)
46bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
47bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add a custom parameter checking function.  If the event parameter is NULL
48bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * the event structure is allocated internally by this function.  If event
49bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * parameter is provided it must be allocated on the heap and doesn't need to
50bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * be deallocated by the caller.
51bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
52bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_check(function, parameter, check_function, check_data) \
53bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_check(#function, #parameter, __FILE__, __LINE__, check_function, \
54bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	              check_data)
55bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
56bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to check a parameter, using check_expected(), against a set of
57bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * values. See will_return() for a description of the count parameter.
58bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
59bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_in_set(function, parameter, value_array) \
60bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_in_set_count(function, parameter, value_array, 1)
61bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_in_set_count(function, parameter, value_array, count) \
62bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_in_set(#function, #parameter, __FILE__, __LINE__, value_array, \
63bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	               sizeof(value_array) / sizeof(value_array[0]), count)
64bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_in_set(function, parameter, value_array) \
65bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_not_in_set_count(function, parameter, value_array, 1)
66bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_in_set_count(function, parameter, value_array, count) \
67bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_not_in_set( \
68bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	    #function, #parameter, __FILE__, __LINE__, value_array, \
69bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	    sizeof(value_array) / sizeof(value_array[0]), count)
70bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
71bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
72bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to check a parameter, using check_expected(), against a
73bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * signed range.  Where range is minimum <= value <= maximum.
74bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * See will_return() for a description of the count parameter.
75bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
76bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_in_range(function, parameter, minimum, maximum) \
77bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_in_range_count(function, parameter, minimum, maximum, 1)
78bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_in_range_count(function, parameter, minimum, maximum, count) \
79bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_in_range(#function, #parameter, __FILE__, __LINE__, minimum, \
80bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                 maximum, count)
81bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
82bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to check a parameter, using check_expected(), against a
83bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * signed range.  Where range is value < minimum or value > maximum.
84bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * See will_return() for a description of the count parameter.
85bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
86bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_in_range(function, parameter, minimum, maximum) \
87bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_not_in_range_count(function, parameter, minimum, maximum, 1)
88bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_in_range_count(function, parameter, minimum, maximum, \
89bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                                  count) \
90bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_not_in_range(#function, #parameter, __FILE__, __LINE__, \
91bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                     minimum, maximum, count)
92bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
93bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to check whether a parameter, using check_expected(), is or
94bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * isn't a value.  See will_return() for a description of the count parameter.
95bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
96bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_value(function, parameter, value) \
97bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_value_count(function, parameter, value, 1)
98bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_value_count(function, parameter, value, count) \
99bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_value(#function, #parameter, __FILE__, __LINE__, (void*)value, \
100bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	              count)
101bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_value(function, parameter, value) \
102bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_not_value_count(function, parameter, value, 1)
103bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_value_count(function, parameter, value, count) \
104bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_not_value(#function, #parameter, __FILE__, __LINE__, \
105bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                  (void*)value, count)
106bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
107bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to check whether a parameter, using check_expected(),
108bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * is or isn't a string.  See will_return() for a description of the count
109bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * parameter.
110bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
111bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_string(function, parameter, string) \
112bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_string_count(function, parameter, string, 1)
113bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_string_count(function, parameter, string, count) \
114bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_string(#function, #parameter, __FILE__, __LINE__, (void*)string, \
115bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	              count)
116bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_string(function, parameter, string) \
117bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_not_string_count(function, parameter, string, 1)
118bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_string_count(function, parameter, string, count) \
119bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_not_string(#function, #parameter, __FILE__, __LINE__, \
120bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                  (void*)string, count)
121bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
122bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to check whether a parameter, using check_expected() does or
123bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * doesn't match an area of memory.  See will_return() for a description of
124bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * the count parameter.
125bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
126bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_memory(function, parameter, memory, size) \
127bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_memory_count(function, parameter, memory, size, 1)
128bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_memory_count(function, parameter, memory, size, count)	\
129bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_memory(#function, #parameter, __FILE__, __LINE__, (void*)memory, \
130bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	               size, count)
131bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_memory(function, parameter, memory, size) \
132bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_not_memory_count(function, parameter, memory, size, 1)
133bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_not_memory_count(function, parameter, memory, size, count) \
134bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_not_memory(#function, #parameter, __FILE__, __LINE__, \
135bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                   (void*)memory, size, count)
136bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
137bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
138bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Add an event to allow any value for a parameter checked using
139bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * check_expected().  See will_return() for a description of the count
140bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * parameter.
141bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
142bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_any(function, parameter) \
143bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	expect_any_count(function, parameter, 1)
144bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_any_count(function, parameter, count) \
145bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_expect_any(#function, #parameter, __FILE__, __LINE__, count)
146bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
147bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Determine whether a function parameter is correct.  This ensures the next
148bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * value queued by one of the expect_*() macros matches the specified variable.
149bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
150bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define check_expected(parameter) \
151bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_check_expected(__func__, #parameter, __FILE__, __LINE__, (void*)parameter)
152bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
153bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the given expression is true.
154bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_true(c) _assert_true((int)(c), #c, __FILE__, __LINE__)
155bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the given expression is false.
156bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_false(c) _assert_true(!((int)(c)), #c, __FILE__, __LINE__)
157bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
158bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the two given integers are equal, otherwise fail.
159bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_int_equal(a, b) _assert_int_equal(a, b, __FILE__, __LINE__)
160bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the two given integers are not equal, otherwise fail.
161bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_int_not_equal(a, b) \
162bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_int_not_equal(a, b, __FILE__, __LINE__)
163bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
164bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the two given strings are equal, otherwise fail.
165bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_string_equal(a, b) \
166bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_string_equal((const char*)a, (const char*)b, __FILE__, __LINE__)
167bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the two given strings are not equal, otherwise fail.
168bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_string_not_equal(a, b) \
169bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_string_not_equal((const char*)a, (const char*)b, __FILE__, \
170bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                         __LINE__)
171bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
172bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the two given areas of memory are equal, otherwise fail.
173bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_memory_equal(a, b, size) \
174bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_memory_equal((const char*)a, (const char*)b, size, __FILE__, \
175bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                     __LINE__)
176bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the two given areas of memory are not equal, otherwise fail.
177bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_memory_not_equal(a, b, size) \
178bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_memory_not_equal((const char*)a, (const char*)b, size, __FILE__, \
179bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                         __LINE__)
180bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
181bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the specified value is >= minimum and <= maximum.
182bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_in_range(value, minimum, maximum) \
183bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_in_range((int)value, (int)minimum, (int)maximum, __FILE__, \
184bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                 __LINE__)
185bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the specified value is < minumum or > maximum
186bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_not_in_range(value, minimum, maximum) \
187bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_not_in_range((int)value, (int)minimum, (int)maximum, __FILE__, \
188bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	                     __LINE__)
189bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
190bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the specified value is within a set.
191bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_in_set(value, values, number_of_values) \
192bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_in_set(value, values, number_of_values, __FILE__, __LINE__)
193bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Assert that the specified value is not within a set.
194bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define assert_not_in_set(value, values, number_of_values) \
195bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	_assert_not_in_set(value, values, number_of_values, __FILE__, __LINE__)
196bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
197bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
198bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Forces the test to fail immediately and quit.
199bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define fail() _fail(__FILE__, __LINE__)
200bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
201bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Generic method to kick off testing
202bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define run_test(f) _run_test(#f, f, NULL, UNIT_TEST_FUNCTION_TYPE_TEST, NULL)
203bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
204bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Initializes a UnitTest structure.
205bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define unit_test(f) { #f, f, UNIT_TEST_FUNCTION_TYPE_TEST }
206bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define unit_test_setup(test, setup) \
207bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	{ #test "_" #setup, setup, UNIT_TEST_FUNCTION_TYPE_SETUP }
208bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define unit_test_teardown(test, teardown) \
209bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	{ #test "_" #teardown, teardown, UNIT_TEST_FUNCTION_TYPE_TEARDOWN }
210bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
211bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Initialize an array of UnitTest structures with a setup function for a test
212bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * and a teardown function.  Either setup or teardown can be NULL.
213bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
214bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define unit_test_setup_teardown(test, setup, teardown)	\
215bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	unit_test_setup(test, setup), \
216bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	unit_test(test), \
217bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	unit_test_teardown(test, teardown)
218bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
219bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/*
220bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * Run tests specified by an array of UnitTest structures.  The following
221bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * example illustrates this macro's use with the unit_test macro.
222bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
223bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * void Test0();
224bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * void Test1();
225bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
226bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * int main(int argc, char* argv[]) {
227bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *     const UnitTest tests[] = {
228bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *         unit_test(Test0);
229bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *         unit_test(Test1);
230bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *     };
231bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *     return run_tests(tests);
232bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * }
233bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
234bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof(tests)[0])
235bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
236bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Dynamic allocators
237bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define test_malloc(size) _test_malloc(size, __FILE__, __LINE__)
238bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define test_calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__)
239bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define test_free(ptr) _test_free(ptr, __FILE__, __LINE__)
240bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
241bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Redirect malloc, calloc and free to the unit test allocators.
242bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#if UNIT_TESTING
243bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define malloc test_malloc
244bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define calloc test_calloc
245bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define free test_free
246bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#endif // UNIT_TESTING
247bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
248bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/*
249bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * Ensure mock_assert() is called.  If mock_assert() is called the assert
250bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * expression string is returned.
251bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * For example:
252bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
253bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * #define assert mock_assert
254bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
255bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * void showmessage(const char *message) {
256bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *   assert(message);
257bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * }
258bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
259bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * int main(int argc, const char* argv[]) {
260bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *   expect_assert_failure(show_message(NULL));
261bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *   printf("succeeded\n");
262bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *   return 0;
263bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * }
264bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
265bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define expect_assert_failure(function_call) \
266bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  { \
267bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* expression = (const char*)setjmp(global_expect_assert_env); \
268bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    global_expecting_assert = 1; \
269bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    if (expression) { \
270bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      print_message("Expected assertion %s occurred\n", expression); \
271bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      global_expecting_assert = 0; \
272bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    } else { \
273bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      function_call ; \
274bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      global_expecting_assert = 0; \
275bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      print_error("Expected assert in %s\n", #function_call); \
276bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson      _fail(__FILE__, __LINE__); \
277bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    } \
278bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson  }
279bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
280bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Function prototype for setup, test and teardown functions.
281bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsontypedef void (*UnitTestFunction)(void **state);
282bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
283bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Function that determines whether a function parameter value is correct.
284bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsontypedef int (*CheckParameterValue)(const void *value, void *check_value_data);
285bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
286bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Type of the unit test function.
287bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsontypedef enum UnitTestFunctionType {
288bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	UNIT_TEST_FUNCTION_TYPE_TEST = 0,
289bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	UNIT_TEST_FUNCTION_TYPE_SETUP,
290bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	UNIT_TEST_FUNCTION_TYPE_TEARDOWN,
291bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson} UnitTestFunctionType;
292bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
293bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/* Stores a unit test function with its name and type.
294bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * NOTE: Every setup function must be paired with a teardown function.  It's
295bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * possible to specify NULL function pointers.
296bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
297bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsontypedef struct UnitTest {
298bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	const char* name;
299bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	UnitTestFunction function;
300bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	UnitTestFunctionType function_type;
301bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson} UnitTest;
302bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
303bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
304bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Location within some source code.
305bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsontypedef struct SourceLocation {
306bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	const char* file;
307bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	int line;
308bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson} SourceLocation;
309bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
310bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Event that's called to check a parameter value.
311bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsontypedef struct CheckParameterEvent {
312bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	SourceLocation location;
313bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	const char *parameter_name;
314bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	CheckParameterValue check_value;
315bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void *check_value_data;
316bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson} CheckParameterEvent;
317bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
318bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Used by expect_assert_failure() and mock_assert().
319bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonextern int global_expecting_assert;
320bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonextern jmp_buf global_expect_assert_env;
321bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
322bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Retrieves a value for the given function, as set by "will_return".
323bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid* _mock(const char * const function, const char* const file,
324bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson            const int line);
325bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
326bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_check(
327bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
328bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line,
329bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const CheckParameterValue check_function, void * const check_data,
330bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    CheckParameterEvent * const event, const int count);
331bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
332bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_in_set(
333bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
334bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const void *values[],
335bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const size_t number_of_values, const int count);
336bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_not_in_set(
337bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
338bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const void *values[],
339bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const size_t number_of_values, const int count);
340bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
341bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_in_range(
342bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
343bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line,
344bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const int minimum, const int maximum, const int count);
345bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_not_in_range(
346bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
347bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line,
348bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const int minimum, const int maximum, const int count);
349bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_value(
350bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
351bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const void* const value,
352bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const int count);
353bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_not_value(
354bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
355bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const void* const value,
356bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const int count);
357bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_string(
358bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
359bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const char* string,
360bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const int count);
361bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_not_string(
362bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
363bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const char* string,
364bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const int count);
365bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_memory(
366bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
367bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const void* const memory,
368bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const size_t size, const int count);
369bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_not_memory(
370bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
371bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const void* const memory,
372bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const size_t size, const int count);
373bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _expect_any(
374bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const function, const char* const parameter,
375bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* const file, const int line, const int count);
376bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
377bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _check_expected(
378bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char * const function_name, const char * const parameter_name,
379bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char* file, const int line, const void* value);
380bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
381bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Can be used to replace assert in tested code so that in conjuction with
382bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// check_assert() it's possible to determine whether an assert condition has
383bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// failed without stopping a test.
384bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid mock_assert(const int result, const char* const expression,
385bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                 const char * const file, const int line);
386bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
387bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _will_return(const char * const function_name, const char * const file,
388bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                  const int line, const void* const value, const int count);
389bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_true(const int result, const char* const expression,
390bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                  const char * const file, const int line);
391bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_int_equal(const int a, const int b, const char * const file,
392bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                       const int line);
393bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_int_not_equal(const int a, const int b, const char * const file,
394bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                           const int line);
395bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_string_equal(const char * const a, const char * const b,
396bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                          const char * const file, const int line);
397bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_string_not_equal(const char * const a, const char * const b,
398bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                              const char *file, const int line);
399bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_memory_equal(const void * const a, const void * const b,
400bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                          const size_t size, const char* const file,
401bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                          const int line);
402bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_memory_not_equal(const void * const a, const void * const b,
403bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                              const size_t size, const char* const file,
404bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                              const int line);
405bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_in_range(const int value, const int minimum, const int maximum,
406bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                      const char* const file, const int line);
407bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_not_in_range(const int value, const int minimum,
408bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                          const int maximum, const char* const file,
409bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                          const int line);
410bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_in_set(const void * const value, const void *values[],
411bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                    const size_t number_of_values, const char* const file,
412bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                    const int line);
413bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _assert_not_in_set(const void * const value, const void *values[],
414bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                        const size_t number_of_values, const char* const file,
415bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                        const int line);
416bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
417bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid* _test_malloc(const size_t size, const char* file, const int line);
418bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid* _test_calloc(const size_t number_of_elements, const size_t size,
419bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson                   const char* file, const int line);
420bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _test_free(void* const ptr, const char* file, const int line);
421bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
422bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid _fail(const char * const file, const int line);
423bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonint _run_test(
424bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const char * const function_name, const UnitTestFunction Function,
425bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    void ** const state, const UnitTestFunctionType function_type,
426bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson    const void* const heap_check_point);
427bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonint _run_tests(const UnitTest * const tests, const size_t number_of_tests);
428bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
429bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Standard output and error print methods.
430bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid print_message(const char* const format, ...);
431bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid print_error(const char* const format, ...);
432bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid vprint_message(const char* const format, va_list args);
433bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid vprint_error(const char* const format, va_list args);
434bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
435bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#endif // CMOCKERY_H_
436