OSDN Git Service

* testsuite/lib/libstdc++.exp: Load target-supports-dg.exp.
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / testsuite / 26_numerics / complex / complex_inserters_extractors.cc
1 // 2000-02-10
2 // Petter Urkedal <petter@matfys.lth.se>
3
4 // Copyright (C) 2000, 2003 Free Software Foundation
5 //
6 // This file is part of the GNU ISO C++ Library.  This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING.  If not, write to the Free
19 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 // USA.
21
22
23 #include <iostream>
24 #include <string>
25 #include <sstream>
26 #include <complex>
27 #include <testsuite_hooks.h>
28 #include <cmath>
29
30 template<typename R>
31 inline bool flteq(R x, R y)
32 {
33   if (x == R(0)) return y == R(0);
34   else return std::fabs(x-y) < 1e-6*std::fabs(x);
35 }
36
37 template<typename R>
38 int
39 test_good(std::string str, R x, R y)
40 {
41   bool test __attribute__((unused)) = true;
42   std::complex<R> z;
43   char ch;
44   std::istringstream iss(str);
45   iss >> z >> ch;
46   VERIFY( iss.good() );
47   VERIFY( flteq(z.real(), x) );
48   VERIFY( flteq(z.imag(), y) );
49   VERIFY( ch == '#' );
50   return 0;
51 }
52
53 template<typename R>
54 int
55 test_fail(std::string str)
56 {
57   bool test __attribute__((unused)) = true;
58   std::complex<R> z;
59   std::istringstream iss(str);
60   iss >> z;
61   VERIFY( iss.fail() && !iss.bad() );
62   return 0;
63 }
64
65 template<typename R>
66 int
67 testall()
68 {
69   test_good<R>("(-1.1,3.7)#", -1.1, 3.7);
70   test_good<R>("(  .7e6  ,  \n-3.1)#", .7e6, -3.1);
71   test_good<R>("(\t0,-1)#", 0.0, -1.0);
72   test_good<R>("(-3.14)#", -3.14, 0.0);
73   test_good<R>("-.1#", -.1, 0.0);
74   test_good<R>(" ( -2.7e3 )#", -2.7e3, 0.0);
75   test_good<R>(" -.1#", -.1, 0.0);
76   test_fail<R>("(a,1)");
77   test_fail<R>("(,1)");
78   test_fail<R>("(1,a)");
79   test_fail<R>("(1, )");
80   test_fail<R>("|1,1)");
81   test_fail<R>("(1|1)");
82   test_fail<R>("(1,1|");
83   return 0;
84 }
85
86 // libstdc++/2970
87 void test01()
88 {
89   using namespace std;
90   bool test __attribute__((unused)) = true;
91   
92   complex<float> cf01(-1.1, -333.2);
93   stringstream ss;
94   ss << cf01;
95   string str = ss.str();
96   VERIFY( str == "(-1.1,-333.2)" );
97 }
98
99 // libstdc++/2985
100 struct gnu_char_traits : public std::char_traits<char>
101 { };
102
103 typedef std::basic_ostringstream<char, gnu_char_traits> gnu_sstream;
104 template class std::basic_string<char, gnu_char_traits, std::allocator<char> >;
105
106 void test02()
107 {
108   bool test __attribute__((unused)) = true;
109
110   // Construct locale with specialized facets.
111   typedef gnu_sstream::__num_put_type numput_type;
112   typedef gnu_sstream::__num_get_type numget_type;
113   std::locale loc_c = std::locale::classic();
114   std::locale loc_1(loc_c, new numput_type);
115   std::locale loc_2(loc_1, new numget_type);
116   VERIFY( std::has_facet<numput_type>(loc_2) );
117   VERIFY( std::has_facet<numget_type>(loc_2) );
118
119   gnu_sstream sstr;
120   sstr.imbue(loc_2);
121
122
123   std::complex<double> x(3, 4);
124   sstr << x; 
125   VERIFY( sstr.str() == "(3,4)" );
126 }
127
128 int
129 main()
130 {
131   testall<float>();
132   testall<double>();
133   testall<long double>();
134
135   test01();
136   test02();
137
138   return 0;
139 }
140
141
142
143