OSDN Git Service

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