]> Savannah Git Hosting - gnulib.git/commitdiff
duplocale tests: Verify use with *_l functions.
authorBruno Haible <bruno@clisp.org>
Tue, 15 Aug 2017 18:23:00 +0000 (20:23 +0200)
committerBruno Haible <bruno@clisp.org>
Tue, 15 Aug 2017 18:23:00 +0000 (20:23 +0200)
* modules/duplocale-tests (configure.ac): Test for uselocale and
some *_l functions.
* tests/test-duplocale.c (test_with_uselocale): New function, extracted
from main.
(get_locale_dependent_values_from, test_with_locale_parameter): New
functions.
(main): Test both test_with_uselocale and test_with_locale_parameter.

ChangeLog
modules/duplocale-tests
tests/test-duplocale.c

index b23b295b39067220509dae8063cc262b6018727b..57916941409dd0e321419f0b71944a8f897e688d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2017-08-15  Bruno Haible  <bruno@clisp.org>
+
+       duplocale tests: Verify use with *_l functions.
+       * modules/duplocale-tests (configure.ac): Test for uselocale and
+       some *_l functions.
+       * tests/test-duplocale.c (test_with_uselocale): New function, extracted
+       from main.
+       (get_locale_dependent_values_from, test_with_locale_parameter): New
+       functions.
+       (main): Test both test_with_uselocale and test_with_locale_parameter.
+
 2017-08-15  Bruno Haible  <bruno@clisp.org>
 
        extensions: Enable NetBSD specific extensions.
index 9cd9d44f38d20881ec0d4b37e07463335b14a9db..3420abf5de52dd6dd67f687ba9aef3a828829ee3 100644 (file)
@@ -7,7 +7,7 @@ Depends-on:
 langinfo
 
 configure.ac:
-AC_CHECK_FUNCS_ONCE([duplocale])
+AC_CHECK_FUNCS_ONCE([duplocale uselocale strfmon_l snprintf_l nl_langinfo_l])
 AC_CHECK_HEADERS([monetary.h])
 
 Makefile.am:
index 0db1513521e6eae83270f980c51f60f51e24a077..ba3ab09407339b7f0b3acfee317d148a59eafb5a 100644 (file)
@@ -52,8 +52,10 @@ get_locale_dependent_values (struct locale_dependent_values *result)
   /* result->time is usually "janvier" */
 }
 
-int
-main ()
+#if HAVE_USELOCALE
+
+static int
+test_with_uselocale (void)
 {
   struct locale_dependent_values expected_results;
   locale_t mixed1;
@@ -73,10 +75,7 @@ main ()
   /* Use a per-thread locale.  */
   perthread = newlocale (LC_ALL_MASK, "es_ES.UTF-8", NULL);
   if (perthread == NULL)
-    {
-      fprintf (stderr, "Skipping test: Spanish Unicode locale is not installed\n");
-      return 77;
-    }
+    return 1;
   uselocale (perthread);
 
   /* Save the locale in a locale_t object again.  */
@@ -122,6 +121,106 @@ main ()
   return 0;
 }
 
+#endif
+
+#if HAVE_STRFMON_L || HAVE_SNPRINTF_L || HAVE_NL_LANGINFO_L
+
+static void
+get_locale_dependent_values_from (struct locale_dependent_values *result, locale_t locale)
+{
+#if HAVE_STRFMON_L
+  strfmon_l (result->monetary, sizeof (result->monetary), locale,
+             "%n", 123.75);
+  /* result->monetary is usually "$123.75" */
+#endif
+#if HAVE_SNPRINTF_L
+  snprintf_l (result->numeric, sizeof (result->numeric), locale,
+              "%g", 3.5);
+  /* result->numeric is usually "3,5" */
+#endif
+#if HAVE_NL_LANGINFO_L
+  strcpy (result->time, nl_langinfo_l (MON_1, locale));
+  /* result->time is usually "janvier" */
+#endif
+}
+
+static int
+test_with_locale_parameter (void)
+{
+  struct locale_dependent_values expected_results;
+  locale_t mixed1;
+  locale_t mixed2;
+
+  /* Set up a locale which is a mix between different system locales.  */
+  setlocale (LC_ALL, "en_US.UTF-8");
+  setlocale (LC_NUMERIC, "de_DE.UTF-8");
+  setlocale (LC_TIME, "fr_FR.UTF-8");
+  get_locale_dependent_values (&expected_results);
+
+  /* Save the locale in a locale_t object.  */
+  mixed1 = duplocale (LC_GLOBAL_LOCALE);
+  ASSERT (mixed1 != NULL);
+
+  /* Create another locale_t object.  */
+  mixed2 = newlocale (LC_ALL_MASK, "es_ES.UTF-8", NULL);
+  if (mixed2 == NULL)
+    return 1;
+
+  /* Set up a default locale.  */
+  setlocale (LC_ALL, "C");
+  {
+    struct locale_dependent_values c_results;
+    get_locale_dependent_values (&c_results);
+  }
+
+  /* Now use the saved locale mixed2.  */
+  {
+    struct locale_dependent_values results;
+    get_locale_dependent_values_from (&results, mixed2);
+  }
+
+  /* Now use the saved locale mixed1 again.  */
+  {
+    struct locale_dependent_values results;
+    get_locale_dependent_values_from (&results, mixed1);
+#if HAVE_STRFMON_L
+    ASSERT (strcmp (results.monetary, expected_results.monetary) == 0);
+#endif
+#if HAVE_SNPRINTF_L
+    ASSERT (strcmp (results.numeric, expected_results.numeric) == 0);
+#endif
+#if HAVE_NL_LANGINFO_L
+    ASSERT (strcmp (results.time, expected_results.time) == 0);
+#endif
+  }
+
+  freelocale (mixed1);
+  freelocale (mixed2);
+  return 0;
+}
+
+#endif
+
+int
+main ()
+{
+  int skipped = 0;
+#if HAVE_USELOCALE
+  skipped |= test_with_uselocale ();
+#endif
+#if HAVE_STRFMON_L || HAVE_SNPRINTF_L || HAVE_NL_LANGINFO_L
+  skipped |= test_with_locale_parameter ();
+#endif
+
+  if (skipped)
+    {
+      fprintf (stderr, "Skipping test: Spanish Unicode locale is not installed\n");
+      return 77;
+    }
+
+  return 0;
+}
+
 #else
 
 #include <stdio.h>