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