39#ifndef MINUNIT_MINUNIT_H
40#define MINUNIT_MINUNIT_H
44#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200112L
46#define _POSIX_C_SOURCE 200112L
60#include <mcp/syscalls.h>
66#define MINUNIT_MESSAGE_LEN 1024
68#define MINUNIT_EPSILON 1E-12
71static int minunit_run = 0;
72static int minunit_assert = 0;
73static int minunit_fail = 0;
74static int minunit_status = 0;
77static long minunit_real_timer = 0;
78static long minunit_proc_timer = 0;
81static char minunit_last_message[MINUNIT_MESSAGE_LEN];
84static void (*minunit_setup)(void) = NULL;
85static void (*minunit_teardown)(void) = NULL;
88#define MU_TEST(method_name) static void method_name(void)
89#define MU_TEST_SUITE(suite_name) static void suite_name(void)
91#define MU__SAFE_BLOCK(block) do {\
96#define MU_RUN_SUITE(suite_name) MU__SAFE_BLOCK(\
98 minunit_setup = NULL;\
99 minunit_teardown = NULL;\
103#define MU_SUITE_CONFIGURE(setup_fun, teardown_fun) MU__SAFE_BLOCK(\
104 minunit_setup = setup_fun;\
105 minunit_teardown = teardown_fun;\
109#define MU_RUN_TEST(test) MU__SAFE_BLOCK(\
110 if (minunit_real_timer==0 && minunit_proc_timer==0) {\
111 minunit_real_timer = mu_timer_real();\
112 minunit_proc_timer = mu_timer_cpu();\
114 if (minunit_setup) (*minunit_setup)();\
118 if (minunit_status) {\
121 printf("\n%s\n", minunit_last_message);\
124 if (minunit_teardown) (*minunit_teardown)();\
128#define MU_REPORT() MU__SAFE_BLOCK(\
129 long minunit_end_real_timer;\
130 long minunit_end_proc_timer;\
131 long elapsed_real_time;\
132 printf("\n\n%d tests, %d assertions, %d failures\n", minunit_run, minunit_assert, minunit_fail);\
133 DEBUG_OUT(("\n\n%d tests, %d assertions, %d failures", minunit_run, minunit_assert, minunit_fail));\
134 minunit_end_real_timer = mu_timer_real();\
135 minunit_end_proc_timer = mu_timer_cpu();\
136 elapsed_real_time = minunit_end_real_timer - minunit_real_timer;\
137 printf("\nFinished in %li ticks (real) %.8f seconds (real)\n\n",\
139 (double)(elapsed_real_time/SYS_TICKS_PER_SEC));\
140 DEBUG_OUT(("Finished in %li ticks (real) %.8f seconds (real)",\
141 minunit_end_real_timer - minunit_real_timer,\
142 (double)(minunit_end_real_timer - minunit_real_timer)/SYS_TICKS_PER_SEC));\
144#define MU_EXIT_CODE minunit_fail
147#define mu_check(test) MU__SAFE_BLOCK(\
150 sprintf(minunit_last_message, "%s failed:\n\t%s:%d: %s", __func__, __FILE__, __LINE__, #test);\
158#define mu_fail(message) MU__SAFE_BLOCK(\
160 sprintf(minunit_last_message, "%s failed:\n\t%s:%d: %s", __func__, __FILE__, __LINE__, message);\
165#define mu_assert(test, message) MU__SAFE_BLOCK(\
168 sprintf(minunit_last_message, "%s failed:\n\t%s:%d: %s", __func__, __FILE__, __LINE__, message);\
176#define mu_assert_int_eq(expected, result) MU__SAFE_BLOCK(\
180 minunit_tmp_e = (expected);\
181 minunit_tmp_r = (result);\
182 if (minunit_tmp_e != minunit_tmp_r) {\
183 sprintf(minunit_last_message, "%s failed:\n\t%s:%d: %d expected but was %d", __func__, __FILE__, __LINE__, minunit_tmp_e, minunit_tmp_r);\
191#define mu_assert_double_eq(expected, result) MU__SAFE_BLOCK(\
192 double minunit_tmp_e;\
193 double minunit_tmp_r;\
195 minunit_tmp_e = (expected);\
196 minunit_tmp_r = (result);\
197 if (fabs(minunit_tmp_e-minunit_tmp_r) > MINUNIT_EPSILON) {\
198 int minunit_significant_figures = 1 - log10(MINUNIT_EPSILON);\
199 sprintf(minunit_last_message, "%s failed:\n\t%s:%d: %.*g expected but was %.*g", __func__, __FILE__, __LINE__, minunit_significant_figures, minunit_tmp_e, minunit_significant_figures, minunit_tmp_r);\
207#define mu_assert_string_eq(expected, result) MU__SAFE_BLOCK(\
208 const char* minunit_tmp_e = expected;\
209 const char* minunit_tmp_r = result;\
211 if (!minunit_tmp_e) {\
212 minunit_tmp_e = "<null pointer>";\
214 if (!minunit_tmp_r) {\
215 minunit_tmp_r = "<null pointer>";\
217 if(strcmp(minunit_tmp_e, minunit_tmp_r)) {\
218 sprintf(minunit_last_message, "%s failed:\n\t%s:%d: '%s' expected but was '%s'", __func__, __FILE__, __LINE__, minunit_tmp_e, minunit_tmp_r);\
239static long mu_timer_real(
void)
244 the_ticks = sys_time_jiffies();
253static long mu_timer_cpu(
void)