From: Bruno Haible Date: Mon, 10 Jul 2023 22:06:14 +0000 (+0200) Subject: mbrtoc32-regular: Add tests. X-Git-Tag: v1.0~1138 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=2d46fcdd3fa38139f3c3b6cbc3439363553ee0e7;p=gnulib.git mbrtoc32-regular: Add tests. * tests/test-mbrtoc32-regular.c: New file. * modules/mbrtoc32-regular-tests: New file. --- diff --git a/ChangeLog b/ChangeLog index c8dc122aa4..3eb2e2bc4b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2023-07-10 Bruno Haible + mbrtoc32-regular: Add tests. + * tests/test-mbrtoc32-regular.c: New file. + * modules/mbrtoc32-regular-tests: New file. + mbrtoc32-regular: New module. * modules/mbrtoc32-regular: New file. * lib/mbrtoc32.c (mbrtoc32): If the module 'mbrtoc32-regular' is present diff --git a/modules/mbrtoc32-regular-tests b/modules/mbrtoc32-regular-tests new file mode 100644 index 0000000000..907f73721a --- /dev/null +++ b/modules/mbrtoc32-regular-tests @@ -0,0 +1,14 @@ +Files: +tests/test-mbrtoc32-regular.c +tests/macros.h + +Depends-on: +mbsinit +setlocale + +configure.ac: + +Makefile.am: +TESTS += test-mbrtoc32-regular +check_PROGRAMS += test-mbrtoc32-regular +test_mbrtoc32_regular_LDADD = $(LDADD) $(LIBUNISTRING) $(SETLOCALE_LIB) $(MBRTOWC_LIB) $(LIBC32CONV) diff --git a/tests/test-mbrtoc32-regular.c b/tests/test-mbrtoc32-regular.c new file mode 100644 index 0000000000..a85a0a5a69 --- /dev/null +++ b/tests/test-mbrtoc32-regular.c @@ -0,0 +1,79 @@ +/* Test of conversion of multibyte character to 32-bit wide character. + Copyright (C) 2023 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2023. */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "macros.h" + +int +main (int argc, char *argv[]) +{ + /* The only locales in which mbrtoc32 may map a multibyte character to a + sequence of two or more Unicode characters are those with BIG5-HKSCS + encoding. See + + */ + if (setlocale (LC_ALL, "zh_HK.BIG5-HKSCS") == NULL) + { + fprintf (stderr, "Skipping test: found no locale with BIG5-HKSCS encoding.\n"); + return 77; + } + + /* The problematic BIG5-HKSCS characters are: + + input maps to name + ----- ------- ---- + 0x88 0x62 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON + 0x88 0x64 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON + 0x88 0xA3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON + 0x88 0xA5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON + + Test one of them. + See . */ + mbstate_t state; + memset (&state, '\0', sizeof (mbstate_t)); + char32_t c32 = (char32_t) 0xBADFACE; + size_t ret = mbrtoc32 (&c32, "\210\142", 2, &state); + /* It is OK if this conversion fails. */ + if (ret != (size_t)(-1)) + { + /* mbrtoc32 being regular, means that STATE is in the initial state. */ + ASSERT (mbsinit (&state)); + ret = mbrtoc32 (&c32, "", 0, &state); + /* mbrtoc32 being regular, means that it returns (size_t)(-2), not + (size_t)(-3), here. */ + ASSERT (ret == (size_t)(-2)); + ret = mbrtoc32 (&c32, "", 1, &state); + /* mbrtoc32 being regular, means that it returns the null 32-bit wide + character, here, not any remnant from the previous multibyte + character. */ + ASSERT (ret == 0); + ASSERT (c32 == 0); + } + + return 0; +}