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