From 070374dde0f53bff26078550997f7682e84412e5 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Tue, 10 Apr 2007 20:16:19 +0000 Subject: I did it, the streams don't start with an S now. --- src/unit/file.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/unit/file.cpp (limited to 'src/unit/file.cpp') diff --git a/src/unit/file.cpp b/src/unit/file.cpp new file mode 100644 index 0000000..a45b8d7 --- /dev/null +++ b/src/unit/file.cpp @@ -0,0 +1,105 @@ +#include "unitsuite.h" +#include "file.h" +#include "exceptions.h" + +#include +#include +#include + +class Unit : public Bu::UnitSuite +{ +public: + Unit() + { + setName("File"); + addTest( Unit::writeFull ); + addTest( Unit::readBlocks ); + addTest( Unit::readError1 ); + addTest( Unit::readError2 ); + } + + virtual ~Unit() { } + + // + // Tests go here + // + void writeFull() + { + Bu::File sf("testfile1", "wb"); + for( int c = 0; c < 256; c++ ) + { + unsigned char ch = (unsigned char)c; + sf.write( &ch, 1 ); + unitTest( sf.tell() == c+1 ); + } + //unitTest( sf.canRead() == false ); + //unitTest( sf.canWrite() == true ); + //unitTest( sf.canSeek() == true ); + sf.close(); + struct stat sdat; + stat("testfile1", &sdat ); + unitTest( sdat.st_size == 256 ); + } + + void readBlocks() + { + Bu::File sf("testfile1", "rb"); + unsigned char buf[50]; + size_t total = 0; + for(;;) + { + size_t s = sf.read( buf, 50 ); + for( size_t c = 0; c < s; c++ ) + { + unitTest( buf[c] == (unsigned char)(c+total) ); + } + total += s; + if( s < 50 ) + { + unitTest( total == 256 ); + unitTest( sf.isEOS() == true ); + break; + } + } + sf.close(); + } + + void readError1() + { + try + { + Bu::File sf("doesn'texist", "rb"); + unitFailed("No exception thrown"); + } + catch( Bu::FileException &e ) + { + return; + } + } + + void readError2() + { + Bu::File sf("testfile1", "rb"); + char buf[256]; + int r = sf.read( buf, 256 ); + unitTest( r == 256 ); + // You have to read past the end to set the EOS flag. + unitTest( sf.isEOS() == false ); + try + { + sf.read( buf, 5 ); + unitFailed("No exception thrown"); + } + catch( Bu::FileException &e ) + { + sf.close(); + return; + } + } +}; + +int main( int argc, char *argv[] ) +{ + return Unit().run( argc, argv ); +} + -- cgit v1.2.3 From 5ec9a131e12d021c42b46b601f5e79502485bebb Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Wed, 27 Jun 2007 15:42:50 +0000 Subject: The MemBuf works just fine, although it still can't over-write data in the buffer. --- build.conf | 9 --------- src/membuf.cpp | 30 +++++++++++++++++++++++++++++- src/membuf.h | 7 +++++++ src/unit/entities/unit | 30 ++++++++++++++++++++++++++++++ src/unit/file.cpp | 10 ++++++++-- src/unit/hash.cpp | 4 ++-- src/unit/membuf.cpp | 37 +++++++++++++++++++++++++++++++++++++ 7 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 src/unit/entities/unit create mode 100644 src/unit/membuf.cpp (limited to 'src/unit/file.cpp') diff --git a/build.conf b/build.conf index f493d67..d994977 100644 --- a/build.conf +++ b/build.conf @@ -41,15 +41,6 @@ filesIn("src/tests") filter regexp("^src/tests/(.*)\\.cpp$", "tests/{re:1}"): ["tests/itoqueue1", "tests/itoqueue2"]: set "LDFLAGS" += "-lpthread" -directoriesIn("src/unit","unit/"): - rule "exe", - target file, - group "tests", - requires "libbu++.a", - set "CXXFLAGS" += "-Isrc", - set "LDFLAGS" += "-L. -lbu++", - input filesIn("{fulldir}") filter regexp("^.*\\.cpp$") - filesIn("src/unit") filter regexp("^src/unit/(.*)\\.cpp$", "unit/{re:1}"): rule "exe", target file, diff --git a/src/membuf.cpp b/src/membuf.cpp index fdb4366..3c394b0 100644 --- a/src/membuf.cpp +++ b/src/membuf.cpp @@ -2,7 +2,8 @@ using namespace Bu; -Bu::MemBuf::MemBuf() +Bu::MemBuf::MemBuf() : + nPos( 0 ) { } @@ -16,35 +17,56 @@ void Bu::MemBuf::close() size_t Bu::MemBuf::read( void *pBuf, size_t nBytes ) { + if( (size_t)sBuf.getSize()-(size_t)nPos < nBytes ) + nBytes = sBuf.getSize()-nPos; + memcpy( pBuf, sBuf.getStr()+nPos, nBytes ); + nPos += nBytes; + + return nBytes; } size_t Bu::MemBuf::write( const void *pBuf, size_t nBytes ) { + sBuf.append( (const char *)pBuf, nBytes ); + nPos += nBytes; + return nBytes; } long Bu::MemBuf::tell() { + return nPos; } void Bu::MemBuf::seek( long offset ) { + nPos += offset; + if( nPos < 0 ) nPos = 0; + else if( nPos > sBuf.getSize() ) nPos = sBuf.getSize(); } void Bu::MemBuf::setPos( long pos ) { + nPos = pos; + if( nPos < 0 ) nPos = 0; + else if( nPos > sBuf.getSize() ) nPos = sBuf.getSize(); } void Bu::MemBuf::setPosEnd( long pos ) { + nPos = sBuf.getSize()-pos; + if( nPos < 0 ) nPos = 0; + else if( nPos > sBuf.getSize() ) nPos = sBuf.getSize(); } bool Bu::MemBuf::isEOS() { + return (nPos == sBuf.getSize()); } bool Bu::MemBuf::isOpen() { + return true; } void Bu::MemBuf::flush() @@ -53,26 +75,32 @@ void Bu::MemBuf::flush() bool Bu::MemBuf::canRead() { + return !isEOS(); } bool Bu::MemBuf::canWrite() { + return isEOS(); } bool Bu::MemBuf::isReadable() { + return true; } bool Bu::MemBuf::isWritable() { + return true; } bool Bu::MemBuf::isSeekable() { + return true; } bool Bu::MemBuf::isBlocking() { + return true; } void Bu::MemBuf::setBlocking( bool bBlocking ) diff --git a/src/membuf.h b/src/membuf.h index 2cbbbdc..877b35e 100644 --- a/src/membuf.h +++ b/src/membuf.h @@ -4,6 +4,7 @@ #include #include "bu/stream.h" +#include "bu/fstring.h" namespace Bu { @@ -18,6 +19,12 @@ namespace Bu virtual void close(); virtual size_t read( void *pBuf, size_t nBytes ); + + /** + *@todo Allow writes at the current position, not just appending to + * the current buffer. This is a silly way to do it, but it covers all + * of our bases for now. + */ virtual size_t write( const void *pBuf, size_t nBytes ); virtual long tell(); virtual void seek( long offset ); diff --git a/src/unit/entities/unit b/src/unit/entities/unit new file mode 100644 index 0000000..28db45f --- /dev/null +++ b/src/unit/entities/unit @@ -0,0 +1,30 @@ + + + + #include "bu/unitsuite.h" + +class Unit : public Bu::UnitSuite +{ +public: + Unit() + { + setName("{=name}"); + addTest( Unit::test01 ); + } + + virtual ~Unit() + { + } + + void test01() + { + unitTest( 0 == 5 ); + } +}; + +int main( int argc, char *argv[] ){ return Unit().run( argc, argv ); } + + diff --git a/src/unit/file.cpp b/src/unit/file.cpp index a45b8d7..1eaaf36 100644 --- a/src/unit/file.cpp +++ b/src/unit/file.cpp @@ -87,8 +87,14 @@ public: unitTest( sf.isEOS() == false ); try { - sf.read( buf, 5 ); - unitFailed("No exception thrown"); + if( sf.read( buf, 5 ) > 0 ) + { + unitFailed("Non-zero read result"); + } + else + { + sf.close(); + } } catch( Bu::FileException &e ) { diff --git a/src/unit/hash.cpp b/src/unit/hash.cpp index 588e687..9ea933f 100644 --- a/src/unit/hash.cpp +++ b/src/unit/hash.cpp @@ -1,6 +1,6 @@ #include "bu/fstring.h" #include "bu/hash.h" -#include "unitsuite.h" +#include "bu/unitsuite.h" #include @@ -23,7 +23,7 @@ public: { StrIntHash h; char buf[20]; - for(int i=0;i<10000;i++) + for(int i=1;i<10000;i++) { sprintf(buf,"%d",i); Bu::FString sTmp(buf); diff --git a/src/unit/membuf.cpp b/src/unit/membuf.cpp new file mode 100644 index 0000000..65ba82a --- /dev/null +++ b/src/unit/membuf.cpp @@ -0,0 +1,37 @@ +#include "bu/unitsuite.h" +#include "bu/membuf.h" + +class Unit : public Bu::UnitSuite +{ +public: + Unit() + { + setName("MemBuf"); + addTest( Unit::testWriteRead01 ); + } + + virtual ~Unit() + { + } + + void testWriteRead01() + { + Bu::MemBuf mb; + unitTest( mb.write("ab", 2 ) == 2 ); + unitTest( mb.write("cde", 3 ) == 3 ); + unitTest( mb.write("FG", 2 ) == 2 ); + + mb.setPos( 0 ); + + char buf[8]; + buf[7] = '\0'; + unitTest( mb.read( buf, 7 ) == 7 ); + unitTest( !strncmp( buf, "abcdeFG", 7 ) ); + unitTest( mb.read( buf, 7 ) == 0 ); + mb.seek( -3 ); + unitTest( mb.read( buf, 7 ) == 3 ); + unitTest( !strncmp( buf, "eFG", 3 ) ); + } +}; + +int main( int argc, char *argv[] ){ return Unit().run( argc, argv ); } -- cgit v1.2.3