MoonUnit
 All Data Structures Variables Enumerations Enumerator Groups Pages
interface.h
1 /*
2  * Copyright (c) 2007, Brian Koropoff
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the Moonunit project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY BRIAN KOROPOFF ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL BRIAN KOROPOFF BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
47 
50 #ifndef __MU_INTERFACE_H__
51 #define __MU_INTERFACE_H__
52 
53 #include <moonunit/internal/boilerplate.h>
54 #include <moonunit/type.h>
55 #include <moonunit/test.h>
56 
57 #include <stdlib.h>
58 
59 C_BEGIN_DECLS
60 
70 
90 #define MU_TEST(suite_name, test_name) \
91  void __mu_f_test_##suite_name##_##test_name(void); \
92  C_DECL MuEntryInfo __mu_e_test_##suite_name##_##test_name; \
93  MuEntryInfo __mu_e_test_##suite_name##_##test_name = \
94  { \
95  FIELD(type, MU_ENTRY_TEST), \
96  FIELD(name, #test_name), \
97  FIELD(container, #suite_name), \
98  FIELD(file, __FILE__), \
99  FIELD(line, __LINE__), \
100  FIELD(run, __mu_f_test_##suite_name##_##test_name) \
101  }; \
102  void __mu_f_test_##suite_name##_##test_name(void)
103 
122 #define MU_LIBRARY_SETUP() \
123  void __mu_f_library_setup(void); \
124  C_DECL MuEntryInfo __mu_e_library_setup; \
125  MuEntryInfo __mu_e_library_setup = \
126  { \
127  FIELD(type, MU_ENTRY_LIBRARY_SETUP), \
128  FIELD(name, NULL), \
129  FIELD(container, NULL), \
130  FIELD(file, __FILE__), \
131  FIELD(line, __LINE__), \
132  FIELD(run, __mu_f_library_setup) \
133  }; \
134  void __mu_f_library_setup(void)
135 
154 #define MU_LIBRARY_TEARDOWN() \
155  void __mu_f_library_teardown(void); \
156  C_DECL MuEntryInfo __mu_e_library_teardown; \
157  MuEntryInfo __mu_e_library_teardown = \
158  { \
159  FIELD(type, MU_ENTRY_LIBRARY_TEARDOWN), \
160  FIELD(name, NULL), \
161  FIELD(container, NULL), \
162  FIELD(file, __FILE__), \
163  FIELD(line, __LINE__), \
164  FIELD(run, __mu_f_library_teardown) \
165  }; \
166  void __mu_f_library_teardown(void)
167 
198 #define MU_FIXTURE_SETUP(suite_name) \
199  void __mu_f_fixture_setup_##suite_name(void); \
200  C_DECL MuEntryInfo __mu_e_fixture_setup_##suite_name; \
201  MuEntryInfo __mu_e_fixture_setup_##suite_name = \
202  { \
203  FIELD(type, MU_ENTRY_FIXTURE_SETUP), \
204  FIELD(name, NULL), \
205  FIELD(container, #suite_name), \
206  FIELD(file, __FILE__), \
207  FIELD(line, __LINE__), \
208  FIELD(run, __mu_f_fixture_setup_##suite_name) \
209  }; \
210  void __mu_f_fixture_setup_##suite_name(void) \
211 
212 
247 #define MU_FIXTURE_TEARDOWN(suite_name) \
248  void __mu_f_fixture_teardown_##suite_name(void); \
249  C_DECL MuEntryInfo __mu_e_fixture_teardown_##suite_name; \
250  MuEntryInfo __mu_e_fixture_teardown_##suite_name = \
251  { \
252  FIELD(type, MU_ENTRY_FIXTURE_TEARDOWN), \
253  FIELD(name, NULL), \
254  FIELD(container, #suite_name), \
255  FIELD(file, __FILE__), \
256  FIELD(line, __LINE__), \
257  FIELD(run, __mu_f_fixture_teardown_##suite_name) \
258  }; \
259  void __mu_f_fixture_teardown_##suite_name(void) \
260 
261 
289 #define MU_LIBRARY_CONSTRUCT() \
290  void __mu_f_library_construct(void); \
291  C_DECL MuEntryInfo __mu_e_library_construct; \
292  MuEntryInfo __mu_e_library_construct = \
293  { \
294  FIELD(type, MU_ENTRY_LIBRARY_CONSTRUCT), \
295  FIELD(name, NULL), \
296  FIELD(container, NULL), \
297  FIELD(file, __FILE__), \
298  FIELD(line, __LINE__), \
299  FIELD(run, __mu_f_library_construct) \
300  }; \
301  void __mu_f_library_construct(void)
302 
331 #define MU_LIBRARY_DESTRUCT() \
332  void __mu_f_library_destruct(void); \
333  C_DECL MuEntryInfo __mu_e_library_destruct; \
334  MuEntryInfo __mu_e_library_destruct = \
335  { \
336  FIELD(type, MU_ENTRY_LIBRARY_DESTRUCT), \
337  FIELD(name, NULL), \
338  FIELD(container, NULL), \
339  FIELD(file, __FILE__), \
340  FIELD(line, __LINE__), \
341  FIELD(run, __mu_f_library_destruct) \
342  }; \
343  void __mu_f_library_destruct(void)
344 
368 #define MU_LIBRARY_INFO(info_key, info_value) \
369  C_DECL MuEntryInfo __mu_e_library_info_##info_key; \
370  MuEntryInfo __mu_e_library_info_##info_key = \
371  { \
372  FIELD(type, MU_ENTRY_LIBRARY_INFO), \
373  FIELD(name, #info_key), \
374  FIELD(container, info_value), \
375  FIELD(file, __FILE__), \
376  FIELD(line, __LINE__), \
377  FIELD(run, NULL) \
378  };
379 
404 #define MU_LIBRARY_NAME(lib_name) MU_LIBRARY_INFO(name, lib_name)
405 
417 
436 #define MU_ASSERT(expr) \
437  (mu_interface_assert(__FILE__, __LINE__, #expr, 1, (expr)))
438 
472 #define MU_ASSERT_EQUAL(type, expr1, expr2) \
473  (mu_interface_assert_equal(__FILE__, __LINE__, \
474  #expr1, #expr2, 1, \
475  type, (expr1), (expr2))) \
476 
477 
510 #define MU_ASSERT_NOT_EQUAL(type, expr1, expr2) \
511  (mu_interface_assert_equal(__FILE__, __LINE__, \
512  #expr1, #expr2, 0, \
513  type, (expr1), (expr2))) \
514 
515 
530 #define MU_ASSERT_NOT_REACHED() \
531  (mu_interface_result(__FILE__, __LINE__, MU_STATUS_ASSERTION, \
532  "Statement reached unexpectedly"))
533 
546 #define MU_SUCCESS() \
547  (mu_interface_result(__FILE__, __LINE__, MU_STATUS_SUCCESS, NULL))
548 
569 #ifdef DOXYGEN
570 # define MU_FAILURE(format, ...)
571 #else
572 # define MU_FAILURE(...) \
573  (mu_interface_result(__FILE__, __LINE__, MU_STATUS_FAILURE, __VA_ARGS__))
574 #endif
575 
597 #ifdef DOXYGEN
598 # define MU_SKIP(format, ...)
599 #else
600 # define MU_SKIP(...) \
601  (mu_interface_result(__FILE__, __LINE__, MU_STATUS_SKIPPED, __VA_ARGS__))
602 #endif
603 
635 #define MU_EXPECT(result) \
636  (mu_interface_expect((result)))
637 
656 #define MU_TIMEOUT(ms) \
657  (mu_interface_timeout((ms)))
658 
683 #define MU_ITERATE(count) \
684  (mu_interface_iterations((count)))
685 
712 #define MU_LOG(level, ...) \
713  (mu_interface_event(__FILE__, __LINE__, (level), __VA_ARGS__))
714 
721 #define MU_WARNING(...) \
722  (MU_LOG(MU_LEVEL_WARNING, __VA_ARGS__))
723 
729 #define MU_INFO(...) \
730  (MU_LOG(MU_LEVEL_INFO, __VA_ARGS__))
731 
737 #define MU_VERBOSE(...) \
738  (MU_LOG(MU_LEVEL_VERBOSE, __VA_ARGS__))
739 
745 #define MU_DEBUG(...) \
746  (MU_LOG(MU_LEVEL_DEBUG, __VA_ARGS__))
747 
754 #define MU_TRACE(...) \
755  (MU_LOG(MU_LEVEL_TRACE, __VA_ARGS__))
756 
770 
788 #define MU_RESOURCE(key) \
789  (mu_interface_get_resource(__FILE__, __LINE__, key))
790 
805 #define MU_RESOURCE_FROM_SECTION(section, key) \
806  (mu_interface_get_resource_from_section(__FILE__, __LINE__, section, key))
807 
819 
838 #define MU_CURRENT_TEST (mu_interface_current_test())
839 
842 #ifndef DOXYGEN
843 #define MU_TEST_PREFIX "__mu_t_"
844 #define MU_FUNC_PREFIX "__mu_f_"
845 #define MU_FS_PREFIX "__mu_fs_"
846 #define MU_FT_PREFIX "__mu_ft_"
847 
848 void mu_interface_expect(MuTestStatus status);
849 void mu_interface_timeout(long ms);
850 void mu_interface_iterations(unsigned int count);
851 void mu_interface_event(const char* file, unsigned int line, MuLogLevel level, const char* fmt, ...);
852 void mu_interface_assert(const char* file, unsigned int line, const char* expr, int sense, int result);
853 void mu_interface_assert_equal(const char* file, unsigned int line, const char* expr1, const char* expr2, int sense, MuType type, ...);
854 void mu_interface_result(const char* file, unsigned int line, MuTestStatus result, const char* message, ...);
855 MuTest* mu_interface_current_test(void);
856 
857 const char* mu_interface_get_resource(const char* file, unsigned int line, const char* key);
858 const char* mu_interface_get_resource_in_section(const char* file, unsigned int line, const char* section, const char* key);
859 
860 typedef enum MuEntryType
861 {
862  MU_ENTRY_TEST,
863  MU_ENTRY_LIBRARY_SETUP,
864  MU_ENTRY_LIBRARY_TEARDOWN,
865  MU_ENTRY_FIXTURE_SETUP,
866  MU_ENTRY_FIXTURE_TEARDOWN,
867  MU_ENTRY_LIBRARY_CONSTRUCT,
868  MU_ENTRY_LIBRARY_DESTRUCT,
869  MU_ENTRY_LIBRARY_INFO
870 } MuEntryType;
871 
872 typedef struct MuEntryInfo
873 {
874  MuEntryType type;
875  const char* name;
876  const char* container;
877  const char* file;
878  unsigned int line;
879  void (*run)(void);
880 } MuEntryInfo;
881 
882 extern void __mu_stub_hook(MuEntryInfo*** es);
883 
884 #endif
885 
886 C_END_DECLS
887 
888 #endif
MuLogLevel
Definition: test.h:133
MuTestStatus
Definition: test.h:56