@@ -92,6 +92,83 @@ START_TEST(test_case_insensitive_alpha_only)
9292}
9393END_TEST
9494
95+ START_TEST (test_strcasecmp_mixed_alnum_punct )
96+ {
97+ ck_assert_int_eq (strcasecmp ("Boot-123_OK!" , "bOot-123_ok!" ), 0 );
98+ ck_assert_int_eq (strcasecmp ("v1.2.3-rc1" , "V1.2.3-RC1" ), 0 );
99+ ck_assert_int_eq (strcasecmp ("A_B-C.D" , "a_b-c.d" ), 0 );
100+ }
101+ END_TEST
102+
103+ START_TEST (test_strcasecmp_non_alpha_ordering )
104+ {
105+ ck_assert_int_lt (strcasecmp ("abc-1" , "abc_1" ), 0 );
106+ ck_assert_int_gt (strcasecmp ("abc_1" , "abc-1" ), 0 );
107+ ck_assert_int_lt (strcasecmp ("abc1" , "abc2" ), 0 );
108+ ck_assert_int_gt (strcasecmp ("abc2" , "abc1" ), 0 );
109+ }
110+ END_TEST
111+
112+ START_TEST (test_strncasecmp_non_alpha_n_boundaries )
113+ {
114+ ck_assert_int_eq (strncasecmp ("Boot-123_OK!" , "bOot-123_ok?" , 11 ), 0 );
115+ ck_assert_int_lt (strncasecmp ("Boot-123_OK!" , "bOot-123_ok?" , 12 ), 0 );
116+ ck_assert_int_gt (strncasecmp ("bOot-123_ok?" , "Boot-123_OK!" , 12 ), 0 );
117+ ck_assert_int_eq (strncasecmp ("A1.B2-C3" , "a1.b2-c3" , 8 ), 0 );
118+ }
119+ END_TEST
120+
121+ START_TEST (test_strcasecmp_prefix_regression )
122+ {
123+ ck_assert_int_lt (strcasecmp ("a" , "ab" ), 0 );
124+ ck_assert_int_gt (strcasecmp ("ab" , "a" ), 0 );
125+ ck_assert_int_lt (strcasecmp ("" , "a" ), 0 );
126+ ck_assert_int_gt (strcasecmp ("a" , "" ), 0 );
127+ }
128+ END_TEST
129+
130+ START_TEST (test_strncasecmp_n_limit_regression )
131+ {
132+ ck_assert_int_eq (strncasecmp ("ABC" , "abc" , 0 ), 0 );
133+ ck_assert_int_eq (strncasecmp ("" , "a" , 0 ), 0 );
134+ ck_assert_int_eq (strncasecmp ("AbCd" , "aBcE" , 3 ), 0 );
135+ ck_assert_int_lt (strncasecmp ("AbCd" , "aBcE" , 4 ), 0 );
136+ }
137+ END_TEST
138+
139+ START_TEST (test_strncasecmp_stop_at_null_regression )
140+ {
141+ const char s1 [] = { 'A' , '\0' , 'x' , '\0' };
142+ const char s2 [] = { 'a' , '\0' , 'Y' , '\0' };
143+
144+ ck_assert_int_eq (strncasecmp (s1 , s2 , 2 ), 0 );
145+ ck_assert_int_eq (strncasecmp (s1 , s2 , 3 ), 0 );
146+ ck_assert_int_eq (strncasecmp (s1 , s2 , 8 ), 0 );
147+ }
148+ END_TEST
149+
150+ START_TEST (test_strncasecmp_prefix_large_n_regression )
151+ {
152+ ck_assert_int_lt (strncasecmp ("a" , "ab" , 8 ), 0 );
153+ ck_assert_int_gt (strncasecmp ("ab" , "a" , 8 ), 0 );
154+ ck_assert_int_lt (strncasecmp ("A" , "aB" , 8 ), 0 );
155+ }
156+ END_TEST
157+
158+ START_TEST (test_strncasecmp_no_read_past_null_when_n_remaining )
159+ {
160+ const char s1 [] = { '\0' };
161+ const char s2 [] = { '\0' };
162+
163+ /*
164+ * Regression target: if implementation does not stop on '\0' when n > 1,
165+ * the next loop iteration reads past both 1-byte buffers.
166+ */
167+ ck_assert_int_eq (strncasecmp (s1 , s2 , 2 ), 0 );
168+ ck_assert_int_eq (strncasecmp (s1 , s2 , 8 ), 0 );
169+ }
170+ END_TEST
171+
95172START_TEST (test_isalpha_helpers )
96173{
97174 ck_assert_int_eq (islower ('a' ), 1 );
@@ -145,6 +222,16 @@ START_TEST(test_strlen_strcmp)
145222}
146223END_TEST
147224
225+ START_TEST (test_strcmp_prefix_termination )
226+ {
227+ ck_assert_int_lt (strcmp ("a" , "abc" ), 0 );
228+ ck_assert_int_lt (strcmp ("ab" , "abc" ), 0 );
229+ ck_assert_int_gt (strcmp ("abc" , "ab" ), 0 );
230+ ck_assert_int_gt (strcmp ("abc" , "a" ), 0 );
231+ ck_assert_int_eq (strcmp ("" , "" ), 0 );
232+ }
233+ END_TEST
234+
148235START_TEST (test_strcpy_strncpy_strcat_strncat )
149236{
150237 char buf [8 ];
@@ -329,9 +416,18 @@ Suite *string_suite(void)
329416 tcase_add_test (tcase_strncasecmp , test_strncasecmp_n_exact );
330417 tcase_add_test (tcase_strncasecmp , test_strncasecmp_diff_before_n );
331418 tcase_add_test (tcase_strncasecmp , test_case_insensitive_alpha_only );
419+ tcase_add_test (tcase_strncasecmp , test_strcasecmp_mixed_alnum_punct );
420+ tcase_add_test (tcase_strncasecmp , test_strcasecmp_non_alpha_ordering );
421+ tcase_add_test (tcase_strncasecmp , test_strncasecmp_non_alpha_n_boundaries );
422+ tcase_add_test (tcase_strncasecmp , test_strcasecmp_prefix_regression );
423+ tcase_add_test (tcase_strncasecmp , test_strncasecmp_n_limit_regression );
424+ tcase_add_test (tcase_strncasecmp , test_strncasecmp_stop_at_null_regression );
425+ tcase_add_test (tcase_strncasecmp , test_strncasecmp_prefix_large_n_regression );
426+ tcase_add_test (tcase_strncasecmp , test_strncasecmp_no_read_past_null_when_n_remaining );
332427 tcase_add_test (tcase_misc , test_isalpha_helpers );
333428 tcase_add_test (tcase_misc , test_memset_memcmp_memchr );
334429 tcase_add_test (tcase_misc , test_strlen_strcmp );
430+ tcase_add_test (tcase_misc , test_strcmp_prefix_termination );
335431 tcase_add_test (tcase_misc , test_strcpy_strncpy_strcat_strncat );
336432 tcase_add_test (tcase_misc , test_strncmp );
337433 tcase_add_test (tcase_misc , test_memcpy_memmove );
0 commit comments