From: Bruno Haible Date: Mon, 2 Dec 2024 11:10:43 +0000 (+0100) Subject: tests: Add lang-c++26 test. X-Git-Tag: v0.24~129 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d292db49171742d4abdaf15c6418b9f5235ffce;p=thirdparty%2Fgettext.git tests: Add lang-c++26 test. * gettext-tools/tests/lang-c++26: New file, based on gettext-tools/tests/lang-c++20. * gettext-tools/tests/Makefile.am (TESTS): Add it. --- diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am index 602a18081..93dcc311b 100644 --- a/gettext-tools/tests/Makefile.am +++ b/gettext-tools/tests/Makefile.am @@ -212,7 +212,7 @@ TESTS = gettext-1 gettext-2 \ plural-1 plural-2 plural-3 plural-4 \ gettextpo-1 sentence-1 \ lang-po \ - lang-c lang-c++ lang-c++20 lang-objc \ + lang-c lang-c++ lang-c++20 lang-c++26 lang-objc \ lang-python-1 lang-python-2 \ lang-java \ lang-csharp \ diff --git a/gettext-tools/tests/lang-c++26 b/gettext-tools/tests/lang-c++26 new file mode 100755 index 000000000..9fa7df384 --- /dev/null +++ b/gettext-tools/tests/lang-c++26 @@ -0,0 +1,192 @@ +#! /bin/sh +. "${srcdir=.}/init.sh"; path_prepend_ . ../src + +# Test of gettext facilities in the C++ language, according to ISO C++ 26. +# Assumes an fr_FR locale is installed. +# Assumes the following packages are installed: gcc g++. + +# This test fails if the gettext package was configured with --disable-nls, +# because in this case the gettext-runtime/intl/ directory does not produce +# a header file. + +# Test whether a C++ compiler is found. +test "${CXX}" != "no" || { + echo "Skipping test: no C++ compiler found" + Exit 77 +} + +# Try to find compiler option for ISO C++ 26 support. +cat <<\EOF > test.cc +#include +using std::format; +using std::runtime_format; +EOF +if ${CXX} ${CXXFLAGS} ${CPPFLAGS} -c test.cc 2>/dev/null; then + CXX26= +elif ${CXX} ${CXXFLAGS} -std=gnu++26 ${CPPFLAGS} -c test.cc 2>/dev/null; then + CXX26='-std=gnu++26' +else + echo "Skipping test: C++ compiler does not support ISO C++ 26" + Exit 77 +fi +CXXFLAGS="${CXXFLAGS} ${CXX26}" + +cat <<\EOF > prog.cc +#include "config.h" + +#include +#include +using namespace std; + +#include +#include +#include +#include "xsetenv.h" +#define _(string) gettext (string) + +int main (int argc, char *argv[]) +{ + int n = atoi (argv[2]); + + xsetenv ("LC_ALL", argv[1], 1); + if (setlocale (LC_ALL, "") == NULL) + // Couldn't set locale. + exit (77); + + textdomain ("prog"); + bindtextdomain ("prog", "."); + + cout << _("'Your command, please?', asked the waiter.") << endl; + + cout << format (runtime_format (ngettext ("a piece of cake", "{} pieces of cake", n)), + n) + << endl; + + cout << format (runtime_format (_("{} is replaced by {}.")), "FF", "EUR") + << endl; +} +EOF + +# Compile in two steps from .cc to .o and from .o to 'prog'. This way, +# relinking is faster because doesn't need to redo the first step. +# Put the -I flags before ${CXXFLAGS} ${CPPFLAGS}, to make sure that libintl.h +# is found in the build directory, regardless of -I options present in +# ${CXXFLAGS} or ${CPPFLAGS}. +${CXX} -I../.. -I"$abs_top_srcdir"/gnulib-lib -I../../../gettext-runtime/intl ${CXXFLAGS} ${CPPFLAGS} -c prog.cc \ + || Exit 1 +# Remove the -Wl,--disable-auto-import option here that is added by +# woe32-dll.m4. Cygwin 1.7.2 does not support it in C++ mode: It gives +# a link error about 'std::cout'. +: ${CONFIG_SHELL=${SHELL-/bin/sh}} +${CONFIG_SHELL} "$top_builddir"/libtool --quiet --tag=CXX --mode=link \ + ${CXX} ${CXXFLAGS} `echo "X ${LDFLAGS} " | sed -e 's/^X//' -e 's/ -Wl,--disable-auto-import / /'` -o prog prog.${OBJEXT} \ + ../../gnulib-lib/libgettextlib.la ${LTLIBINTL} \ + || Exit 1 + +: ${XGETTEXT=xgettext} +${XGETTEXT} -o prog.tmp --omit-header --no-location -k_ prog.cc || Exit 1 +LC_ALL=C tr -d '\r' < prog.tmp > prog.pot || Exit 1 + +cat <<\EOF > prog.ok +msgid "'Your command, please?', asked the waiter." +msgstr "" + +#, c++-format +msgid "a piece of cake" +msgid_plural "{} pieces of cake" +msgstr[0] "" +msgstr[1] "" + +#, c++-format +msgid "{} is replaced by {}." +msgstr "" +EOF + +: ${DIFF=diff} +${DIFF} prog.ok prog.pot || Exit 1 + +cat <<\EOF > fr.po +msgid "" +msgstr "" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "'Your command, please?', asked the waiter." +msgstr "«Votre commande, s'il vous plait», dit le garçon." + +# Les gateaux allemands sont les meilleurs du monde. +#, c++-format +msgid "a piece of cake" +msgid_plural "{} pieces of cake" +msgstr[0] "un morceau de gateau" +msgstr[1] "{} morceaux de gateau" + +# Reverse the arguments. +#, c++-format +msgid "{} is replaced by {}." +msgstr "{1} remplace {0}." +EOF + +: ${MSGMERGE=msgmerge} +${MSGMERGE} -q -o fr.po.tmp fr.po prog.pot || Exit 1 +LC_ALL=C tr -d '\r' < fr.po.tmp > fr.po.new || Exit 1 + +: ${DIFF=diff} +${DIFF} fr.po fr.po.new || Exit 1 + +test -d fr || mkdir fr +test -d fr/LC_MESSAGES || mkdir fr/LC_MESSAGES + +: ${MSGFMT=msgfmt} +${MSGFMT} -o fr/LC_MESSAGES/prog.mo fr.po + +: ${DIFF=diff} +cat <<\EOF > prog.ok +«Votre commande, s'il vous plait», dit le garçon. +2 morceaux de gateau +EUR remplace FF. +EOF +cat <<\EOF > prog.oku +«Votre commande, s'il vous plait», dit le garçon. +2 morceaux de gateau +EUR remplace FF. +EOF + +: ${LOCALE_FR=fr_FR} +: ${LOCALE_FR_UTF8=fr_FR.UTF-8} +if test $LOCALE_FR != none; then + prepare_locale_ fr $LOCALE_FR + LANGUAGE= ./prog $LOCALE_FR 2 > prog.tmp + case $? in + 0) case "$host_os" in + mingw*) LC_ALL=C tr -d '\r' < prog.tmp > prog.out || Exit 1 ;; + *) cp prog.tmp prog.out || Exit 1 ;; + esac + ${DIFF} prog.ok prog.out || Exit 1;; + 77) LOCALE_FR=none;; + *) Exit 1;; + esac +fi +if test $LOCALE_FR_UTF8 != none; then + prepare_locale_ fr $LOCALE_FR_UTF8 + LANGUAGE= ./prog $LOCALE_FR_UTF8 2 > prog.tmp + case $? in + 0) case "$host_os" in + mingw*) LC_ALL=C tr -d '\r' < prog.tmp > prog.out || Exit 1 ;; + *) cp prog.tmp prog.out || Exit 1 ;; + esac + ${DIFF} prog.oku prog.out || Exit 1;; + 77) LOCALE_FR_UTF8=none;; + *) Exit 1;; + esac +fi +if test $LOCALE_FR = none && test $LOCALE_FR_UTF8 = none; then + if test -f /usr/bin/localedef; then + echo "Skipping test: no french locale is installed" + else + echo "Skipping test: no french locale is supported" + fi + Exit 77 +fi + +Exit 0