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.
This commit is contained in:
Bruno Haible 2025-01-28 11:45:28 +01:00
parent e12c0558ad
commit 0f8cfe26fe
4 changed files with 257 additions and 73 deletions

154
HACKING
View File

@ -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,6 +197,56 @@ 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
* The GNOME/Mozilla JavaScript interpreter
+ Homepage: https://wiki.gnome.org/Projects/Gjs
+ 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
* 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 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
* Rust
+ Homepage: https://www.rust-lang.org/
+ Pre-built package name:
- 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/
+ Pre-built package name:
- On Debian and Debian-based systems: ruby,
- On Red Hat distributions: ruby.
- Other: https://repology.org/project/ruby/versions
* The ruby-gettext package
+ Homepage: https://ruby-gettext.github.io/
+ Pre-built package name:
- On Debian and Debian-based systems: ruby-gettext,
- 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:
@ -234,6 +254,22 @@ are skipped. To this effect, you need to install also:
- On Red Hat distributions: gawk.
- Other: https://repology.org/project/gawk/versions
* lua
+ Homepage: https://www.lua.org/
+ Pre-built package name:
- On Debian and Debian-based systems: lua5.4 or lua5.3 or lua5.2 or lua5.1,
- On Red Hat distributions: lua.
- Other: https://repology.org/project/lua/versions
* The lua-gettext package
+ Homepage: https://gitlab.com/sukhichev/lua-gettext/blob/master/README.us.md
+ Debian and Ubuntu packages:
Download (following the hyperlinks in the homepage), then install through
$ sudo dpkg -i lua-gettext_0.0+nmu1_amd64.deb
+ Pre-built package name:
- On Debian and Debian-based systems: --,
- On Red Hat distributions: --.
- Other: https://repology.org/project/lua:gettext/versions
* The Free Pascal compiler ppc386 or ppcx64
+ Homepage: https://www.freepascal.org/
+ Pre-built package name:
@ -247,6 +283,21 @@ are skipped. To this effect, you need to install also:
- 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
+ Pre-built package name:
- On Debian and Debian-based systems: valac,
- On Red Hat distributions: vala.
- Other: https://repology.org/project/vala/versions
* Tcl
+ Homepage: https://www.tcl.tk/
+ Pre-built package name:
@ -274,49 +325,6 @@ are skipped. To this effect, you need to install also:
- On Red Hat distributions: php.
- Other: https://repology.org/project/php/versions
* Ruby
+ Homepage: https://www.ruby-lang.org/en/
+ Pre-built package name:
- On Debian and Debian-based systems: ruby,
- On Red Hat distributions: ruby.
- Other: https://repology.org/project/ruby/versions
* The ruby-gettext package
+ Homepage: https://ruby-gettext.github.io/
+ Pre-built package name:
- On Debian and Debian-based systems: ruby-gettext,
- On Red Hat distributions: ruby-gettext.
- Other: https://repology.org/project/ruby:gettext/versions
* lua
+ Homepage: https://www.lua.org/
+ Pre-built package name:
- On Debian and Debian-based systems: lua5.4 or lua5.3 or lua5.2 or lua5.1,
- On Red Hat distributions: lua.
- Other: https://repology.org/project/lua/versions
* The lua-gettext package
+ Homepage: https://gitlab.com/sukhichev/lua-gettext/blob/master/README.us.md
+ Debian and Ubuntu packages:
Download (following the hyperlinks in the homepage), then install through
$ sudo dpkg -i lua-gettext_0.0+nmu1_amd64.deb
+ Pre-built package name:
- On Debian and Debian-based systems: --,
- On Red Hat distributions: --.
- Other: https://repology.org/project/lua:gettext/versions
* The GNOME/Mozilla JavaScript interpreter
+ Homepage: https://wiki.gnome.org/Projects/Gjs
+ 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
* The GNOME Vala compiler
+ Homepage: https://wiki.gnome.org/Projects/Vala
+ Pre-built package name:
- On Debian and Debian-based systems: valac,
- On Red Hat distributions: vala.
- Other: https://repology.org/project/vala/versions
If you want to exercise the sample programs in gettext-tools/examples/, you
also need to install:

View File

@ -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 \

View File

@ -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
}

161
gettext-tools/tests/lang-rust Executable file
View File

@ -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<String> = 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