1/* Test of u16_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 "unistr.h"
30#include "macros.h"
31
32static void
33test_function (uint16_t * (*my_asnprintf) (uint16_t *, size_t *, const char *, ...))
34{
35  /* Test the support of the 's' conversion specifier for strings.  */
36
37  {
38    const char *locale_string = "\304rger"; /* ��rger */
39    {
40      size_t length;
41      uint16_t *result =
42        my_asnprintf (NULL, &length, "%s %d", locale_string, 33, 44, 55);
43      static const uint16_t expected[] =
44        { 0x00c4, 'r', 'g', 'e', 'r', ' ', '3', '3', 0 };
45      ASSERT (result != NULL);
46      ASSERT (u16_strcmp (result, expected) == 0);
47      ASSERT (length == u16_strlen (result));
48      free (result);
49    }
50    { /* Width.  */
51      size_t length;
52      uint16_t *result =
53        my_asnprintf (NULL, &length, "%10s %d", locale_string, 33, 44, 55);
54      static const uint16_t expected[] =
55        { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
56          ' ', '3', '3', 0
57        };
58      ASSERT (result != NULL);
59      ASSERT (u16_strcmp (result, expected) == 0);
60      ASSERT (length == u16_strlen (result));
61      free (result);
62    }
63    { /* FLAG_LEFT.  */
64      size_t length;
65      uint16_t *result =
66        my_asnprintf (NULL, &length, "%-10s %d", locale_string, 33, 44, 55);
67      static const uint16_t expected[] =
68        { 0x00c4, 'r', 'g', 'e', 'r', ' ', ' ', ' ', ' ', ' ',
69          ' ', '3', '3', 0
70        };
71      ASSERT (result != NULL);
72      ASSERT (u16_strcmp (result, expected) == 0);
73      ASSERT (length == u16_strlen (result));
74      free (result);
75    }
76    { /* FLAG_ZERO: no effect.  */
77      size_t length;
78      uint16_t *result =
79        my_asnprintf (NULL, &length, "%010s %d", locale_string, 33, 44, 55);
80      static const uint16_t expected[] =
81        { ' ', ' ', ' ', ' ', ' ', 0x00c4, 'r', 'g', 'e', 'r',
82          ' ', '3', '3', 0
83        };
84      ASSERT (result != NULL);
85      ASSERT (u16_strcmp (result, expected) == 0);
86      ASSERT (length == u16_strlen (result));
87      free (result);
88    }
89  }
90}
91
92static uint16_t *
93my_asnprintf (uint16_t *resultbuf, size_t *lengthp, const char *format, ...)
94{
95  va_list args;
96  uint16_t *ret;
97
98  va_start (args, format);
99  ret = u16_vasnprintf (resultbuf, lengthp, format, args);
100  va_end (args);
101  return ret;
102}
103
104static void
105test_vasnprintf ()
106{
107  test_function (my_asnprintf);
108}
109
110int
111main (int argc, char *argv[])
112{
113  /* configure should already have checked that the locale is supported.  */
114  if (setlocale (LC_ALL, "") == NULL)
115    return 1;
116
117  test_vasnprintf ();
118  return 0;
119}
120