• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/ap/gpl/timemachine/gettext-0.17/gettext-tools/gnulib-tests/
1/* Test of character set conversion.
2   Copyright (C) 2007 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 <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#define ASSERT(expr) \
33  do									     \
34    {									     \
35      if (!(expr))							     \
36        {								     \
37          fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
38          abort ();							     \
39        }								     \
40    }									     \
41  while (0)
42
43int
44main ()
45{
46#if HAVE_ICONV
47  /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
48     and UTF-8.  */
49  iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
50  iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
51
52  ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
53  ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
54
55  /* ------------------------- Test mem_cd_iconv() ------------------------- */
56
57  /* Test conversion from ISO-8859-1 to UTF-8 with no errors.  */
58  {
59    static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
60    static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
61    char *result = NULL;
62    size_t length = 0;
63    int retval = mem_cd_iconv (input, strlen (input), cd_88591_to_utf8,
64			       &result, &length);
65    ASSERT (retval == 0);
66    ASSERT (length == strlen (expected));
67    ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
68    free (result);
69  }
70
71  /* Test conversion from UTF-8 to ISO-8859-1 with no errors.  */
72  {
73    static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
74    static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
75    char *result = NULL;
76    size_t length = 0;
77    int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
78			       &result, &length);
79    ASSERT (retval == 0);
80    ASSERT (length == strlen (expected));
81    ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
82    free (result);
83  }
84
85  /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ.  */
86  {
87    static const char input[] = "\342\202\254"; /* EURO SIGN */
88    char *result = NULL;
89    size_t length = 0;
90    int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
91			       &result, &length);
92    ASSERT (retval == -1 && errno == EILSEQ);
93    ASSERT (result == NULL);
94  }
95
96  /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL.  */
97  {
98    static const char input[] = "\342";
99    char *result = NULL;
100    size_t length = 0;
101    int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
102			       &result, &length);
103    ASSERT (retval == 0);
104    ASSERT (length == 0);
105    if (result != NULL)
106      free (result);
107  }
108
109  /* ------------------------- Test str_cd_iconv() ------------------------- */
110
111  /* Test conversion from ISO-8859-1 to UTF-8 with no errors.  */
112  {
113    static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
114    static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
115    char *result = str_cd_iconv (input, cd_88591_to_utf8);
116    ASSERT (result != NULL);
117    ASSERT (strcmp (result, expected) == 0);
118    free (result);
119  }
120
121  /* Test conversion from UTF-8 to ISO-8859-1 with no errors.  */
122  {
123    static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
124    static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
125    char *result = str_cd_iconv (input, cd_utf8_to_88591);
126    ASSERT (result != NULL);
127    ASSERT (strcmp (result, expected) == 0);
128    free (result);
129  }
130
131  /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ.  */
132  {
133    static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
134    char *result = str_cd_iconv (input, cd_utf8_to_88591);
135    ASSERT (result == NULL && errno == EILSEQ);
136  }
137
138  /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL.  */
139  {
140    static const char input[] = "\342";
141    char *result = str_cd_iconv (input, cd_utf8_to_88591);
142    ASSERT (result != NULL);
143    ASSERT (strcmp (result, "") == 0);
144    free (result);
145  }
146
147  iconv_close (cd_88591_to_utf8);
148  iconv_close (cd_utf8_to_88591);
149
150  /* -------------------------- Test str_iconv() -------------------------- */
151
152  /* Test conversion from ISO-8859-1 to UTF-8 with no errors.  */
153  {
154    static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
155    static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
156    char *result = str_iconv (input, "ISO-8859-1", "UTF-8");
157    ASSERT (result != NULL);
158    ASSERT (strcmp (result, expected) == 0);
159    free (result);
160  }
161
162  /* Test conversion from UTF-8 to ISO-8859-1 with no errors.  */
163  {
164    static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
165    static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
166    char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
167    ASSERT (result != NULL);
168    ASSERT (strcmp (result, expected) == 0);
169    free (result);
170  }
171
172  /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ.  */
173  {
174    static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
175    char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
176    ASSERT (result == NULL && errno == EILSEQ);
177  }
178
179  /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL.  */
180  {
181    static const char input[] = "\342";
182    char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
183    ASSERT (result != NULL);
184    ASSERT (strcmp (result, "") == 0);
185    free (result);
186  }
187
188#endif
189
190  return 0;
191}
192