1// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 2, or (at your option)
7// any later version.
8
9// This library 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 along
15// with this library; see the file COPYING.  If not, write to the Free
16// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17// USA.
18
19// 27.6.1.2.2 arithmetic extractors
20
21#include <istream>
22#include <sstream>
23#include <locale>
24#include <testsuite_hooks.h>
25
26namespace std {
27  class test_numpunct1 : public numpunct<wchar_t>
28  {
29  protected:
30    string
31    do_grouping() const
32    { return string(1, '\003'); }
33  };
34} // namespace std
35
36void test07()
37{
38  // manufactured locale, grouping is turned on
39  bool test __attribute__((unused)) = true;
40  unsigned int h4 = 0, h3 = 0, h2 = 0;
41  float f1 = 0.0;
42  const std::wstring s1(L"205,199 23,445.25 1,024,365 123,22,24");
43  std::wistringstream is(s1);
44  is.imbue(std::locale(std::locale(), new std::test_numpunct1));
45
46  // Basic operation.
47  is >> h4;
48  VERIFY( h4 == 205199 );
49  VERIFY( is.good() );
50
51  is.clear();
52  is >> f1;
53  VERIFY( f1 == 23445.25 );
54  VERIFY( is.good() );
55
56  is.clear();
57  is >> h3;
58  VERIFY( h3 == 1024365 );
59  VERIFY( is.good() );
60
61  is.clear();
62  is >> h2;
63  VERIFY( h2 == 1232224 );
64  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
65  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::eofbit) );
66
67  // Stress tests for explicit errors in grouping corner cases.  The
68  // validity of these tests and results have been hammered out in
69  // private email between bkoz and ncm between Jan 25 and Jan 27, 2000.
70  // Thanks nate -- benjamin
71  const std::wstring s2(L",111 4,,4 0.25,345 5..25 156,, 1,000000 1000000 1234,567");
72  h3 = h4 = h2 = 0;
73  f1 = 0.0;
74  const wchar_t c_control = L'?';
75  wchar_t c = c_control;
76  is.clear();
77  is.str(s2);
78
79  is >> h4;
80  VERIFY( h4 == 0 );
81  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
82  is.clear();
83  is >> c;
84  VERIFY( c == L',' );
85  VERIFY( is.good() );
86
87  is.ignore(3);
88  is >> f1;
89  VERIFY( f1 == 0.0 );
90  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
91  is.clear();
92  is >> c;
93  VERIFY( c == L',' );
94  is >> c;
95  VERIFY( c == L'4' );
96  VERIFY( is.good() );
97
98  is >> f1;
99  VERIFY( f1 == 0.25 );
100  VERIFY( is.good() );
101  is >> c;
102  VERIFY( c == L',' );
103  is >> h2;
104  VERIFY( h2 == 345 );
105  VERIFY( is.good() );
106  f1 = 0.0;
107  h2 = 0;
108
109  is >> f1;
110  VERIFY( f1 == 5.0 );
111  VERIFY( is.good() );
112  is >> f1;
113  VERIFY( f1 == .25 );
114  VERIFY( is.good() );
115
116  is >> h3;
117  VERIFY( h3 == 0 );
118  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
119  is.clear();
120  is >> c;
121  VERIFY( c == L',' ); // second one
122  VERIFY( is.good() );
123
124  is >> h2;
125  VERIFY( h2 == 1000000 );
126  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
127  h2 = 0;
128  is.clear();
129
130  is >> h2;
131  VERIFY( h2 == 1000000 );
132  VERIFY( is.good() );
133  h2 = 0;
134
135  is >> h2;
136  VERIFY( h2 == 1234567 );
137  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::failbit) );
138  VERIFY( static_cast<bool>(is.rdstate() & std::ios_base::eofbit) );
139  is.clear();
140}
141
142int main()
143{
144  test07();
145  return 0;
146}
147