>From a71158abf562cd6ed3fe384b0d99cba0de2034c2 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 15 Aug 2017 20:23:00 +0200 Subject: [PATCH 1/2] 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. --- ChangeLog | 11 +++++ modules/duplocale-tests | 2 +- tests/test-duplocale.c | 111 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 117 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index b23b295..5791694 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2017-08-15 Bruno Haible + 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 + extensions: Enable NetBSD specific extensions. * m4/extensions.m4 (AC_USE_SYSTEM_EXTENSIONS): Define _NETBSD_SOURCE. diff --git a/modules/duplocale-tests b/modules/duplocale-tests index 9cd9d44..3420abf 100644 --- a/modules/duplocale-tests +++ b/modules/duplocale-tests @@ -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: diff --git a/tests/test-duplocale.c b/tests/test-duplocale.c index 0db1513..ba3ab09 100644 --- a/tests/test-duplocale.c +++ b/tests/test-duplocale.c @@ -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 -- 2.7.4