1*2f083884Ss.makeev_local #include "UnitTest++/UnitTestPP.h"
2*2f083884Ss.makeev_local 
3*2f083884Ss.makeev_local #include "UnitTest++/MemoryOutStream.h"
4*2f083884Ss.makeev_local #include <cstring>
5*2f083884Ss.makeev_local #include <cstdlib>
6*2f083884Ss.makeev_local #include <climits>
7*2f083884Ss.makeev_local #include <cfloat>
8*2f083884Ss.makeev_local 
9*2f083884Ss.makeev_local using namespace UnitTest;
10*2f083884Ss.makeev_local using namespace std;
11*2f083884Ss.makeev_local 
12*2f083884Ss.makeev_local namespace {
13*2f083884Ss.makeev_local 
maxSignedIntegralStr(size_t nBytes)14*2f083884Ss.makeev_local const char* const maxSignedIntegralStr(size_t nBytes)
15*2f083884Ss.makeev_local {
16*2f083884Ss.makeev_local     switch(nBytes)
17*2f083884Ss.makeev_local     {
18*2f083884Ss.makeev_local         case 8:
19*2f083884Ss.makeev_local             return "9223372036854775807";
20*2f083884Ss.makeev_local         case 4:
21*2f083884Ss.makeev_local             return "2147483647";
22*2f083884Ss.makeev_local         case 2:
23*2f083884Ss.makeev_local             return "32767";
24*2f083884Ss.makeev_local         case 1:
25*2f083884Ss.makeev_local             return "127";
26*2f083884Ss.makeev_local         default:
27*2f083884Ss.makeev_local             return "Unsupported signed integral size";
28*2f083884Ss.makeev_local     }
29*2f083884Ss.makeev_local }
30*2f083884Ss.makeev_local 
minSignedIntegralStr(size_t nBytes)31*2f083884Ss.makeev_local const char* const minSignedIntegralStr(size_t nBytes)
32*2f083884Ss.makeev_local {
33*2f083884Ss.makeev_local     switch(nBytes)
34*2f083884Ss.makeev_local     {
35*2f083884Ss.makeev_local         case 8:
36*2f083884Ss.makeev_local             return "-9223372036854775808";
37*2f083884Ss.makeev_local         case 4:
38*2f083884Ss.makeev_local             return "-2147483648";
39*2f083884Ss.makeev_local         case 2:
40*2f083884Ss.makeev_local             return "-32768";
41*2f083884Ss.makeev_local         case 1:
42*2f083884Ss.makeev_local             return "-128";
43*2f083884Ss.makeev_local         default:
44*2f083884Ss.makeev_local             return "Unsupported signed integral size";
45*2f083884Ss.makeev_local     }
46*2f083884Ss.makeev_local }
47*2f083884Ss.makeev_local 
maxUnsignedIntegralStr(size_t nBytes)48*2f083884Ss.makeev_local const char* const maxUnsignedIntegralStr(size_t nBytes)
49*2f083884Ss.makeev_local {
50*2f083884Ss.makeev_local     switch(nBytes)
51*2f083884Ss.makeev_local     {
52*2f083884Ss.makeev_local         case 8:
53*2f083884Ss.makeev_local             return "18446744073709551615";
54*2f083884Ss.makeev_local         case 4:
55*2f083884Ss.makeev_local             return "4294967295";
56*2f083884Ss.makeev_local         case 2:
57*2f083884Ss.makeev_local             return "65535";
58*2f083884Ss.makeev_local         case 1:
59*2f083884Ss.makeev_local             return "255";
60*2f083884Ss.makeev_local         default:
61*2f083884Ss.makeev_local             return "Unsupported signed integral size";
62*2f083884Ss.makeev_local     }
63*2f083884Ss.makeev_local }
64*2f083884Ss.makeev_local 
TEST(DefaultIsEmptyString)65*2f083884Ss.makeev_local TEST(DefaultIsEmptyString)
66*2f083884Ss.makeev_local {
67*2f083884Ss.makeev_local     MemoryOutStream const stream;
68*2f083884Ss.makeev_local     CHECK(stream.GetText() != 0);
69*2f083884Ss.makeev_local     CHECK_EQUAL("", stream.GetText());
70*2f083884Ss.makeev_local }
71*2f083884Ss.makeev_local 
TEST(StreamingTextCopiesCharacters)72*2f083884Ss.makeev_local TEST(StreamingTextCopiesCharacters)
73*2f083884Ss.makeev_local {
74*2f083884Ss.makeev_local     MemoryOutStream stream;
75*2f083884Ss.makeev_local     stream << "Lalala";
76*2f083884Ss.makeev_local     CHECK_EQUAL("Lalala", stream.GetText());
77*2f083884Ss.makeev_local }
78*2f083884Ss.makeev_local 
TEST(StreamingMultipleTimesConcatenatesResult)79*2f083884Ss.makeev_local TEST(StreamingMultipleTimesConcatenatesResult)
80*2f083884Ss.makeev_local {
81*2f083884Ss.makeev_local     MemoryOutStream stream;
82*2f083884Ss.makeev_local     stream << "Bork" << "Foo" << "Bar";
83*2f083884Ss.makeev_local     CHECK_EQUAL("BorkFooBar", stream.GetText());
84*2f083884Ss.makeev_local }
85*2f083884Ss.makeev_local 
TEST(StreamingIntWritesCorrectCharacters)86*2f083884Ss.makeev_local TEST(StreamingIntWritesCorrectCharacters)
87*2f083884Ss.makeev_local {
88*2f083884Ss.makeev_local     MemoryOutStream stream;
89*2f083884Ss.makeev_local     stream << (int)123;
90*2f083884Ss.makeev_local     CHECK_EQUAL("123", stream.GetText());
91*2f083884Ss.makeev_local }
92*2f083884Ss.makeev_local 
TEST(StreaminMaxIntWritesCorrectCharacters)93*2f083884Ss.makeev_local TEST(StreaminMaxIntWritesCorrectCharacters)
94*2f083884Ss.makeev_local {
95*2f083884Ss.makeev_local     MemoryOutStream stream;
96*2f083884Ss.makeev_local     stream << INT_MAX;
97*2f083884Ss.makeev_local     CHECK_EQUAL(maxSignedIntegralStr(sizeof(int)), stream.GetText());
98*2f083884Ss.makeev_local }
99*2f083884Ss.makeev_local 
TEST(StreamingMinIntWritesCorrectCharacters)100*2f083884Ss.makeev_local TEST(StreamingMinIntWritesCorrectCharacters)
101*2f083884Ss.makeev_local {
102*2f083884Ss.makeev_local     MemoryOutStream stream;
103*2f083884Ss.makeev_local     stream << INT_MIN;
104*2f083884Ss.makeev_local     CHECK_EQUAL(minSignedIntegralStr(sizeof(int)), stream.GetText());
105*2f083884Ss.makeev_local }
106*2f083884Ss.makeev_local 
TEST(StreamingUnsignedIntWritesCorrectCharacters)107*2f083884Ss.makeev_local TEST(StreamingUnsignedIntWritesCorrectCharacters)
108*2f083884Ss.makeev_local {
109*2f083884Ss.makeev_local     MemoryOutStream stream;
110*2f083884Ss.makeev_local     stream << (unsigned int)123;
111*2f083884Ss.makeev_local     CHECK_EQUAL("123", stream.GetText());
112*2f083884Ss.makeev_local }
113*2f083884Ss.makeev_local 
TEST(StreamingMaxUnsignedIntWritesCorrectCharacters)114*2f083884Ss.makeev_local TEST(StreamingMaxUnsignedIntWritesCorrectCharacters)
115*2f083884Ss.makeev_local {
116*2f083884Ss.makeev_local     MemoryOutStream stream;
117*2f083884Ss.makeev_local     stream << (unsigned int)UINT_MAX;
118*2f083884Ss.makeev_local     CHECK_EQUAL(maxUnsignedIntegralStr(sizeof(unsigned int)), stream.GetText());
119*2f083884Ss.makeev_local }
120*2f083884Ss.makeev_local 
TEST(StreamingMinUnsignedIntWritesCorrectCharacters)121*2f083884Ss.makeev_local TEST(StreamingMinUnsignedIntWritesCorrectCharacters)
122*2f083884Ss.makeev_local {
123*2f083884Ss.makeev_local     MemoryOutStream stream;
124*2f083884Ss.makeev_local     stream << (unsigned int)0;
125*2f083884Ss.makeev_local     CHECK_EQUAL("0", stream.GetText());
126*2f083884Ss.makeev_local }
127*2f083884Ss.makeev_local 
TEST(StreamingLongWritesCorrectCharacters)128*2f083884Ss.makeev_local TEST(StreamingLongWritesCorrectCharacters)
129*2f083884Ss.makeev_local {
130*2f083884Ss.makeev_local     MemoryOutStream stream;
131*2f083884Ss.makeev_local     stream << (long)(-123);
132*2f083884Ss.makeev_local     CHECK_EQUAL("-123", stream.GetText());
133*2f083884Ss.makeev_local }
134*2f083884Ss.makeev_local 
TEST(StreamingMaxLongWritesCorrectCharacters)135*2f083884Ss.makeev_local TEST(StreamingMaxLongWritesCorrectCharacters)
136*2f083884Ss.makeev_local {
137*2f083884Ss.makeev_local     MemoryOutStream stream;
138*2f083884Ss.makeev_local     stream << (long)(LONG_MAX);
139*2f083884Ss.makeev_local     CHECK_EQUAL(maxSignedIntegralStr(sizeof(long)), stream.GetText());
140*2f083884Ss.makeev_local }
141*2f083884Ss.makeev_local 
TEST(StreamingMinLongWritesCorrectCharacters)142*2f083884Ss.makeev_local TEST(StreamingMinLongWritesCorrectCharacters)
143*2f083884Ss.makeev_local {
144*2f083884Ss.makeev_local     MemoryOutStream stream;
145*2f083884Ss.makeev_local     stream << (long)(LONG_MIN);
146*2f083884Ss.makeev_local     CHECK_EQUAL(minSignedIntegralStr(sizeof(long)), stream.GetText());
147*2f083884Ss.makeev_local }
148*2f083884Ss.makeev_local 
TEST(StreamingUnsignedLongWritesCorrectCharacters)149*2f083884Ss.makeev_local TEST(StreamingUnsignedLongWritesCorrectCharacters)
150*2f083884Ss.makeev_local {
151*2f083884Ss.makeev_local     MemoryOutStream stream;
152*2f083884Ss.makeev_local     stream << (unsigned long)123;
153*2f083884Ss.makeev_local     CHECK_EQUAL("123", stream.GetText());
154*2f083884Ss.makeev_local }
155*2f083884Ss.makeev_local 
TEST(StreamingMaxUnsignedLongWritesCorrectCharacters)156*2f083884Ss.makeev_local TEST(StreamingMaxUnsignedLongWritesCorrectCharacters)
157*2f083884Ss.makeev_local {
158*2f083884Ss.makeev_local     MemoryOutStream stream;
159*2f083884Ss.makeev_local     stream << (unsigned long)ULONG_MAX;
160*2f083884Ss.makeev_local     CHECK_EQUAL(maxUnsignedIntegralStr(sizeof(unsigned long)), stream.GetText());
161*2f083884Ss.makeev_local }
162*2f083884Ss.makeev_local 
TEST(StreamingMinUnsignedLongWritesCorrectCharacters)163*2f083884Ss.makeev_local TEST(StreamingMinUnsignedLongWritesCorrectCharacters)
164*2f083884Ss.makeev_local {
165*2f083884Ss.makeev_local     MemoryOutStream stream;
166*2f083884Ss.makeev_local     stream << (unsigned long)0ul;
167*2f083884Ss.makeev_local     CHECK_EQUAL("0", stream.GetText());
168*2f083884Ss.makeev_local }
169*2f083884Ss.makeev_local 
TEST(StreamingLongLongWritesCorrectCharacters)170*2f083884Ss.makeev_local TEST(StreamingLongLongWritesCorrectCharacters)
171*2f083884Ss.makeev_local {
172*2f083884Ss.makeev_local 	MemoryOutStream stream;
173*2f083884Ss.makeev_local #ifdef UNITTEST_COMPILER_IS_MSVC6
174*2f083884Ss.makeev_local    stream << (__int64)-12345i64;
175*2f083884Ss.makeev_local #else
176*2f083884Ss.makeev_local 	stream << (long long)-12345ll;
177*2f083884Ss.makeev_local #endif
178*2f083884Ss.makeev_local    CHECK_EQUAL("-12345", stream.GetText());
179*2f083884Ss.makeev_local }
180*2f083884Ss.makeev_local 
181*2f083884Ss.makeev_local #ifdef LLONG_MAX
TEST(StreamingMaxLongLongWritesCorrectCharacters)182*2f083884Ss.makeev_local TEST(StreamingMaxLongLongWritesCorrectCharacters)
183*2f083884Ss.makeev_local {
184*2f083884Ss.makeev_local     MemoryOutStream stream;
185*2f083884Ss.makeev_local     stream << (long long)LLONG_MAX;
186*2f083884Ss.makeev_local     CHECK_EQUAL(maxSignedIntegralStr(sizeof(long long)), stream.GetText());
187*2f083884Ss.makeev_local }
188*2f083884Ss.makeev_local #endif
189*2f083884Ss.makeev_local 
190*2f083884Ss.makeev_local #ifdef LLONG_MIN
TEST(StreamingMinLongLongWritesCorrectCharacters)191*2f083884Ss.makeev_local TEST(StreamingMinLongLongWritesCorrectCharacters)
192*2f083884Ss.makeev_local {
193*2f083884Ss.makeev_local     MemoryOutStream stream;
194*2f083884Ss.makeev_local     stream << (long long)LLONG_MIN;
195*2f083884Ss.makeev_local     CHECK_EQUAL(minSignedIntegralStr(sizeof(long long)), stream.GetText());
196*2f083884Ss.makeev_local }
197*2f083884Ss.makeev_local #endif
198*2f083884Ss.makeev_local 
TEST(StreamingUnsignedLongLongWritesCorrectCharacters)199*2f083884Ss.makeev_local TEST(StreamingUnsignedLongLongWritesCorrectCharacters)
200*2f083884Ss.makeev_local {
201*2f083884Ss.makeev_local 	MemoryOutStream stream;
202*2f083884Ss.makeev_local #ifdef UNITTEST_COMPILER_IS_MSVC6
203*2f083884Ss.makeev_local    stream << (unsigned __int64)85899ui64;
204*2f083884Ss.makeev_local #else
205*2f083884Ss.makeev_local    stream << (unsigned long long)85899ull;
206*2f083884Ss.makeev_local #endif
207*2f083884Ss.makeev_local    CHECK_EQUAL("85899", stream.GetText());
208*2f083884Ss.makeev_local }
209*2f083884Ss.makeev_local 
210*2f083884Ss.makeev_local #ifdef ULLONG_MAX
TEST(StreamingMaxUnsignedLongLongWritesCorrectCharacters)211*2f083884Ss.makeev_local TEST(StreamingMaxUnsignedLongLongWritesCorrectCharacters)
212*2f083884Ss.makeev_local {
213*2f083884Ss.makeev_local     MemoryOutStream stream;
214*2f083884Ss.makeev_local     stream << (unsigned long long)ULLONG_MAX;
215*2f083884Ss.makeev_local     CHECK_EQUAL(maxUnsignedIntegralStr(sizeof(unsigned long long)), stream.GetText());
216*2f083884Ss.makeev_local }
217*2f083884Ss.makeev_local #endif
218*2f083884Ss.makeev_local 
TEST(StreamingMinUnsignedLongLongWritesCorrectCharacters)219*2f083884Ss.makeev_local TEST(StreamingMinUnsignedLongLongWritesCorrectCharacters)
220*2f083884Ss.makeev_local {
221*2f083884Ss.makeev_local     MemoryOutStream stream;
222*2f083884Ss.makeev_local #ifdef UNITTEST_COMPILER_IS_MSVC6
223*2f083884Ss.makeev_local     stream << (unsigned __int64)0ui64;
224*2f083884Ss.makeev_local #else
225*2f083884Ss.makeev_local     stream << (unsigned long long)0ull;
226*2f083884Ss.makeev_local #endif
227*2f083884Ss.makeev_local     CHECK_EQUAL("0", stream.GetText());
228*2f083884Ss.makeev_local }
229*2f083884Ss.makeev_local 
TEST(StreamingFloatWritesCorrectCharacters)230*2f083884Ss.makeev_local TEST(StreamingFloatWritesCorrectCharacters)
231*2f083884Ss.makeev_local {
232*2f083884Ss.makeev_local     MemoryOutStream stream;
233*2f083884Ss.makeev_local     stream << 3.1415f;
234*2f083884Ss.makeev_local 	CHECK(strstr(stream.GetText(), "3.1415"));
235*2f083884Ss.makeev_local }
236*2f083884Ss.makeev_local 
TEST(StreamingDoubleWritesCorrectCharacters)237*2f083884Ss.makeev_local TEST(StreamingDoubleWritesCorrectCharacters)
238*2f083884Ss.makeev_local {
239*2f083884Ss.makeev_local 	MemoryOutStream stream;
240*2f083884Ss.makeev_local 	stream << 3.1415;
241*2f083884Ss.makeev_local 	CHECK(strstr(stream.GetText(), "3.1415"));
242*2f083884Ss.makeev_local }
243*2f083884Ss.makeev_local 
TEST(StreamingPointerWritesCorrectCharacters)244*2f083884Ss.makeev_local TEST(StreamingPointerWritesCorrectCharacters)
245*2f083884Ss.makeev_local {
246*2f083884Ss.makeev_local     MemoryOutStream stream;
247*2f083884Ss.makeev_local     int* p = (int*)0x1234;
248*2f083884Ss.makeev_local     stream << p;
249*2f083884Ss.makeev_local     CHECK(strstr(stream.GetText(), "1234"));
250*2f083884Ss.makeev_local }
251*2f083884Ss.makeev_local 
TEST(StreamingSizeTWritesCorrectCharacters)252*2f083884Ss.makeev_local TEST(StreamingSizeTWritesCorrectCharacters)
253*2f083884Ss.makeev_local {
254*2f083884Ss.makeev_local     MemoryOutStream stream;
255*2f083884Ss.makeev_local     size_t const s = 53124;
256*2f083884Ss.makeev_local     stream << s;
257*2f083884Ss.makeev_local     CHECK_EQUAL("53124", stream.GetText());
258*2f083884Ss.makeev_local }
259*2f083884Ss.makeev_local 
TEST(ClearEmptiesMemoryOutStreamContents)260*2f083884Ss.makeev_local TEST(ClearEmptiesMemoryOutStreamContents)
261*2f083884Ss.makeev_local {
262*2f083884Ss.makeev_local 	MemoryOutStream stream;
263*2f083884Ss.makeev_local 	stream << "Hello world";
264*2f083884Ss.makeev_local 	stream.Clear();
265*2f083884Ss.makeev_local 	CHECK_EQUAL("", stream.GetText());
266*2f083884Ss.makeev_local }
267*2f083884Ss.makeev_local 
268*2f083884Ss.makeev_local #ifndef UNITTEST_MEMORYOUTSTREAM_IS_STD_OSTRINGSTREAM
269*2f083884Ss.makeev_local 
TEST(StreamInitialCapacityIsCorrect)270*2f083884Ss.makeev_local TEST(StreamInitialCapacityIsCorrect)
271*2f083884Ss.makeev_local {
272*2f083884Ss.makeev_local     MemoryOutStream stream(MemoryOutStream::GROW_CHUNK_SIZE);
273*2f083884Ss.makeev_local     CHECK_EQUAL((int)MemoryOutStream::GROW_CHUNK_SIZE, stream.GetCapacity());
274*2f083884Ss.makeev_local }
275*2f083884Ss.makeev_local 
TEST(StreamInitialCapacityIsMultipleOfGrowChunkSize)276*2f083884Ss.makeev_local TEST(StreamInitialCapacityIsMultipleOfGrowChunkSize)
277*2f083884Ss.makeev_local {
278*2f083884Ss.makeev_local     MemoryOutStream stream(MemoryOutStream::GROW_CHUNK_SIZE + 1);
279*2f083884Ss.makeev_local     CHECK_EQUAL((int)MemoryOutStream::GROW_CHUNK_SIZE * 2, stream.GetCapacity());
280*2f083884Ss.makeev_local }
281*2f083884Ss.makeev_local 
282*2f083884Ss.makeev_local 
TEST(ExceedingCapacityGrowsBuffer)283*2f083884Ss.makeev_local TEST(ExceedingCapacityGrowsBuffer)
284*2f083884Ss.makeev_local {
285*2f083884Ss.makeev_local     MemoryOutStream stream(MemoryOutStream::GROW_CHUNK_SIZE);
286*2f083884Ss.makeev_local     stream << "012345678901234567890123456789";
287*2f083884Ss.makeev_local     char const* const oldBuffer = stream.GetText();
288*2f083884Ss.makeev_local     stream << "0123456789";
289*2f083884Ss.makeev_local     CHECK(oldBuffer != stream.GetText());
290*2f083884Ss.makeev_local }
291*2f083884Ss.makeev_local 
TEST(ExceedingCapacityGrowsBufferByGrowChunk)292*2f083884Ss.makeev_local TEST(ExceedingCapacityGrowsBufferByGrowChunk)
293*2f083884Ss.makeev_local {
294*2f083884Ss.makeev_local     MemoryOutStream stream(MemoryOutStream::GROW_CHUNK_SIZE);
295*2f083884Ss.makeev_local     stream << "0123456789012345678901234567890123456789";
296*2f083884Ss.makeev_local     CHECK_EQUAL(MemoryOutStream::GROW_CHUNK_SIZE * 2, stream.GetCapacity());
297*2f083884Ss.makeev_local }
298*2f083884Ss.makeev_local 
TEST(WritingStringLongerThanCapacityFitsInNewBuffer)299*2f083884Ss.makeev_local TEST(WritingStringLongerThanCapacityFitsInNewBuffer)
300*2f083884Ss.makeev_local {
301*2f083884Ss.makeev_local     MemoryOutStream stream(8);
302*2f083884Ss.makeev_local     stream << "0123456789ABCDEF";
303*2f083884Ss.makeev_local     CHECK_EQUAL("0123456789ABCDEF", stream.GetText());
304*2f083884Ss.makeev_local }
305*2f083884Ss.makeev_local 
TEST(WritingIntLongerThanCapacityFitsInNewBuffer)306*2f083884Ss.makeev_local TEST(WritingIntLongerThanCapacityFitsInNewBuffer)
307*2f083884Ss.makeev_local {
308*2f083884Ss.makeev_local     MemoryOutStream stream(8);
309*2f083884Ss.makeev_local     stream << "aaaa" << 123456;
310*2f083884Ss.makeev_local     CHECK_EQUAL("aaaa123456", stream.GetText());
311*2f083884Ss.makeev_local }
312*2f083884Ss.makeev_local 
TEST(WritingFloatLongerThanCapacityFitsInNewBuffer)313*2f083884Ss.makeev_local TEST(WritingFloatLongerThanCapacityFitsInNewBuffer)
314*2f083884Ss.makeev_local {
315*2f083884Ss.makeev_local     MemoryOutStream stream(8);
316*2f083884Ss.makeev_local     stream << "aaaa" << 123456.0f;
317*2f083884Ss.makeev_local     CHECK_EQUAL("aaaa123456.000000", stream.GetText());
318*2f083884Ss.makeev_local }
319*2f083884Ss.makeev_local 
TEST(WritingSizeTLongerThanCapacityFitsInNewBuffer)320*2f083884Ss.makeev_local TEST(WritingSizeTLongerThanCapacityFitsInNewBuffer)
321*2f083884Ss.makeev_local {
322*2f083884Ss.makeev_local     MemoryOutStream stream(8);
323*2f083884Ss.makeev_local     stream << "aaaa" << size_t(32145);
324*2f083884Ss.makeev_local     CHECK_EQUAL("aaaa32145", stream.GetText());
325*2f083884Ss.makeev_local }
326*2f083884Ss.makeev_local 
TEST(VerifyLargeDoubleCanBeStreamedWithoutCrashing)327*2f083884Ss.makeev_local TEST(VerifyLargeDoubleCanBeStreamedWithoutCrashing)
328*2f083884Ss.makeev_local {
329*2f083884Ss.makeev_local     MemoryOutStream stream(8);
330*2f083884Ss.makeev_local     stream << DBL_MAX;
331*2f083884Ss.makeev_local     CHECK(true);
332*2f083884Ss.makeev_local }
333*2f083884Ss.makeev_local 
334*2f083884Ss.makeev_local #endif
335*2f083884Ss.makeev_local 
336*2f083884Ss.makeev_local }
337