clar.h 6.01 KB
Newer Older
Russell Belfer committed
1 2 3 4 5 6
/*
 * Copyright (c) Vicent Marti. All rights reserved.
 *
 * This file is part of clar, distributed under the ISC license.
 * For full terms see the included COPYING file.
 */
Vicent Marti committed
7 8 9 10 11
#ifndef __CLAR_TEST_H__
#define __CLAR_TEST_H__

#include <stdlib.h>

Vicent Marti committed
12 13 14
enum cl_test_status {
	CL_TEST_OK,
	CL_TEST_FAILURE,
Etienne Samson committed
15 16
	CL_TEST_SKIP,
	CL_TEST_NOTRUN,
Vicent Marti committed
17 18
};

19 20
enum cl_output_format {
	CL_OUTPUT_CLAP,
Edward Thomson committed
21
	CL_OUTPUT_TAP,
22 23
};

Etienne Samson committed
24
/** Setup clar environment */
Edward Thomson committed
25 26 27 28
void clar_test_init(int argc, char *argv[]);
int clar_test_run(void);
void clar_test_shutdown(void);

Etienne Samson committed
29
/** One shot setup & run */
Vicent Marti committed
30 31
int clar_test(int argc, char *argv[]);

Edward Thomson committed
32 33
const char *clar_sandbox_path(void);

Vicent Marti committed
34 35 36
void cl_set_cleanup(void (*cleanup)(void *), void *opaque);
void cl_fs_cleanup(void);

Edward Thomson committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
/**
 * cl_trace_* is a hook to provide a simple global tracing
 * mechanism.
 *
 * The goal here is to let main() provide clar-proper
 * with a callback to optionally write log info for
 * test operations into the same stream used by their
 * actual tests.  This would let them print test names
 * and maybe performance data as they choose.
 *
 * The goal is NOT to alter the flow of control or to
 * override test selection/skipping.  (So the callback
 * does not return a value.)
 *
 * The goal is NOT to duplicate the existing
 * pass/fail/skip reporting.  (So the callback
 * does not accept a status/errorcode argument.)
 *
 */
typedef enum cl_trace_event {
	CL_TRACE__SUITE_BEGIN,
	CL_TRACE__SUITE_END,
	CL_TRACE__TEST__BEGIN,
	CL_TRACE__TEST__END,
	CL_TRACE__TEST__RUN_BEGIN,
	CL_TRACE__TEST__RUN_END,
	CL_TRACE__TEST__LONGJMP,
} cl_trace_event;

typedef void (cl_trace_cb)(
	cl_trace_event ev,
	const char *suite_name,
	const char *test_name,
	void *payload);

/**
 * Register a callback into CLAR to send global trace events.
 * Pass NULL to disable.
 */
void cl_trace_register(cl_trace_cb *cb, void *payload);


Vicent Marti committed
79 80 81 82
#ifdef CLAR_FIXTURE_PATH
const char *cl_fixture(const char *fixture_name);
void cl_fixture_sandbox(const char *fixture_name);
void cl_fixture_cleanup(const char *fixture_name);
83
const char *cl_fixture_basename(const char *fixture_name);
Vicent Marti committed
84 85 86 87 88
#endif

/**
 * Assertion macros with explicit error message
 */
89 90 91
#define cl_must_pass_(expr, desc) clar__assert((expr) >= 0, __FILE__, __func__, __LINE__, "Function call failed: " #expr, desc, 1)
#define cl_must_fail_(expr, desc) clar__assert((expr) < 0, __FILE__, __func__, __LINE__, "Expected function call to fail: " #expr, desc, 1)
#define cl_assert_(expr, desc) clar__assert((expr) != 0, __FILE__, __func__, __LINE__, "Expression is not true: " #expr, desc, 1)
Vicent Marti committed
92 93 94 95

/**
 * Check macros with explicit error message
 */
96 97 98
#define cl_check_pass_(expr, desc) clar__assert((expr) >= 0, __FILE__, __func__, __LINE__, "Function call failed: " #expr, desc, 0)
#define cl_check_fail_(expr, desc) clar__assert((expr) < 0, __FILE__, __func__, __LINE__, "Expected function call to fail: " #expr, desc, 0)
#define cl_check_(expr, desc) clar__assert((expr) != 0, __FILE__, __func__, __LINE__, "Expression is not true: " #expr, desc, 0)
Vicent Marti committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

/**
 * Assertion macros with no error message
 */
#define cl_must_pass(expr) cl_must_pass_(expr, NULL)
#define cl_must_fail(expr) cl_must_fail_(expr, NULL)
#define cl_assert(expr) cl_assert_(expr, NULL)

/**
 * Check macros with no error message
 */
#define cl_check_pass(expr) cl_check_pass_(expr, NULL)
#define cl_check_fail(expr) cl_check_fail_(expr, NULL)
#define cl_check(expr) cl_check_(expr, NULL)

/**
 * Forced failure/warning
 */
117 118
#define cl_fail(desc) clar__fail(__FILE__, __func__, __LINE__, "Test failed.", desc, 1)
#define cl_warning(desc) clar__fail(__FILE__, __func__, __LINE__, "Warning during test execution:", desc, 0)
Vicent Marti committed
119

Vicent Marti committed
120 121
#define cl_skip() clar__skip()

Vicent Marti committed
122 123 124
/**
 * Typed assertion macros
 */
125 126
#define cl_assert_equal_s(s1,s2) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #s1 " != " #s2, 1, "%s", (s1), (s2))
#define cl_assert_equal_s_(s1,s2,note) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%s", (s1), (s2))
Russell Belfer committed
127

128 129
#define cl_assert_equal_wcs(wcs1,wcs2) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2, 1, "%ls", (wcs1), (wcs2))
#define cl_assert_equal_wcs_(wcs1,wcs2,note) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%ls", (wcs1), (wcs2))
130

131 132
#define cl_assert_equal_strn(s1,s2,len) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #s1 " != " #s2, 1, "%.*s", (s1), (s2), (int)(len))
#define cl_assert_equal_strn_(s1,s2,len,note) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%.*s", (s1), (s2), (int)(len))
Edward Thomson committed
133

134 135
#define cl_assert_equal_wcsn(wcs1,wcs2,len) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2, 1, "%.*ls", (wcs1), (wcs2), (int)(len))
#define cl_assert_equal_wcsn_(wcs1,wcs2,len,note) clar__assert_equal(__FILE__,__func__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%.*ls", (wcs1), (wcs2), (int)(len))
136

137 138 139
#define cl_assert_equal_i(i1,i2) clar__assert_equal(__FILE__,__func__,__LINE__,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2))
#define cl_assert_equal_i_(i1,i2,note) clar__assert_equal(__FILE__,__func__,__LINE__,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2))
#define cl_assert_equal_i_fmt(i1,i2,fmt) clar__assert_equal(__FILE__,__func__,__LINE__,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2))
Russell Belfer committed
140

141
#define cl_assert_equal_b(b1,b2) clar__assert_equal(__FILE__,__func__,__LINE__,#b1 " != " #b2, 1, "%d", (int)((b1) != 0),(int)((b2) != 0))
Russell Belfer committed
142

143
#define cl_assert_equal_p(p1,p2) clar__assert_equal(__FILE__,__func__,__LINE__,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2))
Russell Belfer committed
144

Vicent Marti committed
145
void clar__skip(void);
Vicent Marti committed
146

Russell Belfer committed
147 148
void clar__fail(
	const char *file,
149
	const char *func,
150
	size_t line,
Russell Belfer committed
151 152 153 154
	const char *error,
	const char *description,
	int should_abort);

Vicent Marti committed
155 156 157
void clar__assert(
	int condition,
	const char *file,
158
	const char *func,
159
	size_t line,
Vicent Marti committed
160 161 162 163
	const char *error,
	const char *description,
	int should_abort);

Russell Belfer committed
164 165
void clar__assert_equal(
	const char *file,
166
	const char *func,
167
	size_t line,
Russell Belfer committed
168 169 170 171
	const char *err,
	int should_abort,
	const char *fmt,
	...);
Vicent Marti committed
172 173

#endif