1// { dg-require-namedlocale "" }
2
3// 2001-11-19 Benjamin Kosnik  <bkoz@redhat.com>
4
5// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009
6// Free Software Foundation
7//
8// This file is part of the GNU ISO C++ Library.  This library is free
9// software; you can redistribute it and/or modify it under the
10// terms of the GNU General Public License as published by the
11// Free Software Foundation; either version 3, or (at your option)
12// any later version.
13
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17// GNU General Public License for more details.
18
19// You should have received a copy of the GNU General Public License along
20// with this library; see the file COPYING3.  If not see
21// <http://www.gnu.org/licenses/>.
22
23// 22.2.2.2.1  num_put members
24
25#include <locale>
26#include <sstream>
27#include <testsuite_hooks.h>
28
29void test01()
30{
31  using namespace std;
32  typedef ostreambuf_iterator<wchar_t> iterator_type;
33
34  bool test __attribute__((unused)) = true;
35
36  // basic construction
37  locale loc_c = locale::classic();
38  locale loc_de = locale("de_DE");
39  VERIFY( loc_c != loc_de );
40
41  // cache the numpunct facets
42  const numpunct<wchar_t>& numpunct_de = use_facet<numpunct<wchar_t> >(loc_de);
43
44  // sanity check the data is correct.
45  const wstring empty;
46  wstring result1;
47  wstring result2;
48
49  bool b1 = true;
50  bool b0 = false;
51  unsigned long ul1 = 1294967294;
52  double d1 =  1.7976931348623157e+308;
53  double d2 = 2.2250738585072014e-308;
54  long double ld1 = 1.7976931348623157e+308;
55  long double ld2 = 2.2250738585072014e-308;
56  const void* cv = &ld1;
57
58  // cache the num_put facet
59  wostringstream oss;
60  oss.imbue(loc_de);
61  const num_put<wchar_t>& np = use_facet<num_put<wchar_t> >(oss.getloc());
62
63  // bool, simple
64  iterator_type os_it00 = oss.rdbuf();
65  iterator_type os_it01 = np.put(os_it00, oss, L'+', b1);
66  result1 = oss.str();
67  VERIFY( result1 == L"1" );
68
69  oss.str(empty);
70  np.put(oss.rdbuf(), oss, L'+', b0);
71  result2 = oss.str();
72  VERIFY( result2 == L"0" );
73
74  // ... and one that does
75  oss.imbue(loc_de);
76  oss.str(empty);
77  oss.clear();
78  oss.width(20);
79  oss.setf(ios_base::left, ios_base::adjustfield);
80  np.put(oss.rdbuf(), oss, L'+', ul1);
81  result1 = oss.str();
82  VERIFY( result1 == L"1.294.967.294+++++++" );
83
84  // double
85  oss.str(empty);
86  oss.clear();
87  oss.width(20);
88  oss.setf(ios_base::left, ios_base::adjustfield);
89  np.put(oss.rdbuf(), oss, L'+', d1);
90  result1 = oss.str();
91  VERIFY( result1 == L"1,79769e+308++++++++" );
92
93  oss.str(empty);
94  oss.clear();
95  oss.width(20);
96  oss.setf(ios_base::right, ios_base::adjustfield);
97  np.put(oss.rdbuf(), oss, L'+', d2);
98  result1 = oss.str();
99  VERIFY( result1 == L"++++++++2,22507e-308" );
100
101  oss.str(empty);
102  oss.clear();
103  oss.width(20);
104  oss.setf(ios_base::right, ios_base::adjustfield);
105  oss.setf(ios_base::scientific, ios_base::floatfield);
106  np.put(oss.rdbuf(), oss, L'+', d2);
107  result2 = oss.str();
108  VERIFY( result2 == L"+++++++2,225074e-308" );
109
110  oss.str(empty);
111  oss.clear();
112  oss.width(20);
113  oss.precision(10);
114  oss.setf(ios_base::right, ios_base::adjustfield);
115  oss.setf(ios_base::scientific, ios_base::floatfield);
116  oss.setf(ios_base::uppercase);
117  np.put(oss.rdbuf(), oss, L'+', d2);
118  result1 = oss.str();
119  VERIFY( result1 == L"+++2,2250738585E-308" );
120
121  // long double
122  oss.str(empty);
123  oss.clear();
124  np.put(oss.rdbuf(), oss, L'+', ld1);
125  result1 = oss.str();
126  VERIFY( result1 == L"1,7976931349E+308" );
127
128  oss.str(empty);
129  oss.clear();
130  oss.precision(0);
131  oss.setf(ios_base::fixed, ios_base::floatfield);
132  np.put(oss.rdbuf(), oss, L'+', ld2);
133  result1 = oss.str();
134  VERIFY( result1 == L"0" );
135
136  // const void*
137  oss.str(empty);
138  oss.clear();
139  np.put(oss.rdbuf(), oss, L'+', cv);
140  result1 = oss.str();
141  // No grouping characters.
142  VERIFY( !char_traits<wchar_t>::find(result1.c_str(),
143				   result1.size(),
144				   numpunct_de.decimal_point()) );
145  // Should contain an 'x'.
146  VERIFY( result1.find(L'x') == 1 );
147
148#ifdef _GLIBCXX_USE_LONG_LONG
149  long long ll1 = 9223372036854775807LL;
150
151  oss.str(empty);
152  oss.clear();
153  np.put(oss.rdbuf(), oss, L'+', ll1);
154  result1 = oss.str();
155  VERIFY( result1 == L"9.223.372.036.854.775.807" );
156#endif
157}
158
159int main()
160{
161  test01();
162  return 0;
163}
164