1 #include "../include/crtest.h"
2 #include "../include/lvtinydom.h"
3 #include "../include/chmfmt.h"
4
5 #ifdef _DEBUG
6
7 class LVCompareTestStream : public LVNamedStream
8 {
9 protected:
10 LVStreamRef m_base_stream1;
11 LVStreamRef m_base_stream2;
12 public:
GetName()13 virtual const lChar32 * GetName()
14 {
15 static lChar32 buf[1024];
16 lString32 res1 = m_base_stream1->GetName();
17 lString32 res2 = m_base_stream2->GetName();
18 MYASSERT( res1==res2, "getName, res");
19 lStr_cpy( buf, res1.c_str());
20 return buf;
21 }
GetMode()22 virtual lvopen_mode_t GetMode()
23 {
24 lvopen_mode_t res1 = m_base_stream1->GetMode();
25 lvopen_mode_t res2 = m_base_stream2->GetMode();
26 MYASSERT( res1==res2, "getMode, res");
27 return res1;
28 }
Seek(lvoffset_t offset,lvseek_origin_t origin,lvpos_t * pNewPos)29 virtual lverror_t Seek( lvoffset_t offset, lvseek_origin_t origin, lvpos_t * pNewPos )
30 {
31 lvsize_t bw1 = 0;
32 lvsize_t bw2 = 0;
33 lverror_t res1 = m_base_stream1->Seek(offset, origin, &bw1);
34 lverror_t res2 = m_base_stream2->Seek(offset, origin, &bw2);
35 MYASSERT( res1==res2, "seek, res");
36 if ( bw1!=bw2 ) {
37 CRLog::error("Result position after Seek(%d, %x) doesn't match: %x / %x getpos1=%x, getpos2=%x",
38 (int)origin, (int)offset,
39 (int)bw1, (int)bw2,
40 (int)m_base_stream1->GetPos(), (int)m_base_stream2->GetPos() );
41 res1 = m_base_stream1->Seek(offset, origin, &bw1);
42 res2 = m_base_stream2->Seek(offset, origin, &bw2);
43 }
44 MYASSERT( bw1==bw2, "seek, bw");
45 MYASSERT( m_base_stream1->GetPos()==m_base_stream2->GetPos(), "seek, pos");
46 MYASSERT( m_base_stream1->Eof()==m_base_stream2->Eof(), "seek, eof");
47 if ( pNewPos )
48 *pNewPos = bw1;
49 return res1;
50 }
Tell(lvpos_t * pPos)51 virtual lverror_t Tell( lvpos_t * pPos )
52 {
53 lvsize_t bw1 = 0;
54 lvsize_t bw2 = 0;
55 lverror_t res1 = m_base_stream1->Tell(&bw1);
56 lverror_t res2 = m_base_stream2->Tell(&bw2);
57 MYASSERT( res1==res2, "tell, res");
58 MYASSERT( bw1==bw2, "tell, bw");
59 *pPos = bw1;
60 return res1;
61 }
62 //virtual lverror_t SetPos(lvpos_t p)
SetPos(lvpos_t p)63 virtual lvpos_t SetPos(lvpos_t p)
64 {
65 lvpos_t res1 = m_base_stream1->SetPos(p);
66 lvpos_t res2 = m_base_stream2->SetPos(p);
67 MYASSERT( res1==res2, "setPos, res");
68 MYASSERT( m_base_stream1->GetPos()==m_base_stream2->GetPos(), "setpos, pos");
69 bool eof1 = m_base_stream1->Eof();
70 bool eof2 = m_base_stream2->Eof();
71 if ( eof1!=eof2 ) {
72 CRLog::error("EOF after SetPos(%x) don't match: %x / %x getpos1=%x, getpos2=%x, size1=%x, size2=%x",
73 (int)p,
74 (int)eof1, (int)eof2,
75 (int)m_base_stream1->GetPos(), (int)m_base_stream2->GetPos(),
76 (int)m_base_stream1->GetSize(), (int)m_base_stream2->GetSize()
77 );
78 }
79 MYASSERT( eof1==eof2, "setpos, eof");
80 return res1;
81 }
GetPos()82 virtual lvpos_t GetPos()
83 {
84 lvpos_t res1 = m_base_stream1->GetPos();
85 lvpos_t res2 = m_base_stream2->GetPos();
86 MYASSERT( res1==res2, "getPos, res");
87 return res1;
88 }
SetSize(lvsize_t size)89 virtual lverror_t SetSize( lvsize_t size )
90 {
91 lverror_t res1 = m_base_stream1->SetSize(size);
92 lverror_t res2 = m_base_stream2->SetSize(size);
93 MYASSERT( res1==res2, "setSize, res");
94 return res1;
95 }
Read(void * buf,lvsize_t count,lvsize_t * nBytesRead)96 virtual lverror_t Read( void * buf, lvsize_t count, lvsize_t * nBytesRead )
97 {
98 lvsize_t bw1 = 0;
99 lvsize_t bw2 = 0;
100 lUInt8 * buf1 = (lUInt8 *)buf;
101 lUInt8 * buf2 = new lUInt8[count];
102 memcpy( buf2, buf, count );
103 lverror_t res1 = m_base_stream1->Read(buf, count, &bw1);
104 lverror_t res2 = m_base_stream2->Read(buf2, count, &bw2);
105 MYASSERT( res1==res2, "read, res");
106 if ( bw1!=bw2 ) {
107 CRLog::error("BytesRead after Read(%d) don't match: %x / %x getpos1=%x, getpos2=%x getsize1=%x, getsize2=%x",
108 (int)count,
109 (int)bw1, (int)bw2,
110 (int)m_base_stream1->GetPos(), (int)m_base_stream2->GetPos(),
111 (int)m_base_stream1->GetSize(), (int)m_base_stream2->GetSize()
112 );
113 }
114 MYASSERT( bw1==bw2, "read, bw");
115 MYASSERT( m_base_stream1->GetPos()==m_base_stream2->GetPos(), "read, pos");
116 bool eof1 = m_base_stream1->Eof();
117 bool eof2 = m_base_stream2->Eof();
118 if ( eof1!=eof2 ) {
119 CRLog::error("EOF after Read(%d) don't match: %x / %x getpos1=%x, getpos2=%x, size1=%x, size2=%x",
120 (int)count,
121 (int)eof1, (int)eof2,
122 (int)m_base_stream1->GetPos(), (int)m_base_stream2->GetPos(),
123 (int)m_base_stream1->GetSize(), (int)m_base_stream2->GetSize()
124 );
125 }
126 MYASSERT( eof1==eof2, "read, eof");
127 for ( unsigned i=0; i<count; i++ ) {
128 if ( buf1[i]!=buf2[i] ) {
129 CRLog::error("read, different data by offset %x", i);
130 MYASSERT( 0, "read, equal data");
131 }
132 }
133 if ( nBytesRead )
134 *nBytesRead = bw1;
135 delete[] buf2;
136 return res1;
137 }
Write(const void * buf,lvsize_t count,lvsize_t * nBytesWritten)138 virtual lverror_t Write( const void * buf, lvsize_t count, lvsize_t * nBytesWritten )
139 {
140 lvsize_t bw1 = 0;
141 lvsize_t bw2 = 0;
142 lverror_t res1 = m_base_stream1->Write(buf, count, &bw1);
143 lverror_t res2 = m_base_stream2->Write(buf, count, &bw2);
144 MYASSERT( res1==res2, "write, res");
145 MYASSERT( bw1==bw2, "write, bw");
146 MYASSERT( m_base_stream1->GetPos()==m_base_stream2->GetPos(), "write, pos");
147 MYASSERT( m_base_stream1->Eof()==m_base_stream2->Eof(), "write, eof");
148 if ( nBytesWritten )
149 *nBytesWritten = bw1;
150 return res1;
151 }
Eof()152 virtual bool Eof()
153 {
154 bool res1 = m_base_stream1->Eof();
155 bool res2 = m_base_stream2->Eof();
156 if ( res1!=res2 ) {
157 CRLog::trace("EOF doesn't match");
158 }
159 MYASSERT( res1==res2, "EOF" );
160 return res1;
161 }
LVCompareTestStream(LVStreamRef stream1,LVStreamRef stream2)162 LVCompareTestStream( LVStreamRef stream1, LVStreamRef stream2 ) : m_base_stream1(stream1), m_base_stream2(stream2) { }
~LVCompareTestStream()163 ~LVCompareTestStream() { }
164 };
165
LVCreateCompareTestStream(LVStreamRef stream1,LVStreamRef stream2)166 LVStreamRef LVCreateCompareTestStream( LVStreamRef stream1, LVStreamRef stream2 )
167 {
168 return LVStreamRef( new LVCompareTestStream(stream1, stream2) );
169 }
170 #endif
171
172 // external tests declarations
173 void testTxtSelector();
174
175
runCRUnitTests()176 void runCRUnitTests()
177 {
178 #if 0 && defined(_DEBUG)
179 //runCHMUnitTest();
180 runTinyDomUnitTests();
181 testTxtSelector();
182 #endif
183 }
184