]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Rust: Add lang-rust unit test.
authorBruno Haible <bruno@clisp.org>
Tue, 28 Jan 2025 10:45:28 +0000 (11:45 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 28 Jan 2025 21:13:20 +0000 (22:13 +0100)
* 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.

HACKING
gettext-tools/tests/Makefile.am
gettext-tools/tests/init.cfg
gettext-tools/tests/lang-rust [new file with mode: 0755]

diff --git a/HACKING b/HACKING
index 90f4e0138d3191209ae780c173121c8752d52f89..7b533702723063869fb091905dbc09b4e8f687dc 100644 (file)
--- 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:
 
index 7e1f9af01c77756b4fa3d246fc78cb5add141fc0..b48b6d37db3558a357a001c8e375eb1be844b04d 100644 (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 \
index 4994c4137b677962d793014305fd2899d0dfba44..4063903e4910891dc005d47807a9eb695699eb5a 100644 (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
+}
diff --git a/gettext-tools/tests/lang-rust b/gettext-tools/tests/lang-rust
new file mode 100755 (executable)
index 0000000..110f34e
--- /dev/null
@@ -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