1 //
2 // StreamConverterTest.cpp
3 //
4 // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
5 // and Contributors.
6 //
7 // SPDX-License-Identifier:	BSL-1.0
8 //
9 
10 
11 #include "StreamConverterTest.h"
12 #include "CppUnit/TestCaller.h"
13 #include "CppUnit/TestSuite.h"
14 #include "Poco/StreamConverter.h"
15 #include "Poco/ASCIIEncoding.h"
16 #include "Poco/Latin1Encoding.h"
17 #include "Poco/UTF8Encoding.h"
18 #include "Poco/StreamCopier.h"
19 #include <sstream>
20 
21 
22 using Poco::InputStreamConverter;
23 using Poco::OutputStreamConverter;
24 using Poco::Latin1Encoding;
25 using Poco::UTF8Encoding;
26 using Poco::ASCIIEncoding;
27 using Poco::StreamCopier;
28 
29 
StreamConverterTest(const std::string & name)30 StreamConverterTest::StreamConverterTest(const std::string& name): CppUnit::TestCase(name)
31 {
32 }
33 
34 
~StreamConverterTest()35 StreamConverterTest::~StreamConverterTest()
36 {
37 }
38 
39 
testIdentityASCIIIn()40 void StreamConverterTest::testIdentityASCIIIn()
41 {
42 	ASCIIEncoding encoding;
43 
44 	std::istringstream istr1("");
45 	std::ostringstream ostr1;
46 	InputStreamConverter converter1(istr1, encoding, encoding);
47 	StreamCopier::copyStream(converter1, ostr1);
48 	assertTrue (ostr1.str() == "");
49 	assertTrue (converter1.errors() == 0);
50 
51 	std::istringstream istr2("foo bar");
52 	std::ostringstream ostr2;
53 	InputStreamConverter converter2(istr2, encoding, encoding);
54 	StreamCopier::copyStream(converter2, ostr2);
55 	assertTrue (ostr2.str() == "foo bar");
56 	assertTrue (converter2.errors() == 0);
57 
58 	std::istringstream istr3("x");
59 	std::ostringstream ostr3;
60 	InputStreamConverter converter3(istr3, encoding, encoding);
61 	StreamCopier::copyStream(converter3, ostr3);
62 	assertTrue (ostr3.str() == "x");
63 	assertTrue (converter3.errors() == 0);
64 }
65 
66 
testIdentityASCIIOut()67 void StreamConverterTest::testIdentityASCIIOut()
68 {
69 	ASCIIEncoding encoding;
70 
71 	std::ostringstream ostr1;
72 	OutputStreamConverter converter1(ostr1, encoding, encoding);
73 	converter1 << "";
74 	assertTrue (ostr1.str() == "");
75 	assertTrue (converter1.errors() == 0);
76 
77 	std::ostringstream ostr2;
78 	OutputStreamConverter converter2(ostr2, encoding, encoding);
79 	converter2 << "foo bar";
80 	assertTrue (ostr2.str() == "foo bar");
81 	assertTrue (converter2.errors() == 0);
82 
83 	std::ostringstream ostr3;
84 	OutputStreamConverter converter3(ostr3, encoding, encoding);
85 	converter3 << "x";
86 	assertTrue (ostr3.str() == "x");
87 	assertTrue (converter3.errors() == 0);
88 }
89 
90 
testIdentityUTF8In()91 void StreamConverterTest::testIdentityUTF8In()
92 {
93 	UTF8Encoding encoding;
94 
95 	std::istringstream istr1("");
96 	std::ostringstream ostr1;
97 	InputStreamConverter converter1(istr1, encoding, encoding);
98 	StreamCopier::copyStream(converter1, ostr1);
99 	assertTrue (ostr1.str() == "");
100 	assertTrue (converter1.errors() == 0);
101 
102 	std::istringstream istr2("foo bar");
103 	std::ostringstream ostr2;
104 	InputStreamConverter converter2(istr2, encoding, encoding);
105 	StreamCopier::copyStream(converter2, ostr2);
106 	assertTrue (ostr2.str() == "foo bar");
107 	assertTrue (converter2.errors() == 0);
108 
109 	std::istringstream istr3("x");
110 	std::ostringstream ostr3;
111 	InputStreamConverter converter3(istr3, encoding, encoding);
112 	StreamCopier::copyStream(converter3, ostr3);
113 	assertTrue (ostr3.str() == "x");
114 	assertTrue (converter3.errors() == 0);
115 
116 	const unsigned char greek[] = {0x20, 0xce, 0xba, 0xe1, 0xbd, 0xb9, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5, 0x20, 0x00};
117 	std::string text((const char*) greek);
118 
119 	std::istringstream istr4(text);
120 	std::ostringstream ostr4;
121 	InputStreamConverter converter4(istr4, encoding, encoding);
122 	StreamCopier::copyStream(converter4, ostr4);
123 	assertTrue (ostr4.str() == text);
124 	assertTrue (converter4.errors() == 0);
125 
126 	const unsigned char supp[] = {0x41, 0x42, 0xf0, 0x90, 0x82, 0xa4, 0xf0, 0xaf, 0xa6, 0xa0, 0xf0, 0xaf, 0xa8, 0x9d, 0x00};
127 	std::string text2((const char*) supp);
128 
129 	std::istringstream istr5(text2);
130 	std::ostringstream ostr5;
131 	InputStreamConverter converter5(istr5, encoding, encoding);
132 	StreamCopier::copyStream(converter5, ostr5);
133 	assertTrue (ostr5.str() == text2);
134 	assertTrue (converter5.errors() == 0);
135 
136 
137 }
138 
139 
testIdentityUTF8Out()140 void StreamConverterTest::testIdentityUTF8Out()
141 {
142 	UTF8Encoding encoding;
143 
144 	std::ostringstream ostr1;
145 	OutputStreamConverter converter1(ostr1, encoding, encoding);
146 	converter1 << "";
147 	assertTrue (ostr1.str() == "");
148 	assertTrue (converter1.errors() == 0);
149 
150 	std::ostringstream ostr2;
151 	OutputStreamConverter converter2(ostr2, encoding, encoding);
152 	converter2 << "foo bar";
153 	assertTrue (ostr2.str() == "foo bar");
154 	assertTrue (converter2.errors() == 0);
155 
156 	std::ostringstream ostr3;
157 	OutputStreamConverter converter3(ostr3, encoding, encoding);
158 	converter3 << "x";
159 	assertTrue (ostr3.str() == "x");
160 	assertTrue (converter3.errors() == 0);
161 
162 	const unsigned char greek[] = {0x20, 0xce, 0xba, 0xe1, 0xbd, 0xb9, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5, 0x20, 0x00};
163 	std::string text((const char*) greek);
164 
165 	std::ostringstream ostr4;
166 	OutputStreamConverter converter4(ostr4, encoding, encoding);
167 	converter4 << text;
168 	assertTrue (ostr4.str() == text);
169 	assertTrue (converter4.errors() == 0);
170 }
171 
172 
testUTF8toASCIIIn()173 void StreamConverterTest::testUTF8toASCIIIn()
174 {
175 	UTF8Encoding utf8Encoding;
176 	ASCIIEncoding asciiEncoding;
177 
178 	const unsigned char greek[] = {0x20, 0xce, 0xba, 0xe1, 0xbd, 0xb9, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5, 0x20, 0x41, 0x42, 0x00};
179 	std::string text((const char*) greek);
180 
181 	std::istringstream istr1(text);
182 	std::ostringstream ostr1;
183 	InputStreamConverter converter1(istr1, utf8Encoding, asciiEncoding);
184 	StreamCopier::copyStream(converter1, ostr1);
185 	assertTrue (ostr1.str() == " ????? AB");
186 	assertTrue (converter1.errors() == 0);
187 
188 	std::istringstream istr2("abcde");
189 	std::ostringstream ostr2;
190 	InputStreamConverter converter2(istr2, utf8Encoding, asciiEncoding);
191 	StreamCopier::copyStream(converter2, ostr2);
192 	assertTrue (ostr2.str() == "abcde");
193 	assertTrue (converter2.errors() == 0);
194 }
195 
196 
testUTF8toASCIIOut()197 void StreamConverterTest::testUTF8toASCIIOut()
198 {
199 	UTF8Encoding utf8Encoding;
200 	ASCIIEncoding asciiEncoding;
201 
202 	const unsigned char greek[] = {0x20, 0xce, 0xba, 0xe1, 0xbd, 0xb9, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5, 0x20, 0x41, 0x42, 0x00};
203 	std::string text((const char*) greek);
204 
205 	std::ostringstream ostr1;
206 	OutputStreamConverter converter1(ostr1, utf8Encoding, asciiEncoding);
207 	converter1 << text;
208 	assertTrue (ostr1.str() == " ????? AB");
209 	assertTrue (converter1.errors() == 0);
210 
211 	std::ostringstream ostr2;
212 	OutputStreamConverter converter2(ostr2, utf8Encoding, asciiEncoding);
213 	converter2 << "abcde";
214 	assertTrue (ostr2.str() == "abcde");
215 	assertTrue (converter2.errors() == 0);
216 }
217 
218 
testLatin1toUTF8In()219 void StreamConverterTest::testLatin1toUTF8In()
220 {
221 	UTF8Encoding utf8Encoding;
222 	Latin1Encoding latin1Encoding;
223 
224 	const unsigned char latin1Chars[] = {'g', 252, 'n', 't', 'e', 'r', 0};
225 	const unsigned char utf8Chars[]   = {'g', 195, 188, 'n', 't', 'e', 'r', 0};
226 	std::string latin1Text((const char*) latin1Chars);
227 	std::string utf8Text((const char*) utf8Chars);
228 
229 	std::istringstream istr1(latin1Text);
230 	std::ostringstream ostr1;
231 	InputStreamConverter converter1(istr1, latin1Encoding, utf8Encoding);
232 	StreamCopier::copyStream(converter1, ostr1);
233 	assertTrue (ostr1.str() == utf8Text);
234 	assertTrue (converter1.errors() == 0);
235 }
236 
237 
testLatin1toUTF8Out()238 void StreamConverterTest::testLatin1toUTF8Out()
239 {
240 	UTF8Encoding utf8Encoding;
241 	Latin1Encoding latin1Encoding;
242 
243 	const unsigned char latin1Chars[] = {'g', 252, 'n', 't', 'e', 'r', 0};
244 	const unsigned char utf8Chars[]   = {'g', 195, 188, 'n', 't', 'e', 'r', 0};
245 	std::string latin1Text((const char*) latin1Chars);
246 	std::string utf8Text((const char*) utf8Chars);
247 
248 	std::ostringstream ostr1;
249 	OutputStreamConverter converter1(ostr1, latin1Encoding, utf8Encoding);
250 	converter1 << latin1Text;
251 	assertTrue (ostr1.str() == utf8Text);
252 	assertTrue (converter1.errors() == 0);
253 }
254 
255 
testErrorsIn()256 void StreamConverterTest::testErrorsIn()
257 {
258 	UTF8Encoding utf8Encoding;
259 	Latin1Encoding latin1Encoding;
260 
261 	const unsigned char badChars[] = {'a', 'b', 255, 'c', 254, 0};
262 	std::string badText((const char*) badChars);
263 
264 	std::istringstream istr1(badText);
265 	std::ostringstream ostr1;
266 	InputStreamConverter converter1(istr1, utf8Encoding, latin1Encoding);
267 	StreamCopier::copyStream(converter1, ostr1);
268 	assertTrue (converter1.errors() == 2);
269 }
270 
271 
testErrorsOut()272 void StreamConverterTest::testErrorsOut()
273 {
274 	UTF8Encoding utf8Encoding;
275 	Latin1Encoding latin1Encoding;
276 
277 	const unsigned char badChars[] = {'a', 'b', 255, 'c', 254, 0};
278 	std::string badText((const char*) badChars);
279 
280 	std::ostringstream ostr1;
281 	OutputStreamConverter converter1(ostr1, utf8Encoding, latin1Encoding);
282 	converter1 << badText;
283 	assertTrue (converter1.errors() == 1);
284 }
285 
286 
setUp()287 void StreamConverterTest::setUp()
288 {
289 }
290 
291 
tearDown()292 void StreamConverterTest::tearDown()
293 {
294 }
295 
296 
suite()297 CppUnit::Test* StreamConverterTest::suite()
298 {
299 	CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("StreamConverterTest");
300 
301 	CppUnit_addTest(pSuite, StreamConverterTest, testIdentityASCIIIn);
302 	CppUnit_addTest(pSuite, StreamConverterTest, testIdentityASCIIOut);
303 	CppUnit_addTest(pSuite, StreamConverterTest, testIdentityUTF8In);
304 	CppUnit_addTest(pSuite, StreamConverterTest, testIdentityUTF8Out);
305 	CppUnit_addTest(pSuite, StreamConverterTest, testUTF8toASCIIIn);
306 	CppUnit_addTest(pSuite, StreamConverterTest, testUTF8toASCIIOut);
307 	CppUnit_addTest(pSuite, StreamConverterTest, testLatin1toUTF8In);
308 	CppUnit_addTest(pSuite, StreamConverterTest, testLatin1toUTF8Out);
309 	CppUnit_addTest(pSuite, StreamConverterTest, testErrorsIn);
310 	CppUnit_addTest(pSuite, StreamConverterTest, testErrorsOut);
311 
312 	return pSuite;
313 }
314