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