1#! /bin/sh
2. "${srcdir=.}/init.sh"; path_prepend_ . ../src
3
4# Test of gettext facilities in the C++ language.
5# Assumes an fr_FR locale is installed.
6# Assumes the following packages are installed: gcc g++.
7
8# This test fails if the gettext package was configured with --disable-nls,
9# because in this case the gettext-runtime/intl/ directory does not produce
10# a <libintl.h> header file.
11
12# Test whether a C++ compiler is found and libasprintf is built.
13test "${CXX}" != "no" || {
14  echo "Skipping test: no C++ compiler found"
15  Exit 77
16}
17test "${TESTLIBASPRINTF}" = yes || {
18  echo "Skipping test: configured with --disable-libasprintf"
19  Exit 77
20}
21
22cat <<\EOF > prog.cc
23#include "config.h"
24
25/* Avoid deprecation warnings from g++ 3.1 or newer.  */
26#if (defined __GNUG__ && defined __DEPRECATED) || defined _MSC_VER
27# include <iostream>
28using namespace std;
29#else
30# include <iostream.h>
31#endif
32
33#include <libintl.h>
34#include <locale.h>
35#include <stdio.h>
36#include <stdlib.h>
37#include "xsetenv.h"
38#include "autosprintf.h"
39using gnu::autosprintf;
40#define _(string) gettext (string)
41
42int main (int argc, char *argv[])
43{
44  int n = atoi (argv[2]);
45
46  xsetenv ("LC_ALL", argv[1], 1);
47  if (setlocale (LC_ALL, "") == NULL)
48    // Couldn't set locale.
49    exit (77);
50
51  textdomain ("prog");
52  bindtextdomain ("prog", ".");
53
54  cout << _("'Your command, please?', asked the waiter.") << endl;
55
56  cout << autosprintf (ngettext ("a piece of cake", "%d pieces of cake", n), n)
57       << endl;
58
59  cout << autosprintf (_("%s is replaced by %s."), "FF", "EUR") << endl;
60}
61EOF
62
63# Compile in two steps from .cc to .o and from .o to 'prog'. This way,
64# relinking is faster because doesn't need to redo the first step.
65# Put the -I flags before ${CXXFLAGS} ${CPPFLAGS}, to make sure that libintl.h
66# is found in the build directory, regardless of -I options present in
67# ${CXXFLAGS} or ${CPPFLAGS}.
68${CXX} -I../.. -I../../../gettext-runtime/libasprintf -I"$abs_top_srcdir"/gnulib-lib -I../../intl ${CXXFLAGS} ${CPPFLAGS} -c prog.cc \
69  || Exit 1
70# Remove the -Wl,--disable-auto-import option here that is added by
71# woe32-dll.m4. Cygwin 1.7.2 does not support it in C++ mode: It gives
72# a link error about 'std::cout'.
73: ${CONFIG_SHELL=${SHELL-/bin/sh}}
74${CONFIG_SHELL} "$top_builddir"/libtool --quiet --tag=CXX --mode=link \
75                ${CXX} ${CXXFLAGS} `echo "X ${LDFLAGS} " | sed -e 's/^X//' -e 's/ -Wl,--disable-auto-import / /'` -o prog prog.${OBJEXT} \
76                -lasprintf \
77                ../../gnulib-lib/libgettextlib.la ${LTLIBINTL} \
78		|| Exit 1
79
80: ${XGETTEXT=xgettext}
81${XGETTEXT} -o prog.tmp --omit-header --no-location -k_ prog.cc || Exit 1
82LC_ALL=C tr -d '\r' < prog.tmp > prog.pot || Exit 1
83
84cat <<EOF > prog.ok
85msgid "'Your command, please?', asked the waiter."
86msgstr ""
87
88#, c-format
89msgid "a piece of cake"
90msgid_plural "%d pieces of cake"
91msgstr[0] ""
92msgstr[1] ""
93
94#, c-format
95msgid "%s is replaced by %s."
96msgstr ""
97EOF
98
99: ${DIFF=diff}
100${DIFF} prog.ok prog.pot || Exit 1
101
102cat <<\EOF > fr.po
103msgid ""
104msgstr ""
105"Content-Type: text/plain; charset=ISO-8859-1\n"
106"Plural-Forms: nplurals=2; plural=(n > 1);\n"
107
108msgid "'Your command, please?', asked the waiter."
109msgstr "�Votre commande, s'il vous plait�, dit le gar�on."
110
111# Les gateaux allemands sont les meilleurs du monde.
112#, c-format
113msgid "a piece of cake"
114msgid_plural "%d pieces of cake"
115msgstr[0] "un morceau de gateau"
116msgstr[1] "%d morceaux de gateau"
117
118# Reverse the arguments.
119#, c-format
120msgid "%s is replaced by %s."
121msgstr "%2$s remplace %1$s."
122EOF
123
124: ${MSGMERGE=msgmerge}
125${MSGMERGE} -q -o fr.po.tmp fr.po prog.pot || Exit 1
126LC_ALL=C tr -d '\r' < fr.po.tmp > fr.po.new || Exit 1
127
128: ${DIFF=diff}
129${DIFF} fr.po fr.po.new || Exit 1
130
131test -d fr || mkdir fr
132test -d fr/LC_MESSAGES || mkdir fr/LC_MESSAGES
133
134: ${MSGFMT=msgfmt}
135${MSGFMT} -o fr/LC_MESSAGES/prog.mo fr.po
136
137: ${DIFF=diff}
138cat <<\EOF > prog.ok
139Votre commande, s'il vous plait�, dit le gar�on.
1402 morceaux de gateau
141EUR remplace FF.
142EOF
143cat <<\EOF > prog.oku
144«Votre commande, s'il vous plait», dit le garçon.
1452 morceaux de gateau
146EUR remplace FF.
147EOF
148
149: ${LOCALE_FR=fr_FR}
150: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
151if test $LOCALE_FR != none; then
152  prepare_locale_ fr $LOCALE_FR
153  LANGUAGE= ./prog $LOCALE_FR 2 > prog.tmp
154  case $? in
155    0) case "$host_os" in
156         mingw*) LC_ALL=C tr -d '\r' < prog.tmp > prog.out || Exit 1 ;;
157         *) cp prog.tmp prog.out || Exit 1 ;;
158       esac
159       ${DIFF} prog.ok prog.out || Exit 1;;
160    77) LOCALE_FR=none;;
161    *) Exit 1;;
162  esac
163fi
164if test $LOCALE_FR_UTF8 != none; then
165  prepare_locale_ fr $LOCALE_FR_UTF8
166  LANGUAGE= ./prog $LOCALE_FR_UTF8 2 > prog.tmp
167  case $? in
168    0) case "$host_os" in
169         mingw*) LC_ALL=C tr -d '\r' < prog.tmp > prog.out || Exit 1 ;;
170         *) cp prog.tmp prog.out || Exit 1 ;;
171       esac
172       ${DIFF} prog.oku prog.out || Exit 1;;
173    77) LOCALE_FR_UTF8=none;;
174    *) Exit 1;;
175  esac
176fi
177if test $LOCALE_FR = none && test $LOCALE_FR_UTF8 = none; then
178  if test -f /usr/bin/localedef; then
179    echo "Skipping test: no french locale is installed"
180  else
181    echo "Skipping test: no french locale is supported"
182  fi
183  Exit 77
184fi
185
186Exit 0
187