]> git.llucax.com Git - software/mutest.git/blob - mutest.h
1f5561d745a22deef43776c04b37b9f7590200aa
[software/mutest.git] / mutest.h
1
2 #include <stdio.h> /* fprintf() */
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 /* check that an expression evaluates to true, continue if the check fails */
9 #define mu_check(exp) \
10         do { \
11                 mu_print(MU_CHECK, "\t\t* Checking mu_check(%s)...\n", #exp); \
12                 if (exp) ++mutest_passed_checks; \
13                 else { \
14                         ++mutest_failed_checks; \
15                         mutest_case_failed = 1; \
16                         mu_print(MU_ERROR, "%s:%d: mu_check(%s) failed, " \
17                                         "resuming test case\n", __FILE__, \
18                                         __LINE__, #exp); \
19                 } \
20         } while (0)
21
22 /*
23  * ensure that an expression evaluates to true, abort the current test
24  * case if the check fails
25  */
26 #define mu_ensure(exp) \
27         do { \
28                 mu_print(MU_CHECK, "\t\t* Checking mu_ensure(%s)...\n", #exp);\
29                 if (exp) ++mutest_passed_checks; \
30                 else { \
31                         ++mutest_failed_checks; \
32                         mutest_case_failed = 1; \
33                         mu_print(MU_ERROR, "%s:%d: mu_ensure(%s) failed, " \
34                                         "aborting test case\n", __FILE__, \
35                                         __LINE__, #exp); \
36                         return; \
37                 } \
38         } while (0)
39
40 /*
41  * you don't need to pay any attention to what's next, unless you want to do
42  * some customization, of course, in which case, you're encouraged to take
43  * a look an play =)
44  */
45
46 /* verbosity level (each level shows all the previous levels too) */
47 enum {
48         MU_QUIET = 0, /* be completely quiet */
49         MU_ERROR,     /* shows errors only */
50         MU_SUMMARY,   /* shows a summary */
51         MU_SUITE,     /* shows test suites progress */
52         MU_CASE,      /* shows test cases progress */
53         MU_CHECK      /* shows the current running check */
54 };
55
56 /* print a message according to the verbosity level */
57 #define mu_print(level, ...) \
58         do { \
59                 if (mutest_verbose_level >= level) { \
60                         if (mutest_verbose_level == MU_ERROR) \
61                                 fprintf(stderr, __VA_ARGS__); \
62                         else \
63                                 fprintf(stdout, __VA_ARGS__); \
64                 } \
65         } while (0)
66
67 /*
68  * this function implements the test suites execution, you should generate
69  * a module with this function using mkmutest, or take a look to that script
70  * if you want to implement your own customized version */
71 void mu_run_suites();
72
73 /* macro for running a single test case */
74 #ifndef mu_run_case
75 #define mu_run_case(name) \
76         do { \
77                 mu_print(MU_CASE, "\t- executing test case \"" #name "\"\n"); \
78                 void name(); \
79                 mutest_case_name = #name; \
80                 name(); \
81                 if (mutest_case_failed) { \
82                         ++mutest_failed_cases; \
83                         mutest_suite_failed = 1; \
84                 } else ++mutest_passed_cases; \
85                 mutest_case_failed = 0; \
86         } while (0)
87 #endif /* mu_run_case */
88
89 /*
90  * mutest exported variables for internal use, do not use directly unless you
91  *  know what you're doing.
92  */
93 extern const char* mutest_suite_name;
94 extern int mutest_failed_suites;
95 extern int mutest_passed_suites;
96 extern int mutest_suite_failed;
97 /* test cases */
98 extern const char* mutest_case_name;
99 extern int mutest_failed_cases;
100 extern int mutest_passed_cases;
101 extern int mutest_case_failed;
102 /* checks */
103 extern int mutest_failed_checks;
104 extern int mutest_passed_checks;
105 /* verbosity */
106 extern int mutest_verbose_level;
107
108 #ifdef __cplusplus
109 }
110 #endif
111