1212#include  <rtklibc.h> 
1313#include  <utest.h> 
1414
15- static  rt_err_t  utest_tc_init (void )
16- {
17-     return  RT_EOK ;
18- }
19- 
20- static  rt_err_t  utest_tc_cleanup (void )
21- {
22-     return  RT_EOK ;
23- }
24- 
2515static  void  TC_rt_memcmp_str (void )
2616{
2717    const  char *  s  =  "abc 123" ;
@@ -32,20 +22,140 @@ static void TC_rt_memcmp_str(void)
3222
3323    /* The following tests intentionally use a length > 3 */ 
3424    /* To test what rt_memcmp does in such a situation */ 
35-     uassert_int_equal (!!(rt_memcmp (s , "abc" , 6 ) >  0 ), 1 );
36-     uassert_int_equal (!!(rt_memcmp ("abc" , s , 6 ) <  0 ), 1 );
25+     uassert_int_greater (rt_memcmp (s , "abc" , 6 ), 0 );
26+     uassert_int_less (rt_memcmp ("abc" , s , 6 ), 0 );
27+ }
28+ 
29+ static  void  TC_rt_memcmp_int_array (void )
30+ {
31+     int  arr1 [] =  {1 , 2 , 3 , 4 , 5 };
32+     int  arr2 [] =  {1 , 2 , 3 , 4 , 5 };
33+     int  arr3 [] =  {1 , 2 , 3 , 4 , 6 };
34+ 
35+     uassert_int_equal (rt_memcmp (arr1 , arr2 , sizeof (arr1 )), 0 );
36+     uassert_int_less (rt_memcmp (arr1 , arr3 , sizeof (arr1 )), 0 );
37+     uassert_int_greater (rt_memcmp (arr3 , arr1 , sizeof (arr1 )), 0 );
38+ }
39+ 
40+ static  void  TC_rt_memcmp_float_array (void )
41+ {
42+     float  arr1 [] =  {1.0f , 2.0f , 3.0f };
43+     float  arr2 [] =  {1.0f , 2.0f , 3.0f };
44+     float  arr3 [] =  {1.0f , 2.0f , 3.1f };
45+ 
46+     uassert_int_equal (rt_memcmp (arr1 , arr2 , sizeof (arr1 )), 0 );
47+     uassert_int_less (rt_memcmp (arr1 , arr3 , sizeof (arr1 )), 0 );
48+     uassert_int_greater (rt_memcmp (arr3 , arr1 , sizeof (arr1 )), 0 );
49+ }
50+ 
51+ typedef  struct  {
52+     int  id ;
53+     float  value ;
54+ } Item ;
55+ 
56+ static  void  TC_rt_memcmp_struct_array (void )
57+ {
58+     Item  arr1 [] =  {{1 , 1.0f }, {2 , 2.0f }};
59+     Item  arr2 [] =  {{1 , 1.0f }, {2 , 2.0f }};
60+     Item  arr3 [] =  {{1 , 1.0f }, {2 , 2.1f }};
61+ 
62+     uassert_int_equal (rt_memcmp (arr1 , arr2 , sizeof (arr1 )), 0 );
63+     uassert_int_less (rt_memcmp (arr1 , arr3 , sizeof (arr1 )), 0 );
64+     uassert_int_greater (rt_memcmp (arr3 , arr1 , sizeof (arr1 )), 0 );
65+ }
66+ 
67+ typedef  struct  {
68+     int  id ;
69+     float  value ;
70+     char  name [10 ];
71+ } MixedItem ;
72+ 
73+ static  void  TC_rt_memcmp_mixed_array (void )
74+ {
75+     MixedItem  arr1 [] =  {{1 , 1.0f , "item1" }, {2 , 2.0f , "item2" }};
76+     MixedItem  arr2 [] =  {{1 , 1.0f , "item1" }, {2 , 2.0f , "item2" }};
77+     MixedItem  arr3 [] =  {{1 , 1.0f , "item1" }, {2 , 2.1f , "item2" }};
78+ 
79+     uassert_int_equal (rt_memcmp (arr1 , arr2 , sizeof (arr1 )), 0 );
80+     uassert_int_less (rt_memcmp (arr1 , arr3 , sizeof (arr1 )), 0 );
81+     uassert_int_greater (rt_memcmp (arr3 , arr1 , sizeof (arr1 )), 0 );
82+ }
83+ 
84+ typedef  struct  {
85+     int  id ;
86+     float  score ;
87+ } Student ;
88+ 
89+ typedef  struct  {
90+     Student  students [3 ];
91+     char  className [10 ];
92+ } Class ;
93+ 
94+ static  void  TC_rt_memcmp_nested_struct_array (void )
95+ {
96+     Class  class1  =  {
97+         .students  =  {{1 , 90.5 }, {2 , 85.0 }, {3 , 92.0 }},
98+         .className  =  "ClassA" 
99+     };
100+ 
101+     Class  class2  =  {
102+         .students  =  {{1 , 90.5 }, {2 , 85.0 }, {3 , 92.0 }},
103+         .className  =  "ClassA" 
104+     };
105+ 
106+     Class  class3  =  {
107+         .students  =  {{1 , 90.5 }, {2 , 85.1 }, {3 , 92.0 }},
108+         .className  =  "ClassA" 
109+     };
110+ 
111+     uassert_int_equal (rt_memcmp (& class1 , & class2 , sizeof (Class )), 0 );
112+     uassert_int_not_equal (rt_memcmp (& class1 , & class3 , sizeof (Class )), 0 );
113+ }
114+ 
115+ static  void  TC_rt_memcmp_partial_match (void )
116+ {
117+     char  arr1 [] =  "abcdefghijklmnopqrstuvwxyz" ;
118+     char  arr2 [] =  "abcdefghijklmxyznopqrstuvw" ;
119+ 
120+     uassert_int_equal (rt_memcmp (arr1 , arr2 , 13 ), 0 );
121+     uassert_int_not_equal (rt_memcmp (arr1 , arr2 , sizeof (arr1 )), 0 );
122+ }
123+ 
124+ #define  LARGE_ARRAY_SIZE  1000
125+ 
126+ static  void  TC_rt_memcmp_large_array (void )
127+ {
128+     int  * arr1  =  rt_calloc (LARGE_ARRAY_SIZE , sizeof (int ));
129+     int  * arr2  =  rt_calloc (LARGE_ARRAY_SIZE , sizeof (int ));
130+ 
131+     uassert_not_null (arr1 );
132+     uassert_not_null (arr2 );
133+ 
134+     for  (int  i  =  0 ; i  <  LARGE_ARRAY_SIZE ; i ++ ) {
135+         arr1 [i ] =  i ;
136+         arr2 [i ] =  i ;
137+     }
138+ 
139+     uassert_int_equal (rt_memcmp (arr1 , arr2 , LARGE_ARRAY_SIZE  *  sizeof (int )), 0 );
140+     arr2 [LARGE_ARRAY_SIZE  -  1 ] =  LARGE_ARRAY_SIZE ;
37141
38-     /* Check RT_NULL input handling */ 
39-     uassert_int_not_equal (rt_memcmp ("abc" , RT_NULL , 3 ), 0 );
40-     uassert_int_not_equal (rt_memcmp (RT_NULL , "abc" , 3 ), 0 );
142+     uassert_int_less (rt_memcmp (arr1 , arr2 , LARGE_ARRAY_SIZE  *  sizeof (int )), 0 );
143+     uassert_int_greater (rt_memcmp (arr2 , arr1 , LARGE_ARRAY_SIZE  *  sizeof (int )), 0 );
41144
42-     /* Check that two RT_NULL strings will match */ 
43-     uassert_int_equal ( rt_memcmp ( RT_NULL ,  RT_NULL ,  0 ),  0 );
145+     rt_free ( arr1 ); 
146+     rt_free ( arr2 );
44147}
45148
46149static  void  utest_do_tc (void )
47150{
48151    UTEST_UNIT_RUN (TC_rt_memcmp_str );
152+     UTEST_UNIT_RUN (TC_rt_memcmp_int_array );
153+     UTEST_UNIT_RUN (TC_rt_memcmp_float_array );
154+     UTEST_UNIT_RUN (TC_rt_memcmp_struct_array );
155+     UTEST_UNIT_RUN (TC_rt_memcmp_mixed_array );
156+     UTEST_UNIT_RUN (TC_rt_memcmp_nested_struct_array );
157+     UTEST_UNIT_RUN (TC_rt_memcmp_partial_match );
158+     UTEST_UNIT_RUN (TC_rt_memcmp_large_array );
49159}
50160
51- UTEST_TC_EXPORT (utest_do_tc , "klibc.rt_memcmp" , utest_tc_init ,  utest_tc_cleanup , 1000 );
161+ UTEST_TC_EXPORT (utest_do_tc , "klibc.rt_memcmp" , RT_NULL ,  RT_NULL , 1000 );
0 commit comments