From: Bruno Haible Date: Tue, 28 Jan 2025 10:45:28 +0000 (+0100) Subject: Rust: Add lang-rust unit test. X-Git-Tag: v0.24~40 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0f8cfe26fe71a8ec8e2a8dbdc4337b5245ee30a7;p=thirdparty%2Fgettext.git Rust: Add lang-rust unit test. * gettext-tools/tests/init.cfg (this_test_is_longrunning_): New function. * gettext-tools/tests/lang-rust: New file. * gettext-tools/tests/Makefile.am (TESTS): Add it. * HACKING: Reorder. Document prerequisites for Rust unit test. --- diff --git a/HACKING b/HACKING index 90f4e0138..7b5337027 100644 --- a/HACKING +++ b/HACKING @@ -171,36 +171,6 @@ are skipped. To this effect, you need to install also: - On Red Hat distributions: python3. - Other: https://repology.org/project/python/versions - * GNU clisp - + Homepage: http://clisp.org/ - + Pre-built package name: - - On Debian and Debian-based systems: clisp, clisp-doc, - - On Red Hat distributions: --. - - Other: https://repology.org/project/clisp/versions - - * librep - + Homepage: http://librep.sourceforge.net/ - + Pre-built package name: - - On Debian and Debian-based systems: rep, rep-doc, - - On Red Hat distributions: --. - - Other: https://repology.org/project/librep/versions - - * GNU guile - + Homepage: https://www.gnu.org/software/guile/ - + Pre-built package name: - - On Debian and Debian-based systems: guile-2.2, guile-2.2-doc, - or: guile-3.0, guile-3.0-doc, - - On Red Hat distributions: guile. - - Other: https://repology.org/project/guile/versions - - * GNU smalltalk - + Homepage: http://smalltalk.gnu.org/ - + Pre-built package name: - - On Debian and Debian-based systems: gnu-smalltalk, gnu-smalltalk-doc - (only up to Debian 11), - - On Red Hat distributions: gnu-smalltalk (EPEL). - - Other: https://repology.org/project/smalltalk/versions - * A Java compiler + Homepage: http://openjdk.java.net/ + Pre-built package name: @@ -227,52 +197,42 @@ are skipped. To this effect, you need to install also: - On Red Hat distributions: dotnet7.0 or dotnet8.0. - Other: https://repology.org/project/dotnet/versions - * GNU awk - + Homepage: https://www.gnu.org/software/gawk/ + * The GNOME/Mozilla JavaScript interpreter + + Homepage: https://wiki.gnome.org/Projects/Gjs + Pre-built package name: - - On Debian and Debian-based systems: gawk, gawk-doc, - - On Red Hat distributions: gawk. - - Other: https://repology.org/project/gawk/versions + - On Debian and Debian-based systems: gjs, gir1.2-gtk-3.0, + - On Red Hat distributions: gjs. + - Other: https://repology.org/project/gjs/versions - * The Free Pascal compiler ppc386 or ppcx64 - + Homepage: https://www.freepascal.org/ - + Pre-built package name: - - On Debian and Debian-based systems: fp-compiler, fp-docs, - - On Red Hat distributions: fpc (EPEL). - - Other: https://repology.org/project/fpc/versions - * The Free Pascal Free Component Library - + Homepage: https://www.freepascal.org/fcl/fcl.var + * GNU guile + + Homepage: https://www.gnu.org/software/guile/ + Pre-built package name: - - On Debian and Debian-based systems: fp-units-fcl, - - On Red Hat distributions: --. - - Other: https://repology.org/project/fpc/versions + - On Debian and Debian-based systems: guile-2.2, guile-2.2-doc, + or: guile-3.0, guile-3.0-doc, + - On Red Hat distributions: guile. + - Other: https://repology.org/project/guile/versions - * Tcl - + Homepage: https://www.tcl.tk/ + * GNU clisp + + Homepage: http://clisp.org/ + Pre-built package name: - - On Debian and Debian-based systems: tcl, tcl-doc, - - On Red Hat distributions: tcl. - - Other: https://repology.org/project/tcl/versions + - On Debian and Debian-based systems: clisp, clisp-doc, + - On Red Hat distributions: --. + - Other: https://repology.org/project/clisp/versions - * Perl - + Homepage: https://www.perl.org/ - + Pre-built package name: - - On Debian and Debian-based systems: perl, perl-doc, - - On Red Hat distributions: perl. - - Other: https://repology.org/project/perl/versions - * The Perl packages Locale::Messages and libintl-perl - + Homepage: http://search.cpan.org/~guido/libintl-perl/ + * librep + + Homepage: http://librep.sourceforge.net/ + Pre-built package name: - - On Debian and Debian-based systems: libintl-perl, - - On Red Hat distributions: perl-libintl. - - Other: https://repology.org/project/perl:libintl-perl/versions + - On Debian and Debian-based systems: rep, rep-doc, + - On Red Hat distributions: --. + - Other: https://repology.org/project/librep/versions - * php - + Homepage: http://www.php.net/ + * Rust + + Homepage: https://www.rust-lang.org/ + Pre-built package name: - - On Debian and Debian-based systems: php, - - On Red Hat distributions: php. - - Other: https://repology.org/project/php/versions + - On Debian and Debian-based systems: rustc, cargo, + - On Red Hat distributions: rust, rust-cargo. + - Other: https://repology.org/project/rust/versions + https://repology.org/project/cargo/versions * Ruby + Homepage: https://www.ruby-lang.org/en/ @@ -287,6 +247,13 @@ are skipped. To this effect, you need to install also: - On Red Hat distributions: ruby-gettext. - Other: https://repology.org/project/ruby:gettext/versions + * GNU awk + + Homepage: https://www.gnu.org/software/gawk/ + + Pre-built package name: + - On Debian and Debian-based systems: gawk, gawk-doc, + - On Red Hat distributions: gawk. + - Other: https://repology.org/project/gawk/versions + * lua + Homepage: https://www.lua.org/ + Pre-built package name: @@ -303,12 +270,26 @@ are skipped. To this effect, you need to install also: - On Red Hat distributions: --. - Other: https://repology.org/project/lua:gettext/versions - * The GNOME/Mozilla JavaScript interpreter - + Homepage: https://wiki.gnome.org/Projects/Gjs + * The Free Pascal compiler ppc386 or ppcx64 + + Homepage: https://www.freepascal.org/ + Pre-built package name: - - On Debian and Debian-based systems: gjs, gir1.2-gtk-3.0, - - On Red Hat distributions: gjs. - - Other: https://repology.org/project/gjs/versions + - On Debian and Debian-based systems: fp-compiler, fp-docs, + - On Red Hat distributions: fpc (EPEL). + - Other: https://repology.org/project/fpc/versions + * The Free Pascal Free Component Library + + Homepage: https://www.freepascal.org/fcl/fcl.var + + Pre-built package name: + - On Debian and Debian-based systems: fp-units-fcl, + - On Red Hat distributions: --. + - Other: https://repology.org/project/fpc/versions + + * GNU smalltalk + + Homepage: http://smalltalk.gnu.org/ + + Pre-built package name: + - On Debian and Debian-based systems: gnu-smalltalk, gnu-smalltalk-doc + (only up to Debian 11), + - On Red Hat distributions: gnu-smalltalk (EPEL). + - Other: https://repology.org/project/smalltalk/versions * The GNOME Vala compiler + Homepage: https://wiki.gnome.org/Projects/Vala @@ -317,6 +298,33 @@ are skipped. To this effect, you need to install also: - On Red Hat distributions: vala. - Other: https://repology.org/project/vala/versions + * Tcl + + Homepage: https://www.tcl.tk/ + + Pre-built package name: + - On Debian and Debian-based systems: tcl, tcl-doc, + - On Red Hat distributions: tcl. + - Other: https://repology.org/project/tcl/versions + + * Perl + + Homepage: https://www.perl.org/ + + Pre-built package name: + - On Debian and Debian-based systems: perl, perl-doc, + - On Red Hat distributions: perl. + - Other: https://repology.org/project/perl/versions + * The Perl packages Locale::Messages and libintl-perl + + Homepage: http://search.cpan.org/~guido/libintl-perl/ + + Pre-built package name: + - On Debian and Debian-based systems: libintl-perl, + - On Red Hat distributions: perl-libintl. + - Other: https://repology.org/project/perl:libintl-perl/versions + + * php + + Homepage: http://www.php.net/ + + Pre-built package name: + - On Debian and Debian-based systems: php, + - On Red Hat distributions: php. + - Other: https://repology.org/project/php/versions + If you want to exercise the sample programs in gettext-tools/examples/, you also need to install: diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am index 7e1f9af01..b48b6d37d 100644 --- a/gettext-tools/tests/Makefile.am +++ b/gettext-tools/tests/Makefile.am @@ -223,6 +223,7 @@ TESTS = gettext-1 gettext-2 \ lang-csharp \ lang-javascript \ lang-guile lang-clisp lang-elisp lang-librep \ + lang-rust \ lang-ruby \ lang-sh lang-bash \ lang-gawk \ diff --git a/gettext-tools/tests/init.cfg b/gettext-tools/tests/init.cfg index 4994c4137..4063903e4 100644 --- a/gettext-tools/tests/init.cfg +++ b/gettext-tools/tests/init.cfg @@ -57,3 +57,17 @@ func_filter_POT_Creation_Date () || Exit 1 LC_ALL=C tr -d '\r' < "$1".tmq > "$2" || Exit 1 } + +# Skip the rest of this test if execution of long-running tests is undesired. +this_test_is_longrunning_ () +{ + if test "$RUN_LONGRUNNING_TESTS" != yes; then + echo 'This is a longrunning test, disabled by default, +To run it anyway, rerun "make check" with the RUN_LONGRUNNING_TESTS +environment variable set to yes. E.g., + + env RUN_LONGRUNNING_TESTS=yes make check +' 1>&2 + Exit 77 + fi +} diff --git a/gettext-tools/tests/lang-rust b/gettext-tools/tests/lang-rust new file mode 100755 index 000000000..110f34e96 --- /dev/null +++ b/gettext-tools/tests/lang-rust @@ -0,0 +1,161 @@ +#! /bin/sh +. "${srcdir=.}/init.sh"; path_prepend_ . ../src + +# Test of gettext facilities in the Rust language. +# Assumes an fr_FR locale is installed. +# Assumes the following packages are installed: rustc, cargo, +# and the following Rust packages ("crates"): gettext-rs, formatx. + +# Test whether we can build and run Rust programs. +: ${CARGO=cargo} +(${CARGO} --version) >/dev/null 2>/dev/null \ + || { echo "Skipping test: cargo not found"; Exit 77; } + +cat <<\EOF > Cargo.toml +[package] +name = "gettext-lang-rust" +version = "0.0.0" +edition = "2021" + +[dependencies] +gettext-rs = "0.7.2" +formatx = "0.2.3" +EOF + +mkdir src +cat <<\EOF > src/main.rs +use std::env; +use std::process; +use gettextrs::*; +use formatx::*; + +fn main() { + let args: Vec = env::args().collect(); + let n: u32 = args[1].parse().unwrap_or_else(|_| { process::exit (1); }); + + setlocale (LocaleCategory::LcAll, ""); + + textdomain ("prog").expect ("textdomain failed"); + bindtextdomain ("prog", ".").expect ("bindtextdomain failed"); + /* gettext-rs requires UTF-8 encoding. */ + bind_textdomain_codeset ("prog", "UTF-8").expect ("bind_textdomain_codeset failed"); + + println! ("{}", gettext ("'Your command, please?', asked the waiter.")); + println! ("{}", formatx! (ngettext ("a piece of cake", "{} pieces of cake", n), n).unwrap()); + println! ("{}", formatx! (gettext ("{} is replaced by {}."), "FF", "EUR").unwrap()); +} +EOF + +: ${XGETTEXT=xgettext} +${XGETTEXT} -o prog.tmp --omit-header --no-location src/main.rs || 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 "" + +#, rust-format +msgid "a piece of cake" +msgid_plural "{} pieces of cake" +msgstr[0] "" +msgstr[1] "" + +#, rust-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=UTF-8\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. +#, rust-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. +#, rust-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 + +this_test_is_longrunning_ + +: ${CARGO=cargo} +# This takes between 2.5 minutes (on a fast machine) and 5 minutes, +# most of it in "Compiling locale_config v0.3.0". Sigh. +${CARGO} build || Exit 1 + +# Test which of the fr_FR locales are installed. +: ${LOCALE_FR=fr_FR} +: ${LOCALE_FR_UTF8=fr_FR.UTF-8} +if test $LOCALE_FR != none; then + LC_ALL=$LOCALE_FR ../testlocale + case $? in + 0) ;; + 77) LOCALE_FR=none;; + *) Exit 1;; + esac +fi +if test $LOCALE_FR_UTF8 != none; then + LC_ALL=$LOCALE_FR_UTF8 ../testlocale + case $? in + 0) ;; + 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 + +: ${DIFF=diff} +cat <<\EOF > prog.ok +«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= LC_ALL=$LOCALE_FR target/debug/gettext-lang-rust 2 > prog.out1 || Exit 1 + ${DIFF} prog.ok prog.out1 || Exit 1 +fi +if test $LOCALE_FR_UTF8 != none; then + prepare_locale_ fr $LOCALE_FR_UTF8 + LANGUAGE= LC_ALL=$LOCALE_FR_UTF8 target/debug/gettext-lang-rust 2 > prog.out2 || Exit 1 + ${DIFF} prog.ok prog.out2 || Exit 1 +fi + +Exit 0