+2026-05-25 Bruno Haible <bruno@clisp.org>
+
+ mbspcasecmp tests: Enhance tests.
+ * tests/test-mbspcasecmp.c (test_ascii): New function, extracted from
+ main.
+ (test_utf_8): Likewise. Add test cases with incomplete characters.
+ (main): Invoke them. Accept a numeric argument.
+ * tests/test-mbspcasecmp-4.sh: Renamed from tests/test-mbspcasecmp.sh.
+ * tests/test-mbspcasecmp-3.sh: New file, based on
+ tests/test-mbmemcasecmp-3.sh.
+ * modules/mbspcasecmp-tests (Files): Update after rename. Add
+ locale-en.m4, locale-fr.m4.
+ (configure.ac): Invoke gt_LOCALE_EN_UTF8, gt_LOCALE_FR_UTF8.
+ (Makefile.am): Arrange to run test-mbspcasecmp-3.sh,
+ test-mbspcasecmp-4.sh, instead of test-mbspcasecmp.sh.
+
2026-05-25 Bruno Haible <bruno@clisp.org>
mbsncasecmp tests: Enhance tests.
#include "macros.h"
-int
-main ()
+static void
+test_ascii (void)
{
- /* configure should already have checked that the locale is supported. */
- if (setlocale (LC_ALL, "") == NULL)
- return 1;
-
{
const char string[] = "paragraph";
ASSERT (mbspcasecmp (string, "Paragraph") == string + 9);
const char string[] = "paragraph";
ASSERT (mbspcasecmp (string, "para") == string + 4);
}
+}
+static void
+test_utf_8 (bool turkish)
+{
/* The following tests shows how mbspcasecmp() is different from
strncasecmp(). */
+ if (turkish)
+ {
+ {
+ const char string[] = "\303\266zg\303\274rt\303\274k"; /* özgürtük */
+ ASSERT (mbspcasecmp (string, "\303\226ZG\303\234R") == string + 7); /* özgür */
+ }
+
+ {
+ const char string[] = "\303\226ZG\303\234Rt\303\274k"; /* özgürtük */
+ ASSERT (mbspcasecmp (string, "\303\266zg\303\274r") == string + 7); /* özgür */
+ }
+
+ /* This test shows how strings of different size can compare equal. */
+
+ {
+ const char string[] = "turkishtime";
+ ASSERT (mbspcasecmp (string, "TURK\304\260SH") == string + 7);
+ }
+
+ {
+ const char string[] = "TURK\304\260SHK\303\234LT\303\234R";
+ ASSERT (mbspcasecmp (string, "turkish") == string + 8);
+ }
+ }
+
+ /* Incomplete characters. See
+ https://www.unicode.org/versions/Unicode15.0.0/ch03.pdf
+ page 128 table 3-11. */
+
+ /* "\341\200\240" = 0xE1 0x80 0xA0 = U+1020. */
{
- const char string[] = "\303\266zg\303\274rt\303\274k"; /* özgürtük */
- ASSERT (mbspcasecmp (string, "\303\226ZG\303\234R") == string + 7); /* özgür */
+ const char string[] = "\341\200";
+ ASSERT (mbspcasecmp (string, "\341\200") == string + 2);
}
-
{
- const char string[] = "\303\226ZG\303\234Rt\303\274k"; /* özgürtük */
- ASSERT (mbspcasecmp (string, "\303\266zg\303\274r") == string + 7); /* özgür */
+ const char string[] = "\341\200X";
+ ASSERT (mbspcasecmp (string, "\341\200x") == string + 3);
}
-
- /* This test shows how strings of different size can compare equal. */
-
{
- const char string[] = "turkishtime";
- ASSERT (mbspcasecmp (string, "TURK\304\260SH") == string + 7);
+ const char string[] = "\341";
+ ASSERT (mbspcasecmp (string, "\341") == string + 1);
}
-
{
- const char string[] = "TURK\304\260SHK\303\234LT\303\234R";
- ASSERT (mbspcasecmp (string, "turkish") == string + 8);
+ const char string[] = "\341X";
+ ASSERT (mbspcasecmp (string, "\341x") == string + 2);
}
+ /* "\360\221\222\240" = 0xF0 0x91 0x92 0xA0 = U+114A0. */
+ {
+ const char string[] = "\360\221\222";
+ ASSERT (mbspcasecmp (string, "\360\221\222") == string + 3);
+ }
+ {
+ const char string[] = "\360\221\222X";
+ ASSERT (mbspcasecmp (string, "\360\221\222x") == string + 4);
+ }
+ {
+ const char string[] = "\360\221";
+ ASSERT (mbspcasecmp (string, "\360\221") == string + 2);
+ }
+ {
+ const char string[] = "\360\221X";
+ ASSERT (mbspcasecmp (string, "\360\221x") == string + 3);
+ }
+ {
+ const char string[] = "\360";
+ ASSERT (mbspcasecmp (string, "\360") == string + 1);
+ }
+ {
+ const char string[] = "\360X";
+ ASSERT (mbspcasecmp (string, "\360x") == string + 2);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* configure should already have checked that the locale is supported. */
+ if (setlocale (LC_ALL, "") == NULL)
+ return 1;
+
+ test_ascii ();
+
+ if (argc > 1)
+ switch (argv[1][0])
+ {
+ case '3':
+ /* Locale encoding is UTF-8, locale is not Turkish. */
+ test_utf_8 (false);
+ return test_exit_status;
+
+ case '4':
+ /* Locale encoding is UTF-8, locale is Turkish. */
+ test_utf_8 (true);
+ return test_exit_status;
+ }
- return test_exit_status;
+ return 1;
}