diff options
| -rw-r--r-- | build.conf | 16 | ||||
| -rw-r--r-- | src/fstring.h | 24 | ||||
| -rw-r--r-- | src/ssocket.cpp | 4 | ||||
| -rw-r--r-- | src/unit/fstring.cpp | 28 | ||||
| -rw-r--r-- | src/unit/sfile.cpp | 27 | ||||
| -rw-r--r-- | src/unitsuite.cpp | 67 | ||||
| -rw-r--r-- | src/unitsuite.h | 60 |
7 files changed, 224 insertions, 2 deletions
| @@ -30,6 +30,22 @@ filesIn("src/tests") filter regexp("^src/tests/(.*)\\.cpp$", "tests/{re:1}"): | |||
| 30 | set "LDFLAGS" += "-L. -lbu++", | 30 | set "LDFLAGS" += "-L. -lbu++", |
| 31 | input "src/{target}.cpp" | 31 | input "src/{target}.cpp" |
| 32 | 32 | ||
| 33 | directoriesIn("src/unit","unit/"): | ||
| 34 | rule "exe", | ||
| 35 | target file, | ||
| 36 | requires "libbu++.a", | ||
| 37 | set "CXXFLAGS" += "-Isrc", | ||
| 38 | set "LDFLAGS" += "-L. -lbu++", | ||
| 39 | input filesIn("{fulldir}") filter regexp("^.*\\.cpp$") | ||
| 40 | |||
| 41 | filesIn("src/unit") filter regexp("^src/unit/(.*)\\.cpp$", "unit/{re:1}"): | ||
| 42 | rule "exe", | ||
| 43 | target file, | ||
| 44 | requires "libbu++.a", | ||
| 45 | set "CXXFLAGS" += "-Isrc", | ||
| 46 | set "LDFLAGS" += "-L. -lbu++", | ||
| 47 | input "src/{target}.cpp" | ||
| 48 | |||
| 33 | "tests/plugin": set "LDFLAGS" += "-ldl" | 49 | "tests/plugin": set "LDFLAGS" += "-ldl" |
| 34 | 50 | ||
| 35 | rule "exe": | 51 | rule "exe": |
diff --git a/src/fstring.h b/src/fstring.h index 0184301..751beb8 100644 --- a/src/fstring.h +++ b/src/fstring.h | |||
| @@ -364,6 +364,30 @@ namespace Bu | |||
| 364 | } | 364 | } |
| 365 | } | 365 | } |
| 366 | 366 | ||
| 367 | long find( const char *sText ) | ||
| 368 | { | ||
| 369 | long nTLen = strlen( sText ); | ||
| 370 | flatten(); | ||
| 371 | for( long j = 0; j < pFirst->nLength-nTLen; j++ ) | ||
| 372 | { | ||
| 373 | if( !strncmp( sText, pFirst->pData+j, nTLen ) ) | ||
| 374 | return j; | ||
| 375 | } | ||
| 376 | return -1; | ||
| 377 | } | ||
| 378 | |||
| 379 | long rfind( const char *sText ) | ||
| 380 | { | ||
| 381 | long nTLen = strlen( sText ); | ||
| 382 | flatten(); | ||
| 383 | for( long j = pFirst->nLength-nTLen-1; j >= 0; j-- ) | ||
| 384 | { | ||
| 385 | if( !strncmp( sText, pFirst->pData+j, nTLen ) ) | ||
| 386 | return j; | ||
| 387 | } | ||
| 388 | return -1; | ||
| 389 | } | ||
| 390 | |||
| 367 | void archive( class Archive &ar ) | 391 | void archive( class Archive &ar ) |
| 368 | { | 392 | { |
| 369 | if( ar.isLoading() ) | 393 | if( ar.isLoading() ) |
diff --git a/src/ssocket.cpp b/src/ssocket.cpp index bdaac24..85a2da0 100644 --- a/src/ssocket.cpp +++ b/src/ssocket.cpp | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | #include "ssocket.h" | 1 | #include "ssocket.h" |
| 2 | 2 | ||
| 3 | SSocket::SSocket() | 3 | Bu::SSocket::SSocket() |
| 4 | { | 4 | { |
| 5 | } | 5 | } |
| 6 | 6 | ||
| 7 | SSocket::~SSocket() | 7 | Bu::SSocket::~SSocket() |
| 8 | { | 8 | { |
| 9 | } | 9 | } |
diff --git a/src/unit/fstring.cpp b/src/unit/fstring.cpp new file mode 100644 index 0000000..72755eb --- /dev/null +++ b/src/unit/fstring.cpp | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | #include "fstring.h" | ||
| 2 | #include "unitsuite.h" | ||
| 3 | |||
| 4 | class Unit : public Bu::UnitSuite | ||
| 5 | { | ||
| 6 | public: | ||
| 7 | Unit() | ||
| 8 | { | ||
| 9 | setName("FString"); | ||
| 10 | addTest( Unit::test1 ); | ||
| 11 | } | ||
| 12 | |||
| 13 | virtual ~Unit() | ||
| 14 | { | ||
| 15 | } | ||
| 16 | |||
| 17 | void test1() | ||
| 18 | { | ||
| 19 | unitTest( 1 == 1 ); | ||
| 20 | unitTest( 1 == 0 ); | ||
| 21 | } | ||
| 22 | }; | ||
| 23 | |||
| 24 | int main( int argc, char *argv[] ) | ||
| 25 | { | ||
| 26 | return Unit().run( argc, argv ); | ||
| 27 | } | ||
| 28 | |||
diff --git a/src/unit/sfile.cpp b/src/unit/sfile.cpp new file mode 100644 index 0000000..7b19942 --- /dev/null +++ b/src/unit/sfile.cpp | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | #include "unitsuite.h" | ||
| 2 | |||
| 3 | class Unit : public Bu::UnitSuite | ||
| 4 | { | ||
| 5 | public: | ||
| 6 | Unit() | ||
| 7 | { | ||
| 8 | setName("SFile"); | ||
| 9 | addTest( Unit::test ); | ||
| 10 | } | ||
| 11 | |||
| 12 | virtual ~Unit() { } | ||
| 13 | |||
| 14 | // | ||
| 15 | // Tests go here | ||
| 16 | // | ||
| 17 | void test() | ||
| 18 | { | ||
| 19 | unitTest( 1 == 1 ); | ||
| 20 | } | ||
| 21 | }; | ||
| 22 | |||
| 23 | int main( int argc, char *argv[] ) | ||
| 24 | { | ||
| 25 | return Unit().run( argc, argv ); | ||
| 26 | } | ||
| 27 | |||
diff --git a/src/unitsuite.cpp b/src/unitsuite.cpp new file mode 100644 index 0000000..2a28eb5 --- /dev/null +++ b/src/unitsuite.cpp | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | #include "unitsuite.h" | ||
| 2 | |||
| 3 | Bu::UnitSuite::UnitSuite() | ||
| 4 | { | ||
| 5 | } | ||
| 6 | |||
| 7 | Bu::UnitSuite::~UnitSuite() | ||
| 8 | { | ||
| 9 | } | ||
| 10 | |||
| 11 | int Bu::UnitSuite::run( int argc, char *argv[] ) | ||
| 12 | { | ||
| 13 | for( TestList::iterator i = lTests.begin(); i != lTests.end(); i++ ) | ||
| 14 | { | ||
| 15 | printf("%s: ", i->sName.getStr() ); | ||
| 16 | fflush( stdout ); | ||
| 17 | try | ||
| 18 | { | ||
| 19 | (this->*(i->fTest))(); | ||
| 20 | printf("passed.\n"); | ||
| 21 | } | ||
| 22 | catch( Failed &e ) | ||
| 23 | { | ||
| 24 | if( e.bFile ) | ||
| 25 | { | ||
| 26 | printf("unitTest(%s) failed. (%s:%d)\n", | ||
| 27 | e.str.getStr(), | ||
| 28 | e.sFile.getStr(), | ||
| 29 | e.nLine | ||
| 30 | ); | ||
| 31 | } | ||
| 32 | else | ||
| 33 | { | ||
| 34 | printf("unitTest(%s) failed.\n", | ||
| 35 | e.str.getStr() | ||
| 36 | ); | ||
| 37 | } | ||
| 38 | } | ||
| 39 | catch( ... ) | ||
| 40 | { | ||
| 41 | printf("failed with external exception.\n"); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | return 0; | ||
| 46 | } | ||
| 47 | |||
| 48 | void Bu::UnitSuite::add( Test fTest, Bu::FString sName ) | ||
| 49 | { | ||
| 50 | TestInfo ti; | ||
| 51 | ti.sName = sName; | ||
| 52 | long index = ti.sName.rfind("::"); | ||
| 53 | if( index != -1 ) | ||
| 54 | { | ||
| 55 | FString tmp = sSuiteName; | ||
| 56 | tmp += ti.sName.getStr()+index; | ||
| 57 | ti.sName = tmp; | ||
| 58 | } | ||
| 59 | ti.fTest = fTest; | ||
| 60 | lTests.push_back( ti ); | ||
| 61 | } | ||
| 62 | |||
| 63 | void Bu::UnitSuite::setName( const FString &sName ) | ||
| 64 | { | ||
| 65 | sSuiteName = sName; | ||
| 66 | } | ||
| 67 | |||
diff --git a/src/unitsuite.h b/src/unitsuite.h new file mode 100644 index 0000000..3502a1b --- /dev/null +++ b/src/unitsuite.h | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | #ifndef UNIT_SUITE_H | ||
| 2 | #define UNIT_SUITE_H | ||
| 3 | |||
| 4 | #include <stdint.h> | ||
| 5 | #include <list> | ||
| 6 | #include "fstring.h" | ||
| 7 | |||
| 8 | namespace Bu | ||
| 9 | { | ||
| 10 | /** | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | class UnitSuite | ||
| 14 | { | ||
| 15 | public: | ||
| 16 | UnitSuite(); | ||
| 17 | virtual ~UnitSuite(); | ||
| 18 | |||
| 19 | int run( int argc=0, char *argv[]=NULL ); | ||
| 20 | |||
| 21 | typedef void (UnitSuite::*Test)(); | ||
| 22 | |||
| 23 | class Failed | ||
| 24 | { | ||
| 25 | public: | ||
| 26 | Failed() : str(""), bFile( false ) { } | ||
| 27 | Failed( const FString &s ) : str( s ), bFile( false ) { } | ||
| 28 | Failed( const FString &s, const FString &sFile, int nLine ) : | ||
| 29 | str( s ), sFile( sFile ), nLine( nLine ), bFile( true ) { } | ||
| 30 | |||
| 31 | FString str; | ||
| 32 | FString sFile; | ||
| 33 | int nLine; | ||
| 34 | bool bFile; | ||
| 35 | }; | ||
| 36 | |||
| 37 | protected: | ||
| 38 | void add( Test fTest, Bu::FString sName ); | ||
| 39 | void setName( const FString &sName ); | ||
| 40 | |||
| 41 | private: | ||
| 42 | typedef struct TestInfo | ||
| 43 | { | ||
| 44 | FString sName; | ||
| 45 | Test fTest; | ||
| 46 | } TestInfo; | ||
| 47 | |||
| 48 | typedef std::list<TestInfo> TestList; | ||
| 49 | TestList lTests; | ||
| 50 | FString sSuiteName; | ||
| 51 | }; | ||
| 52 | } | ||
| 53 | |||
| 54 | #define addTest( fn ) add( static_cast<Bu::UnitSuite::Test>(&fn), #fn ) | ||
| 55 | #define unitTest( tst ) if( !(tst) ) \ | ||
| 56 | { \ | ||
| 57 | throw Bu::UnitSuite::Failed( #tst, __FILE__, __LINE__ ); \ | ||
| 58 | } | ||
| 59 | |||
| 60 | #endif | ||
