1/* Test of ulc_vasnprintf() function in an ISO-8859-1 locale.
2   Copyright (C) 2007-2010 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 "unistdio.h"
22
23#include <locale.h>
24#include <stdarg.h>
25#include <stdint.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include "macros.h"
30
31static void
32test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
33{
34  /* Test the support of the 'U' conversion specifier for Unicode strings.  */
35
36  {
37    static const uint8_t unicode_string[] = "Rafa\305\202 Maszkowski"; /* Rafa�� Maszkowski */
38    {
39      size_t length;
40      char *result =
41        my_asnprintf (NULL, &length, "%U %d", unicode_string, 33, 44, 55);
42      ASSERT (result != NULL);
43      ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
44              || strcmp (result, "Rafal Maszkowski 33") == 0);
45      ASSERT (length == strlen (result));
46      free (result);
47    }
48    { /* Width.  */
49      size_t length;
50      char *result =
51        my_asnprintf (NULL, &length, "%20U %d", unicode_string, 33, 44, 55);
52      ASSERT (result != NULL);
53      ASSERT (strcmp (result, "    Rafa? Maszkowski 33") == 0
54              || strcmp (result, "    Rafal Maszkowski 33") == 0);
55      ASSERT (length == strlen (result));
56      free (result);
57    }
58    { /* FLAG_LEFT.  */
59      size_t length;
60      char *result =
61        my_asnprintf (NULL, &length, "%-20U %d", unicode_string, 33, 44, 55);
62      ASSERT (result != NULL);
63      ASSERT (strcmp (result, "Rafa? Maszkowski     33") == 0
64              || strcmp (result, "Rafal Maszkowski     33") == 0);
65      ASSERT (length == strlen (result));
66      free (result);
67    }
68    { /* FLAG_ZERO: no effect.  */
69      size_t length;
70      char *result =
71        my_asnprintf (NULL, &length, "%020U %d", unicode_string, 33, 44, 55);
72      ASSERT (result != NULL);
73      ASSERT (strcmp (result, "    Rafa? Maszkowski 33") == 0
74              || strcmp (result, "    Rafal Maszkowski 33") == 0);
75      ASSERT (length == strlen (result));
76      free (result);
77    }
78  }
79
80  {
81    static const uint16_t unicode_string[] = /* Rafa�� Maszkowski */
82      {
83        'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
84        's', 'k', 'i', 0
85      };
86    {
87      size_t length;
88      char *result =
89        my_asnprintf (NULL, &length, "%lU %d", unicode_string, 33, 44, 55);
90      ASSERT (result != NULL);
91      ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
92              || strcmp (result, "Rafal Maszkowski 33") == 0);
93      ASSERT (length == strlen (result));
94      free (result);
95    }
96    { /* Width.  */
97      size_t length;
98      char *result =
99        my_asnprintf (NULL, &length, "%20lU %d", unicode_string, 33, 44, 55);
100      ASSERT (result != NULL);
101      ASSERT (strcmp (result, "    Rafa? Maszkowski 33") == 0
102              || strcmp (result, "    Rafal Maszkowski 33") == 0);
103      ASSERT (length == strlen (result));
104      free (result);
105    }
106    { /* FLAG_LEFT.  */
107      size_t length;
108      char *result =
109        my_asnprintf (NULL, &length, "%-20lU %d", unicode_string, 33, 44, 55);
110      ASSERT (result != NULL);
111      ASSERT (strcmp (result, "Rafa? Maszkowski     33") == 0
112              || strcmp (result, "Rafal Maszkowski     33") == 0);
113      ASSERT (length == strlen (result));
114      free (result);
115    }
116    { /* FLAG_ZERO: no effect.  */
117      size_t length;
118      char *result =
119        my_asnprintf (NULL, &length, "%020lU %d", unicode_string, 33, 44, 55);
120      ASSERT (result != NULL);
121      ASSERT (strcmp (result, "    Rafa? Maszkowski 33") == 0
122              || strcmp (result, "    Rafal Maszkowski 33") == 0);
123      ASSERT (length == strlen (result));
124      free (result);
125    }
126  }
127
128  {
129    static const uint32_t unicode_string[] = /* Rafa�� Maszkowski */
130      {
131        'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
132        's', 'k', 'i', 0
133      };
134    {
135      size_t length;
136      char *result =
137        my_asnprintf (NULL, &length, "%llU %d", unicode_string, 33, 44, 55);
138      ASSERT (result != NULL);
139      ASSERT (strcmp (result, "Rafa? Maszkowski 33") == 0
140              || strcmp (result, "Rafal Maszkowski 33") == 0);
141      ASSERT (length == strlen (result));
142      free (result);
143    }
144    { /* Width.  */
145      size_t length;
146      char *result =
147        my_asnprintf (NULL, &length, "%20llU %d", unicode_string, 33, 44, 55);
148      ASSERT (result != NULL);
149      ASSERT (strcmp (result, "    Rafa? Maszkowski 33") == 0
150              || strcmp (result, "    Rafal Maszkowski 33") == 0);
151      ASSERT (length == strlen (result));
152      free (result);
153    }
154    { /* FLAG_LEFT.  */
155      size_t length;
156      char *result =
157        my_asnprintf (NULL, &length, "%-20llU %d", unicode_string, 33, 44, 55);
158      ASSERT (result != NULL);
159      ASSERT (strcmp (result, "Rafa? Maszkowski     33") == 0
160              || strcmp (result, "Rafal Maszkowski     33") == 0);
161      ASSERT (length == strlen (result));
162      free (result);
163    }
164    { /* FLAG_ZERO: no effect.  */
165      size_t length;
166      char *result =
167        my_asnprintf (NULL, &length, "%020llU %d", unicode_string, 33, 44, 55);
168      ASSERT (result != NULL);
169      ASSERT (strcmp (result, "    Rafa? Maszkowski 33") == 0
170              || strcmp (result, "    Rafal Maszkowski 33") == 0);
171      ASSERT (length == strlen (result));
172      free (result);
173    }
174  }
175
176  /* Test the support of the 's' conversion specifier for strings.  */
177
178  {
179    const char *locale_string = "\304rger"; /* ��rger */
180    {
181      size_t length;
182      char *result =
183        my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
184      ASSERT (result != NULL);
185      ASSERT (strcmp (result, "\304rger 33") == 0);
186      ASSERT (length == strlen (result));
187      free (result);
188    }
189    { /* Width.  */
190      size_t length;
191      char *result =
192        my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
193      ASSERT (result != NULL);
194      ASSERT (strcmp (result, "     \304rger 33") == 0);
195      ASSERT (length == strlen (result));
196      free (result);
197    }
198    { /* FLAG_LEFT.  */
199      size_t length;
200      char *result =
201        my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
202      ASSERT (result != NULL);
203      ASSERT (strcmp (result, "\304rger      33") == 0);
204      ASSERT (length == strlen (result));
205      free (result);
206    }
207    { /* FLAG_ZERO: no effect.  */
208      size_t length;
209      char *result =
210        my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
211      ASSERT (result != NULL);
212      ASSERT (strcmp (result, "     \304rger 33") == 0);
213      ASSERT (length == strlen (result));
214      free (result);
215    }
216  }
217}
218
219static char *
220my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
221{
222  va_list args;
223  char *ret;
224
225  va_start (args, format);
226  ret = ulc_vasnprintf (resultbuf, lengthp, format, args);
227  va_end (args);
228  return ret;
229}
230
231static void
232test_vasnprintf ()
233{
234  test_function (my_asnprintf);
235}
236
237int
238main (int argc, char *argv[])
239{
240  /* configure should already have checked that the locale is supported.  */
241  if (setlocale (LC_ALL, "") == NULL)
242    return 1;
243
244  test_vasnprintf ();
245  return 0;
246}
247