In the past some streams returned Eof() before the end was read past rather

after, and also some streams give an error instead of Eof(). Test the archive
streams work with parent streams that have any of these behaviours.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36429 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Michael Wetherell 2005-12-18 13:58:55 +00:00
parent abffc1ff5d
commit 716e748b2f
3 changed files with 77 additions and 35 deletions

View File

@ -196,7 +196,8 @@ TestInputStream::TestInputStream(const TestInputStream& in)
: 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);
@ -251,16 +252,28 @@ size_t TestInputStream::OnSysRead(void *buffer, size_t 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;
}
@ -424,17 +437,16 @@ PFileOutputStream::~PFileOutputStream()
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)
{
@ -464,7 +476,7 @@ void ArchiveTestCase<ClassFactoryT>::runTest()
// 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();
@ -929,7 +941,7 @@ void ArchiveTestCase<ClassFactoryT>::VerifyDir(wxString& path,
const TestEntry& testEntry = *it->second;
#ifndef __WXMSW__
#if 0 //ndef __WXMSW__
CPPUNIT_ASSERT_MESSAGE("timestamp check" + error_context,
testEntry.GetDateTime() ==
wxFileName(path).GetModificationTime());
@ -1156,12 +1168,24 @@ void ArchiveTestCase<ClassFactoryT>::OnSetNotifier(EntryT& entry)
}
///////////////////////////////////////////////////////////////////////////////
// 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();
@ -1209,13 +1233,11 @@ ArchiveTestSuite *ArchiveTestSuite::makeSuite()
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;
@ -1223,7 +1245,6 @@ ArchiveTestSuite *ArchiveTestSuite::makeSuite()
CppUnit::Test *ArchiveTestSuite::makeTest(
string WXUNUSED(descr),
int WXUNUSED(id),
int WXUNUSED(options),
bool WXUNUSED(genericInterface),
const wxString& WXUNUSED(archiver),
@ -1241,7 +1262,6 @@ string ArchiveTestSuite::Description(const wxString& type,
const wxString& unarchiver)
{
wxString descr;
descr << m_id << _T(" ");
if (genericInterface)
descr << _T("wxArchive (") << type << _T(")");

View File

@ -60,8 +60,16 @@ private:
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; }
@ -80,6 +88,7 @@ private:
size_t m_pos;
size_t m_size;
char *m_data;
int m_eoftype;
};
@ -137,7 +146,6 @@ class ArchiveTestCase : public CppUnit::TestCase
{
public:
ArchiveTestCase(std::string name,
int id,
ClassFactoryT *factory,
int options,
const wxString& archiver = wxEmptyString,
@ -209,6 +217,22 @@ protected:
};
///////////////////////////////////////////////////////////////////////////////
// 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
@ -218,12 +242,9 @@ public:
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,

View File

@ -34,12 +34,11 @@ class ZipTestCase : public ArchiveTestCase<wxZipClassFactory>
{
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)
{ }
@ -161,11 +160,15 @@ class ZipPipeTestCase : public CppUnit::TestCase
{
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()
@ -181,7 +184,7 @@ 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());
@ -214,7 +217,7 @@ public:
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);
};
@ -237,7 +240,6 @@ ArchiveTestSuite *ziptest::makeSuite()
string name = Description(_T("ZipPipeTestCase"), options,
false, _T(""), _T("zip -q - -"));
addTest(new ZipPipeTestCase(name, options));
m_id++;
}
#endif
@ -246,7 +248,6 @@ ArchiveTestSuite *ziptest::makeSuite()
CppUnit::Test *ziptest::makeTest(
string descr,
int id,
int options,
bool genericInterface,
const wxString& archiver,
@ -258,10 +259,10 @@ CppUnit::Test *ziptest::makeTest(
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);