Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / libstdc++-v3 / testsuite / 27_io / basic_ostream / inserters_other / wchar_t / 4.cc
1 // Copyright (C) 2005-2013 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 3, 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 COPYING3.  If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // 27.6.2.5.4 basic_ostream character inserters
19
20 #include <ostream>
21 #include <sstream>
22 #include <testsuite_hooks.h>
23
24 class test_buffer_1 : public std::wstreambuf 
25 {
26 public:
27   test_buffer_1(const std::wstring& s)
28   : str(s), it(str.begin()) { }
29   
30 protected:
31   virtual int_type
32   underflow()
33   { return (it != str.end() ? *it : WEOF); }
34   
35   virtual int_type
36   uflow()
37   { return (it != str.end() ? *it++ : WEOF); }
38
39 private:
40   const std::wstring str;
41   std::wstring::const_iterator it;
42 };
43
44
45 class test_buffer_2 : public std::wstreambuf 
46 {
47 public:
48   test_buffer_2(const std::wstring& s)
49   : str(s), it(str.begin()) { }
50   
51 protected:
52   virtual int_type
53   underflow()
54   { return (it != str.end() ? *it : WEOF); }
55   
56   virtual int_type
57   uflow()
58   { return (it != str.end() ? *it++ : WEOF); }
59   
60   virtual std::streamsize
61   showmanyc()
62   { return std::distance(it, str.end()); }
63
64 private:
65   const std::wstring str;
66   std::wstring::const_iterator it;
67 };
68
69
70 class test_buffer_3 : public std::wstreambuf 
71 {
72 public:
73   test_buffer_3(const std::wstring& s)
74   : str(s), it(str.begin()) { }
75
76 protected:
77   virtual int_type
78   underflow()
79   { return (it != str.end() ? *it : WEOF); }
80   
81   virtual int_type
82   uflow()
83   { return (it != str.end() ? *it++ : WEOF); }
84   
85   virtual std::streamsize
86   showmanyc() 
87   {
88     std::streamsize ret = std::distance(it, str.end());
89     return ret > 0 ? ret : -1;
90   }
91
92 private:
93   const std::wstring str;
94   std::wstring::const_iterator it;
95 };
96
97 class test_buffer_4 : public std::wstreambuf
98 {
99 public:
100   test_buffer_4(const std::wstring& s)
101   : str(s), it(str.begin())
102   {
103     if (it != str.end())
104       {
105         buf[0] = *it++;
106         setg(buf, buf, buf+1);
107       }
108   }
109
110 protected:
111   virtual int_type
112   underflow()
113   { return (it != str.end() ? *it : WEOF); }
114   
115   virtual int_type
116   uflow()
117   { return (it != str.end() ? *it++ : WEOF); }
118   
119   virtual std::streamsize
120   showmanyc()
121   {
122     std::streamsize ret = std::distance(it, str.end());
123     return ret > 0 ? ret : -1;
124   }
125
126 private:
127   const std::wstring str;
128   std::wstring::const_iterator it;
129   wchar_t buf[1];
130 };
131
132 void test(const std::wstring& str, std::wstreambuf& buf)
133 {
134   bool test __attribute__((unused)) = true;
135
136   std::wostringstream out;
137   std::wistream in(&buf);
138
139   out << in.rdbuf();
140
141   if (out.str() != str) 
142     VERIFY( false );
143 }
144
145 // libstdc++/6745
146 // libstdc++/8071
147 // libstdc++/8127
148 // Jonathan Lennox  <lennox@cs.columbia.edu>
149 void test05()
150 {
151   std::wstring string_a(L"Hello, world!");
152   std::wstring string_b(L"");
153
154   test_buffer_1 buf1a(string_a);
155   test_buffer_1 buf1b(string_b);
156
157   test_buffer_2 buf2a(string_a);
158   test_buffer_2 buf2b(string_b);
159
160   test_buffer_3 buf3a(string_a);
161   test_buffer_3 buf3b(string_b);
162
163   test_buffer_4 buf4a(string_a);
164   test_buffer_4 buf4b(string_b);
165
166   test(string_a, buf1a);
167   test(string_b, buf1b);
168
169   test(string_a, buf2a);
170   test(string_b, buf2b);
171
172   test(string_a, buf3a);
173   test(string_b, buf3b);
174
175   test(string_a, buf4a);
176   test(string_b, buf4b);
177 }
178
179 int 
180 main()
181 {
182   test05();
183   return 0;
184 }