Call mtrace.
[kopensolaris-gnu/glibc.git] / intl / tst-gettext.c
1 /* Test of the gettext functions.
2    Copyright (C) 2000 Free Software Foundation, Inc.
3    Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #include <libintl.h>
21 #include <locale.h>
22 #include <mcheck.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27
28 const struct
29 {
30   const char *msgid;
31   const char *msgstr;
32 } msgs[] =
33 {
34 #define INPUT(Str) { Str,
35 #define OUTPUT(Str) Str },
36 #include TESTSTRS_H
37 };
38
39 const char *catname[] =
40 {
41   [LC_MESSAGES] = "LC_MESSAGES",
42   [LC_TIME] = "LC_TIME",
43   [LC_NUMERIC] = "LC_NUMERIC"
44 };
45
46
47 static int positive_gettext_test (void);
48 static int negative_gettext_test (void);
49 static int positive_dgettext_test (const char *domain);
50 static int positive_dcgettext_test (const char *domain, int category);
51 static int negative_dcgettext_test (const char *domain, int category);
52
53
54 int
55 main (int argc, char *argv[])
56 {
57   int result = 0;
58
59   /* For debugging.  */
60   mtrace ();
61
62   /* This is the place where the .mo files are placed.  */
63   if (argc > 1)
64     {
65       bindtextdomain ("existing-domain", argv[1]);
66       bindtextdomain ("existing-time-domain", argv[1]);
67       bindtextdomain ("non-existing-domain", argv[1]);
68     }
69
70   /* The locale the catalog is created for is "existing-category".  Now
71      set the various variables in question to this value and run the
72      test.  */
73   setenv ("LANGUAGE", "existing-locale", 1);
74   setenv ("LC_ALL", "non-existing-locale", 1);
75   setenv ("LC_MESSAGES", "non-existing-locale", 1);
76   setenv ("LC_CTYPE", "non-existing-locale", 1);
77   setenv ("LANG", "non-existing-locale", 1);
78   setlocale (LC_CTYPE, "de_DE.ISO-8859-1");
79   unsetenv ("OUTPUT_CHARSET");
80   /* This is the name of the existing domain with a catalog for the
81      LC_MESSAGES category.  */
82   textdomain ("existing-domain");
83   puts ("test `gettext' with LANGUAGE set");
84   if (positive_gettext_test () != 0)
85     {
86       puts ("FAILED");
87       result = 1;
88     }
89   /* This is the name of a non-existing domain with a catalog for the
90      LC_MESSAGES category.  We leave this value set for the `dgettext'
91      and `dcgettext' tests.  */
92   textdomain ("non-existing-domain");
93   puts ("test `gettext' with LANGUAGE set");
94   if (negative_gettext_test () != 0)
95     {
96       puts ("FAILED");
97       result = 1;
98     }
99   puts ("test `dgettext' with LANGUAGE set");
100   if (positive_dgettext_test ("existing-domain") != 0)
101     {
102       puts ("FAILED");
103       result = 1;
104     }
105
106   /* Now the same tests with LC_ALL deciding.  */
107   unsetenv ("LANGUAGE");
108   setenv ("LC_ALL", "existing-locale", 1);
109   puts ("test `gettext' with LC_ALL set");
110   /* This is the name of the existing domain with a catalog for the
111      LC_MESSAGES category.  */
112   textdomain ("existing-domain");
113   if (positive_gettext_test () != 0)
114     {
115       puts ("FAILED");
116       result = 1;
117     }
118   /* This is the name of a non-existing domain with a catalog for the
119      LC_MESSAGES category.  We leave this value set for the `dgettext'
120      and `dcgettext' tests.  */
121   textdomain ("non-existing-domain");
122   puts ("test `gettext' with LANGUAGE set");
123   if (negative_gettext_test () != 0)
124     {
125       puts ("FAILED");
126       result = 1;
127     }
128   puts ("test `dgettext' with LANGUAGE set");
129   if (positive_dgettext_test ("existing-domain") != 0)
130     {
131       puts ("FAILED");
132       result = 1;
133     }
134
135   /* Now the same tests with LC_MESSAGES deciding.  */
136   unsetenv ("LC_ALL");
137   setenv ("LC_MESSAGES", "existing-locale", 1);
138   setenv ("LC_TIME", "existing-locale", 1);
139   setenv ("LC_NUMERIC", "non-existing-locale", 1);
140   puts ("test `gettext' with LC_ALL set");
141   /* This is the name of the existing domain with a catalog for the
142      LC_MESSAGES category.  */
143   textdomain ("existing-domain");
144   if (positive_gettext_test () != 0)
145     {
146       puts ("FAILED");
147       result = 1;
148     }
149   /* This is the name of a non-existing domain with a catalog for the
150      LC_MESSAGES category.  We leave this value set for the `dgettext'
151      and `dcgettext' tests.  */
152   textdomain ("non-existing-domain");
153   puts ("test `gettext' with LANGUAGE set");
154   if (negative_gettext_test () != 0)
155     {
156       puts ("FAILED");
157       result = 1;
158     }
159   puts ("test `dgettext' with LANGUAGE set");
160   if (positive_dgettext_test ("existing-domain") != 0)
161     {
162       puts ("FAILED");
163       result = 1;
164     }
165   puts ("test `dcgettext' with LANGUAGE set (LC_MESSAGES)");
166   if (positive_dcgettext_test ("existing-domain", LC_MESSAGES) != 0)
167     {
168       puts ("FAILED");
169       result = 1;
170     }
171   /* Try a different category.  For this we also switch the domain.  */
172   puts ("test `dcgettext' with LANGUAGE set (LC_TIME)");
173   if (positive_dcgettext_test ("existing-time-domain", LC_TIME) != 0)
174     {
175       puts ("FAILED");
176       result = 1;
177     }
178   /* This time use a category for which there is no catalog.  */
179   puts ("test `dcgettext' with LANGUAGE set (LC_NUMERIC)");
180   if (negative_dcgettext_test ("existing-domain", LC_NUMERIC) != 0)
181     {
182       puts ("FAILED");
183       result = 1;
184     }
185
186   /* Now the same tests with LANG deciding.  */
187   unsetenv ("LC_MESSAGES");
188   setenv ("LANG", "existing-locale", 1);
189   /* This is the name of the existing domain with a catalog for the
190      LC_MESSAGES category.  */
191   textdomain ("existing-domain");
192   puts ("test `gettext' with LC_ALL set");
193   if (positive_gettext_test () != 0)
194     {
195       puts ("FAILED");
196       result = 1;
197     }
198   /* This is the name of a non-existing domain with a catalog for the
199      LC_MESSAGES category.  We leave this value set for the `dgettext'
200      and `dcgettext' tests.  */
201   textdomain ("non-existing-domain");
202   puts ("test `gettext' with LANGUAGE set");
203   if (negative_gettext_test () != 0)
204     {
205       puts ("FAILED");
206       result = 1;
207     }
208   puts ("test `dgettext' with LANGUAGE set");
209   if (positive_dgettext_test ("existing-domain") != 0)
210     {
211       puts ("FAILED");
212       result = 1;
213     }
214
215   return result;
216 }
217
218
219 static int
220 positive_gettext_test (void)
221 {
222   size_t cnt;
223   int result = 0;
224
225   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
226     {
227       const char *found = gettext (msgs[cnt].msgid);
228
229       if (found == NULL || strcmp (found, msgs[cnt].msgstr) != 0)
230         {
231           /* Oops, shouldn't happen.  */
232           printf ("\
233   gettext (\"%s\") failed, returned \"%s\", expected \"%s\"\n",
234                   msgs[cnt].msgid, found, msgs[cnt].msgstr);
235           result = 1;
236         }
237     }
238
239   return result;
240 }
241
242
243 static int
244 negative_gettext_test (void)
245 {
246   size_t cnt;
247   int result = 0;
248
249   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
250     {
251       const char *found = gettext (msgs[cnt].msgid);
252
253       if (found != msgs[cnt].msgid)
254         {
255           /* Oops, shouldn't happen.  */
256           printf ("  gettext (\"%s\") failed\n", msgs[cnt].msgid);
257           result = 1;
258         }
259     }
260
261   return result;
262 }
263
264
265 static int
266 positive_dgettext_test (const char *domain)
267 {
268   size_t cnt;
269   int result = 0;
270
271   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
272     {
273       const char *found = dgettext (domain, msgs[cnt].msgid);
274
275       if (found == NULL || strcmp (found, msgs[cnt].msgstr) != 0)
276         {
277           /* Oops, shouldn't happen.  */
278           printf ("\
279   dgettext (\"%s\", \"%s\") failed, returned \"%s\", expected \"%s\"\n",
280                   domain, msgs[cnt].msgid, found, msgs[cnt].msgstr);
281           result = 1;
282         }
283     }
284
285   return result;
286 }
287
288
289 static int
290 positive_dcgettext_test (const char *domain, int category)
291 {
292   size_t cnt;
293   int result = 0;
294
295   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
296     {
297       const char *found = dcgettext (domain, msgs[cnt].msgid, category);
298
299       if (found == NULL || strcmp (found, msgs[cnt].msgstr) != 0)
300         {
301           /* Oops, shouldn't happen.  */
302           printf ("\
303   dcgettext (\"%s\", \"%s\", %s) failed, returned \"%s\", expected \"%s\"\n",
304                   domain, msgs[cnt].msgid, catname[category], found,
305                   msgs[cnt].msgstr);
306           result = 1;
307         }
308     }
309
310   return result;
311 }
312
313
314 static int
315 negative_dcgettext_test (const char *domain, int category)
316 {
317   size_t cnt;
318   int result = 0;
319
320   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
321     {
322       const char *found = dcgettext (domain, msgs[cnt].msgid, category);
323
324       if (found != msgs[cnt].msgid)
325         {
326           /* Oops, shouldn't happen.  */
327           printf ("  dcgettext (\"%s\", \"%s\", %s) failed\n",
328                   domain, msgs[cnt].msgid, catname[category]);
329           result = 1;
330         }
331     }
332
333   return result;
334 }