maint: update copyright
[gnulib.git] / tests / test-striconv.c
1 /* Test of character set conversion.
2    Copyright (C) 2007-2014 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
18
19 #include <config.h>
20
21 #include "striconv.h"
22
23 #if HAVE_ICONV
24 # include <iconv.h>
25 #endif
26
27 #include <errno.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include "macros.h"
32
33 int
34 main ()
35 {
36 #if HAVE_ICONV
37   /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
38      and UTF-8.  */
39   iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
40   iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
41
42   ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
43   ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
44
45   /* ------------------------- Test mem_cd_iconv() ------------------------- */
46
47   /* Test conversion from ISO-8859-1 to UTF-8 with no errors.  */
48   {
49     static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
50     static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
51     char *result = NULL;
52     size_t length = 0;
53     int retval = mem_cd_iconv (input, strlen (input), cd_88591_to_utf8,
54                                &result, &length);
55     ASSERT (retval == 0);
56     ASSERT (length == strlen (expected));
57     ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
58     free (result);
59   }
60
61   /* Test conversion from UTF-8 to ISO-8859-1 with no errors.  */
62   {
63     static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
64     static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
65     char *result = NULL;
66     size_t length = 0;
67     int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
68                                &result, &length);
69     ASSERT (retval == 0);
70     ASSERT (length == strlen (expected));
71     ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
72     free (result);
73   }
74
75   /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ.  */
76   {
77     static const char input[] = "\342\202\254"; /* EURO SIGN */
78     char *result = NULL;
79     size_t length = 0;
80     int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
81                                &result, &length);
82     ASSERT (retval == -1 && errno == EILSEQ);
83     ASSERT (result == NULL);
84   }
85
86   /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL.  */
87   {
88     static const char input[] = "\342";
89     char *result = NULL;
90     size_t length = 0;
91     int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
92                                &result, &length);
93     ASSERT (retval == 0);
94     ASSERT (length == 0);
95     free (result);
96   }
97
98   /* ------------------------- Test str_cd_iconv() ------------------------- */
99
100   /* Test conversion from ISO-8859-1 to UTF-8 with no errors.  */
101   {
102     static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
103     static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
104     char *result = str_cd_iconv (input, cd_88591_to_utf8);
105     ASSERT (result != NULL);
106     ASSERT (strcmp (result, expected) == 0);
107     free (result);
108   }
109
110   /* Test conversion from UTF-8 to ISO-8859-1 with no errors.  */
111   {
112     static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
113     static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
114     char *result = str_cd_iconv (input, cd_utf8_to_88591);
115     ASSERT (result != NULL);
116     ASSERT (strcmp (result, expected) == 0);
117     free (result);
118   }
119
120   /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ.  */
121   {
122     static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
123     char *result = str_cd_iconv (input, cd_utf8_to_88591);
124     ASSERT (result == NULL && errno == EILSEQ);
125   }
126
127   /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL.  */
128   {
129     static const char input[] = "\342";
130     char *result = str_cd_iconv (input, cd_utf8_to_88591);
131     ASSERT (result != NULL);
132     ASSERT (strcmp (result, "") == 0);
133     free (result);
134   }
135
136   iconv_close (cd_88591_to_utf8);
137   iconv_close (cd_utf8_to_88591);
138
139   /* -------------------------- Test str_iconv() -------------------------- */
140
141   /* Test conversion from ISO-8859-1 to UTF-8 with no errors.  */
142   {
143     static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
144     static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
145     char *result = str_iconv (input, "ISO-8859-1", "UTF-8");
146     ASSERT (result != NULL);
147     ASSERT (strcmp (result, expected) == 0);
148     free (result);
149   }
150
151   /* Test conversion from UTF-8 to ISO-8859-1 with no errors.  */
152   {
153     static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
154     static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
155     char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
156     ASSERT (result != NULL);
157     ASSERT (strcmp (result, expected) == 0);
158     free (result);
159   }
160
161   /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ.  */
162   {
163     static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
164     char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
165     ASSERT (result == NULL && errno == EILSEQ);
166   }
167
168   /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL.  */
169   {
170     static const char input[] = "\342";
171     char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
172     ASSERT (result != NULL);
173     ASSERT (strcmp (result, "") == 0);
174     free (result);
175   }
176
177 #endif
178
179   return 0;
180 }