1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        tests/streams/textstreamtest.cpp
3 // Purpose:     wxTextXXXStream unit test
4 // Author:      Ryan Norton, Vince Harron
5 // Created:     2004-08-14
6 // Copyright:   (c) 2004 Ryan Norton, (c) 2006 Vince Harron
7 ///////////////////////////////////////////////////////////////////////////////
8 
9 // ----------------------------------------------------------------------------
10 // headers
11 // ----------------------------------------------------------------------------
12 
13 #include "testprec.h"
14 
15 #ifdef __BORLANDC__
16     #pragma hdrstop
17 #endif
18 
19 #ifndef WX_PRECOMP
20     #include "wx/wx.h"
21 #endif // WX_PRECOMP
22 
23 #include "wx/txtstrm.h"
24 #include "wx/wfstream.h"
25 
26 #if wxUSE_LONGLONG
27     #include "wx/longlong.h"
28 #endif
29 
30 #if wxUSE_UNICODE
31     #include "wx/mstream.h"
32 #endif // wxUSE_UNICODE
33 
34 // ----------------------------------------------------------------------------
35 // test class
36 // ----------------------------------------------------------------------------
37 
38 class TextStreamTestCase : public CppUnit::TestCase
39 {
40 public:
41     TextStreamTestCase();
42 
43 private:
44     CPPUNIT_TEST_SUITE( TextStreamTestCase );
45         CPPUNIT_TEST( Endline );
46         CPPUNIT_TEST( MiscTests );
47 
48 #if wxUSE_LONGLONG
49         CPPUNIT_TEST( TestLongLong );
50         CPPUNIT_TEST( TestLongLong );
51 #endif // wxUSE_LONGLONG
52 
53 #if wxUSE_UNICODE
54         CPPUNIT_TEST( TestUTF8Input );
55         CPPUNIT_TEST( TestEmbeddedZerosUTF16LEInput );
56         CPPUNIT_TEST( TestEmbeddedZerosUTF16BEInput );
57         CPPUNIT_TEST( TestEmbeddedZerosUTF32LEInput );
58         CPPUNIT_TEST( TestEmbeddedZerosUTF32BEInput );
59 #endif // wxUSE_UNICODE
60     CPPUNIT_TEST_SUITE_END();
61 
62     void Endline();
63     void MiscTests();
64 
65 #if wxUSE_LONGLONG
66     void TestLongLong();
67     void TestULongLong();
68 #endif // wxUSE_LONGLONG
69 
70 #if wxUSE_UNICODE
71     void TestUTF8Input();
72     void TestEmbeddedZerosUTF16LEInput();
73     void TestEmbeddedZerosUTF16BEInput();
74     void TestEmbeddedZerosUTF32LEInput();
75     void TestEmbeddedZerosUTF32BEInput();
76     void TestInput(const wxMBConv& conv,
77                    const void* encodedText,
78                    size_t encodedSize );
79 #endif // wxUSE_UNICODE
80 
81 
82     DECLARE_NO_COPY_CLASS(TextStreamTestCase)
83 };
84 
85 // register in the unnamed registry so that these tests are run by default
86 CPPUNIT_TEST_SUITE_REGISTRATION( TextStreamTestCase );
87 
88 // also include in its own registry so that these tests can be run alone
89 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TextStreamTestCase, "TextStreamTestCase" );
90 
TextStreamTestCase()91 TextStreamTestCase::TextStreamTestCase()
92 {
93 }
94 
95 #if defined(__WINDOWS__) || defined(__WXPM__)
96 #   define NEWLINE "\r\n"
97 #   define NEWLINELEN 2
98 #elif defined(__WXMAC__) && !defined(__DARWIN__)
99 #   define NEWLINE "\r"
100 #   define NEWLINELEN 1
101 #else
102 #   define NEWLINE "\n"
103 #   define NEWLINELEN 1
104 #endif
105 
Endline()106 void TextStreamTestCase::Endline()
107 {
108     wxFileOutputStream* pOutFile = new wxFileOutputStream(wxT("test.txt"));
109     wxTextOutputStream* pOutText = new wxTextOutputStream(*pOutFile);
110     *pOutText   << wxT("Test text") << endl
111                 << wxT("More Testing Text (There should be newline before this)");
112 
113     delete pOutText;
114     delete pOutFile;
115 
116     wxFileInputStream* pInFile = new wxFileInputStream(wxT("test.txt"));
117 
118     char szIn[9 + NEWLINELEN];
119 
120     pInFile->Read(szIn, 9 + NEWLINELEN);
121 
122     CPPUNIT_ASSERT( memcmp(&szIn[9], NEWLINE, NEWLINELEN) == 0 );
123 
124     delete pInFile;
125 }
126 
MiscTests()127 void TextStreamTestCase::MiscTests()
128 {
129     wxString filename = wxT("testdata.fc");
130     wxFileInputStream fsIn(filename);
131     if ( !fsIn.IsOk() )
132     {
133         return;
134     }
135 
136     wxTextInputStream tis(fsIn);
137     CPPUNIT_ASSERT_EQUAL("# this is the test data file for wxFileConfig tests", tis.ReadLine());
138     CPPUNIT_ASSERT_EQUAL("value1=one", tis.ReadLine());
139     CPPUNIT_ASSERT_EQUAL("# a comment here", tis.ReadLine());
140     CPPUNIT_ASSERT_EQUAL("value2=two", tis.ReadLine());
141     CPPUNIT_ASSERT_EQUAL("value\\ with\\ spaces\\ inside\\ it=nothing special", tis.ReadLine());
142     CPPUNIT_ASSERT_EQUAL("path=$PATH", tis.ReadLine());
143 }
144 
145 #if wxUSE_LONGLONG
146 
147 template <typename T>
DoTestRoundTrip(const T * values,size_t numValues)148 static void DoTestRoundTrip(const T *values, size_t numValues)
149 {
150     {
151         wxFileOutputStream fileOut(wxT("test.txt"));
152         wxTextOutputStream textOut(fileOut);
153 
154         for ( size_t n = 0; n < numValues; n++ )
155         {
156             textOut << values[n] << endl;
157         }
158     }
159 
160     {
161         wxFileInputStream fileIn(wxT("test.txt"));
162         wxTextInputStream textIn(fileIn);
163 
164         T value;
165         for ( size_t n = 0; n < numValues; n++ )
166         {
167             textIn >> value;
168 
169             CPPUNIT_ASSERT( value == values[n] );
170         }
171     }
172 }
173 
TestLongLong()174 void TextStreamTestCase::TestLongLong()
175 {
176     static const wxLongLong llvalues[] =
177     {
178         0,
179         1,
180         -1,
181         0x12345678l,
182         -0x12345678l,
183         wxLL(0x123456789abcdef0),
184         wxLL(-0x123456789abcdef0),
185     };
186 
187     DoTestRoundTrip(llvalues, WXSIZEOF(llvalues));
188 }
189 
TestULongLong()190 void TextStreamTestCase::TestULongLong()
191 {
192     static const wxULongLong ullvalues[] =
193     {
194         0,
195         1,
196         0x12345678l,
197         wxULL(0x123456789abcdef0),
198     };
199 
200     DoTestRoundTrip(ullvalues, WXSIZEOF(ullvalues));
201 }
202 
203 #endif // wxUSE_LONGLONG
204 
205 #if wxUSE_UNICODE
206 
207 static const wchar_t txtWchar[4] =
208 {
209     0x0041, // LATIN CAPITAL LETTER A
210     0x0100, // A WITH BREVE, LATIN SMALL LETTER
211     0x0041, // LATIN CAPITAL LETTER A
212     0x0100, // A WITH BREVE, LATIN SMALL LETTER
213 };
214 
215 static const unsigned char txtUtf8[6] =
216 {
217     0x41, 0xc4, 0x80, 0x41, 0xc4, 0x80,
218 };
219 
220 static const unsigned char txtUtf16le[8] =
221 {
222     0x41, 0x00, 0x00, 0x01, 0x41, 0x00, 0x00, 0x01,
223 };
224 
225 static const unsigned char txtUtf16be[8] =
226 {
227     0x00, 0x41, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00,
228 };
229 
230 static const unsigned char txtUtf32le[16] =
231 {
232     0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
233     0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
234 };
235 
236 static const unsigned char txtUtf32be[16] =
237 {
238     0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x01, 0x00,
239     0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x01, 0x00,
240 };
241 
TestUTF8Input()242 void TextStreamTestCase::TestUTF8Input()
243 {
244     TestInput(wxConvUTF8, txtUtf8, sizeof(txtUtf8));
245     TestInput(wxCSConv(wxFONTENCODING_UTF8), txtUtf8, sizeof(txtUtf8));
246 }
247 
TestEmbeddedZerosUTF16LEInput()248 void TextStreamTestCase::TestEmbeddedZerosUTF16LEInput()
249 {
250     TestInput(wxMBConvUTF16LE(), txtUtf16le, sizeof(txtUtf16le));
251     TestInput(wxCSConv(wxFONTENCODING_UTF16LE), txtUtf16le, sizeof(txtUtf16le));
252 }
253 
TestEmbeddedZerosUTF16BEInput()254 void TextStreamTestCase::TestEmbeddedZerosUTF16BEInput()
255 {
256     TestInput(wxMBConvUTF16BE(), txtUtf16be, sizeof(txtUtf16be));
257     TestInput(wxCSConv(wxFONTENCODING_UTF16BE), txtUtf16be, sizeof(txtUtf16be));
258 }
259 
TestEmbeddedZerosUTF32LEInput()260 void TextStreamTestCase::TestEmbeddedZerosUTF32LEInput()
261 {
262     TestInput(wxMBConvUTF32LE(), txtUtf32le, sizeof(txtUtf32le));
263     TestInput(wxCSConv(wxFONTENCODING_UTF32LE), txtUtf32le, sizeof(txtUtf32le));
264 }
265 
TestEmbeddedZerosUTF32BEInput()266 void TextStreamTestCase::TestEmbeddedZerosUTF32BEInput()
267 {
268     TestInput(wxMBConvUTF32BE(), txtUtf32be, sizeof(txtUtf32be));
269     TestInput(wxCSConv(wxFONTENCODING_UTF32BE), txtUtf32be, sizeof(txtUtf32be));
270 }
271 
TestInput(const wxMBConv & conv,const void * encodedText,size_t encodedSize)272 void TextStreamTestCase::TestInput(const wxMBConv& conv,
273                                    const void *encodedText,
274                                    size_t encodedSize)
275 {
276     wxMemoryInputStream byteIn(encodedText, encodedSize);
277     wxTextInputStream textIn(byteIn, wxT("\n"), conv);
278 
279     wxString temp;
280     while ( wxChar c = textIn.GetChar() )
281     {
282         temp.Append(c);
283     }
284 
285     CPPUNIT_ASSERT_EQUAL( WXSIZEOF(txtWchar), temp.length() );
286 
287     CPPUNIT_ASSERT_EQUAL( 0, memcmp(txtWchar, temp.wc_str(), sizeof(txtWchar)) );
288 }
289 
290 #endif // wxUSE_UNICODE
291