: wxInputStream(),
m_options(in.m_options),
m_pos(in.m_pos),
- m_size(in.m_size)
+ m_size(in.m_size),
+ m_eoftype(in.m_eoftype)
{
m_data = new char[m_size];
memcpy(m_data, in.m_data, m_size);
{
if (!IsOk() || !size)
return 0;
- if (m_size <= m_pos) {
- m_lasterror = wxSTREAM_EOF;
- return 0;
+
+ size_t count;
+
+ if (m_pos >= m_size)
+ count = 0;
+ else if (m_size - m_pos < size)
+ count = m_size - m_pos;
+ else
+ count = size;
+
+ if (count) {
+ memcpy(buffer, m_data + m_pos, count);
+ m_pos += count;
}
- if (m_size - m_pos < size)
- size = m_size - m_pos;
- memcpy(buffer, m_data + m_pos, size);
- m_pos += size;
- return size;
+ if (((m_eoftype & AtLast) != 0 && m_pos >= m_size) || count < size)
+ if ((m_eoftype & WithError) != 0)
+ m_lasterror = wxSTREAM_READ_ERROR;
+ else
+ m_lasterror = wxSTREAM_EOF;
+
+ return count;
}
template <class ClassFactoryT>
ArchiveTestCase<ClassFactoryT>::ArchiveTestCase(
string name,
- int id,
ClassFactoryT *factory,
int options,
const wxString& archiver,
const wxString& unarchiver)
:
- CppUnit::TestCase(name),
+ CppUnit::TestCase(TestId::MakeId() + name),
m_factory(factory),
m_options(options),
m_timeStamp(1, wxDateTime::Mar, 2004, 12, 0),
- m_id(id),
+ m_id(TestId::GetId()),
m_archiver(archiver),
m_unarchiver(unarchiver)
{
// check archive could be created
CPPUNIT_ASSERT(out.GetLength() > 0);
- TestInputStream in(out);
+ TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3));
TestIterator(in);
in.Rewind();
const TestEntry& testEntry = *it->second;
-#ifndef __WXMSW__
+#if 0 //ndef __WXMSW__
CPPUNIT_ASSERT_MESSAGE("timestamp check" + error_context,
testEntry.GetDateTime() ==
wxFileName(path).GetModificationTime());
}
+///////////////////////////////////////////////////////////////////////////////
+// Make the ids
+
+int TestId::m_seed = 6219;
+
+// static
+string TestId::MakeId()
+{
+ m_seed = (m_seed * 171) % 30269;
+ return wxString::Format(_T("%-6d"), m_seed).mb_str();
+}
+
+
///////////////////////////////////////////////////////////////////////////////
// Suite base
ArchiveTestSuite::ArchiveTestSuite(string name)
: CppUnit::TestSuite("archive/" + name),
- m_id(0),
m_name(name.c_str(), *wxConvCurrent)
{
m_name = _T("wx") + m_name.Left(1).Upper() + m_name.Mid(1).Lower();
string descr = Description(m_name, options,
generic != 0, *j, *i);
- CppUnit::Test *test = makeTest(descr, m_id, options,
+ CppUnit::Test *test = makeTest(descr, options,
generic != 0, *j, *i);
- if (test) {
+ if (test)
addTest(test);
- m_id++;
- }
}
return this;
CppUnit::Test *ArchiveTestSuite::makeTest(
string WXUNUSED(descr),
- int WXUNUSED(id),
int WXUNUSED(options),
bool WXUNUSED(genericInterface),
const wxString& WXUNUSED(archiver),
const wxString& unarchiver)
{
wxString descr;
- descr << m_id << _T(" ");
if (genericInterface)
descr << _T("wxArchive (") << type << _T(")");
class TestInputStream : public wxInputStream
{
public:
+ // various streams have implemented eof differently, so check the archive
+ // stream works with all the possibilities (bit flags that can be ORed)
+ enum EofTypes {
+ AtLast = 0x01, // eof before an attempt to read past the last byte
+ WithError = 0x02 // give an error instead of eof
+ };
+
// ctor takes the data from the output stream, which is then empty
- TestInputStream(TestOutputStream& out) : m_data(NULL) { SetData(out); }
+ TestInputStream(TestOutputStream& out, int eoftype)
+ : m_data(NULL), m_eoftype(eoftype) { SetData(out); }
// this ctor 'dups'
TestInputStream(const TestInputStream& in);
~TestInputStream() { delete [] m_data; }
size_t m_pos;
size_t m_size;
char *m_data;
+ int m_eoftype;
};
{
public:
ArchiveTestCase(std::string name,
- int id,
ClassFactoryT *factory,
int options,
const wxString& archiver = wxEmptyString,
};
+///////////////////////////////////////////////////////////////////////////////
+// Make ids
+
+class TestId
+{
+public:
+ // make a new id and return it as a string
+ static std::string MakeId();
+ // get the current id
+ static int GetId() { return m_seed; }
+private:
+ // seed for generating the ids
+ static int m_seed;
+};
+
+
///////////////////////////////////////////////////////////////////////////////
// Base class for the archive test suites
ArchiveTestSuite(std::string name);
protected:
- int m_id;
-
virtual ArchiveTestSuite *makeSuite();
virtual CppUnit::Test *makeTest(std::string descr,
- int id,
int options,
bool genericInterface,
const wxString& archiver,
{
public:
ZipTestCase(string name,
- int id,
int options,
const wxString& archiver = wxEmptyString,
const wxString& unarchiver = wxEmptyString)
:
- ArchiveTestCase<wxZipClassFactory>(name, id, new wxZipClassFactory,
+ ArchiveTestCase<wxZipClassFactory>(name, new wxZipClassFactory,
options, archiver, unarchiver),
m_count(0)
{ }
{
public:
ZipPipeTestCase(string name, int options) :
- CppUnit::TestCase(name), m_options(options) { }
+ CppUnit::TestCase(TestId::MakeId() + name),
+ m_options(options),
+ m_id(TestId::GetId())
+ { }
protected:
void runTest();
int m_options;
+ int m_id;
};
void ZipPipeTestCase::runTest()
out.Write(in);
}
- TestInputStream in(out);
+ TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3));
wxZipInputStream zip(in);
auto_ptr<wxZipEntry> entry(zip.GetNextEntry());
protected:
ArchiveTestSuite *makeSuite();
- CppUnit::Test *makeTest(string descr, int id, int options,
+ CppUnit::Test *makeTest(string descr, int options,
bool genericInterface, const wxString& archiver,
const wxString& unarchiver);
};
string name = Description(_T("ZipPipeTestCase"), options,
false, _T(""), _T("zip -q - -"));
addTest(new ZipPipeTestCase(name, options));
- m_id++;
}
#endif
CppUnit::Test *ziptest::makeTest(
string descr,
- int id,
int options,
bool genericInterface,
const wxString& archiver,
if (genericInterface)
return new ArchiveTestCase<wxArchiveClassFactory>(
- descr, id, new wxZipClassFactory,
+ descr, new wxZipClassFactory,
options, archiver, unarchiver);
else
- return new ZipTestCase(descr, id, options, archiver, unarchiver);
+ return new ZipTestCase(descr, options, archiver, unarchiver);
}
CPPUNIT_TEST_SUITE_REGISTRATION(ziptest);