77
88#include "rmdev_test_framework.h"
99
10- static int success_count = 0U ; ///< 成功计数
11- static int fail_count = 0U ; ///< 失败计数
10+ enum {
11+ RMDEV_TEST_NO_ERROR = 0 , ///< 无错误
12+ RMDEV_TEST_NO_BREAK_CHARACTER , ///< 没有设置换行符
13+ RMDEV_TEST_NO_PRINTF_CALLBACK , ///< 没有设置 printf 回调函数
14+ RMDEV_TEST_NO_DELAY_CALLBACK , ///< 没有设置 delay 回调函数
15+ RMDEV_TEST_NO_TEST_ITEM_CALLBACK , ///< 没有设置 test_item 回调函数
16+ RMDEV_TEST_TEST_ITEM_COUNT_ERROR , ///< 测试项计数与成功、错误的项目计数不匹配
17+ RMDEV_TEST_OTHER_ERROR ///< 其他错误
18+ };
1219
13- /**
14- * rmdev 测试框架 延时函数
15- * @attention 这是接口函数,具体实现需要根据平台来编写,即需要在平台的相关文件中实现这个函数的定义。
16- * @param ms 毫秒数
17- */
18- void rmdev_test_delay (unsigned int ms );
20+ unsigned char rmdev_test_error_code = RMDEV_TEST_NO_ERROR ; ///< 测试框架错误码
1921
20- /**
21- * rmdev 测试框架 测试项
22- * @attention 这是接口函数,需要在平台的相关文件中实现这个函数的定义。
23- */
24- void rmdev_test_testItem (void );
22+ static const char * break_character ; ///< 换行符
23+
24+ static rmdev_test_printfCallback printfCallback_ = RMDEV_TEST_NULL ;
25+ static rmdev_test_delayCallback delayCallback_ = RMDEV_TEST_NULL ;
26+ static rmdev_test_testItemCallback testItemCallback_ = RMDEV_TEST_NULL ;
27+
28+ static int test_item_total_count = 0U ; ///< 测试项计数
29+ static int success_count = 0U ; ///< 成功计数
30+ static int fail_count = 0U ; ///< 失败计数
31+
32+ static rmdev_test_bool_t in_test_item = RMDEV_TEST_FALSE ; ///< 是否在测试项中
33+
34+ static const char * current_test_item_name = "" ; ///< 当前测试项名称
35+ static int test_item_index = 0U ; ///< 测试项编号
36+ static int test_item_success_count = 0U ; ///< 单个测试项成功计数
37+ static int test_item_fail_count = 0U ; ///< 单个测试项失败计数
2538
2639static void rmdev_test_finish (void );
40+ static void rmdev_test_item_finish (const char * name );
41+
42+ /// 打印行分割线
43+ #define PRINTF_LINE (void ) printfCallback_("==================================================%s", break_character)
44+
45+ /// 打印单行分割线
46+ #define PRINTF_SINGLE_LINE (void ) \
47+ printfCallback_("--------------------------------------------------%s", break_character)
48+
49+ /// 结束的死循环
50+ #define END_LOOP (void ) \
51+ do { \
52+ } while (RMDEV_TEST_TRUE)
53+
54+ static void rmdev_test_item_finish (const char * name )
55+ {
56+ in_test_item = RMDEV_TEST_FALSE ;
57+
58+ if (test_item_index != test_item_success_count + test_item_fail_count ) {
59+ printfCallback_ (
60+ "rmdev_test_framework Fatal error: Test item count (%d) does not match success (%d) and fail (%d) "
61+ "counts!%s" ,
62+ test_item_index ,
63+ test_item_success_count ,
64+ test_item_fail_count ,
65+ break_character );
66+
67+ rmdev_test_error_code = RMDEV_TEST_TEST_ITEM_COUNT_ERROR ;
68+ END_LOOP ();
69+ }
70+
71+ PRINTF_SINGLE_LINE ();
72+ printfCallback_ (" Test item \"%s\" finished.%s" , name , break_character );
73+ printfCallback_ (" %d test(s) succeeded, %d test(s) failed.%s" ,
74+ test_item_success_count ,
75+ test_item_fail_count ,
76+ break_character );
77+ PRINTF_SINGLE_LINE ();
78+ }
79+
80+ void rmdev_test_item (const char * name , const char * file , const int line )
81+ {
82+ if (!in_test_item ) {
83+ in_test_item = RMDEV_TEST_TRUE ;
84+ test_item_index = 0U ;
85+ test_item_success_count = 0U ;
86+ test_item_fail_count = 0U ;
87+ current_test_item_name = name ;
88+
89+ PRINTF_LINE ();
90+ printfCallback_ (" Test item \"%s\" started.%s" , name , break_character );
91+ printfCallback_ (" (In file %s:%d)%s" , file , line , break_character );
92+ PRINTF_LINE ();
93+ }
94+ else {
95+ rmdev_test_item_finish (current_test_item_name );
96+ rmdev_test_item (name , file , line );
97+ }
98+ }
2799
28- void rmdev_test_check (const char * name , const char * file , const int line , const rmdev_test_bool_t result )
100+ void rmdev_test_check (const char * file , const int line , const rmdev_test_bool_t result )
29101{
102+ if (!in_test_item ) {
103+ printfCallback_ ("Error: Test check called without a test item started!%s" , break_character );
104+ END_LOOP ();
105+ }
106+
107+ ++ test_item_total_count ;
108+ ++ test_item_index ;
109+
30110 if (result ) {
31- rmdev_test_printf ( "Test %s passed.\r\n " , name );
111+ printfCallback_ ( "No.%d passed.%s " , test_item_index , break_character );
32112 ++ success_count ;
113+ ++ test_item_success_count ;
33114 }
34115 else {
35- rmdev_test_printf ( "Test %s failed at %s:%d.\r\n " , name , file , line );
116+ printfCallback_ ( "No.%d check failed at %s:%d.%s " , test_item_index , file , line , break_character );
36117 ++ fail_count ;
118+ ++ test_item_fail_count ;
37119 }
38120}
39121
40- void rmdev_test_assert (const char * name , const char * file , const int line , const rmdev_test_bool_t result )
122+ void rmdev_test_assert (const char * file , const int line , const rmdev_test_bool_t result )
41123{
124+ if (!in_test_item ) {
125+ printfCallback_ ("Error: Test assert called without a test item started!%s" , break_character );
126+ END_LOOP ();
127+ }
128+
129+ ++ test_item_total_count ;
130+ ++ test_item_index ;
131+
42132 if (result ) {
43- rmdev_test_printf ( "Assert %s passed.\r\n " , name );
133+ printfCallback_ ( "No.%d passed.%s " , test_item_index , break_character );
44134 ++ success_count ;
135+ ++ test_item_success_count ;
45136 }
46137 else {
47- rmdev_test_printf ( "Assert %s failed at %s:%d.\r\nTest failed!\r\n " , name , file , line );
138+ printfCallback_ ( "No.%d assert failed at %s:%d.%s " , test_item_index , file , line , break_character );
48139 ++ fail_count ;
140+ ++ test_item_fail_count ;
49141
142+ rmdev_test_item_finish (current_test_item_name );
50143 rmdev_test_finish ();
51144 }
52145}
@@ -56,16 +149,57 @@ void rmdev_test_assert(const char* name, const char* file, const int line, const
56149 */
57150static void rmdev_test_finish (void )
58151{
59- rmdev_test_printf ( "\r\nTest Finished.\r\n\r\n %d Test(s) Succeeded, %d Test(s) Failed.\r\n" ,
60- success_count ,
61- fail_count );
62- while ( RMDEV_TEST_TRUE ) {
152+ if ( success_count + fail_count == test_item_total_count ) {
153+ printfCallback_ ( "\r\nTest Finished.\r\n\r\n %d Test(s) Succeeded, %d Test(s) Failed.\r\n" ,
154+ success_count ,
155+ fail_count );
63156 }
157+ else {
158+ rmdev_test_error_code = RMDEV_TEST_TEST_ITEM_COUNT_ERROR ;
159+
160+ printfCallback_ (
161+ "rmdev_test_framework Fatal error: Test item count (%d) does not match success (%d) and fail (%d) "
162+ "counts!%s" ,
163+ test_item_total_count ,
164+ success_count ,
165+ fail_count ,
166+ break_character );
167+ }
168+
169+ END_LOOP ();
64170}
65171
66- void rmdev_test_framework_main (void )
172+ void rmdev_test_framework_main (const char * break_char ,
173+ const rmdev_test_printfCallback printfCallback ,
174+ const rmdev_test_delayCallback delayCallback ,
175+ const rmdev_test_testItemCallback testItemCallback )
67176{
68- rmdev_test_testItem ();
177+ break_character = break_char ;
178+
179+ printfCallback_ = printfCallback ;
180+ delayCallback_ = delayCallback ;
181+ testItemCallback_ = testItemCallback ;
182+
183+ if (break_character == RMDEV_TEST_NULL ) {
184+ rmdev_test_error_code = RMDEV_TEST_NO_BREAK_CHARACTER ;
185+ END_LOOP ();
186+ }
187+ if (printfCallback_ == RMDEV_TEST_NULL ) {
188+ rmdev_test_error_code = RMDEV_TEST_NO_PRINTF_CALLBACK ;
189+ END_LOOP ();
190+ }
191+ if (delayCallback_ == RMDEV_TEST_NULL ) {
192+ rmdev_test_error_code = RMDEV_TEST_NO_DELAY_CALLBACK ;
193+ printfCallback_ ("rmdev_test_framework Fatal error: No delay callback function set!%s" , break_character );
194+ END_LOOP ();
195+ }
196+ if (testItemCallback_ == RMDEV_TEST_NULL ) {
197+ rmdev_test_error_code = RMDEV_TEST_NO_TEST_ITEM_CALLBACK ;
198+ printfCallback_ ("rmdev_test_framework Fatal error: No test item callback function set!%s" , break_character );
199+ END_LOOP ();
200+ }
201+
202+ testItemCallback_ ();
69203
70204 rmdev_test_finish ();
71205}
0 commit comments