diff options
author | Mike Buland <eichlan@xagasoft.com> | 2007-04-10 16:02:07 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2007-04-10 16:02:07 +0000 |
commit | b6e100b94b12f3f92ec025dc2363eaf7c0ee6662 (patch) | |
tree | 7fa6f7c9450f0ef866e50e1d096ad854a5892aa0 | |
parent | 5a0d7856dc265580cebaa833e0367d03ef21bbc3 (diff) | |
download | libbu++-b6e100b94b12f3f92ec025dc2363eaf7c0ee6662.tar.gz libbu++-b6e100b94b12f3f92ec025dc2363eaf7c0ee6662.tar.bz2 libbu++-b6e100b94b12f3f92ec025dc2363eaf7c0ee6662.tar.xz libbu++-b6e100b94b12f3f92ec025dc2363eaf7c0ee6662.zip |
Well, we've got the basis of a workable unit test harness thing. There should
be a few more add-ons to it, but it works just fine, and eventually it should
cover command line options and creating logs, and possibly even provide output
functionality so that output from tests can be logged and kept track of well.
-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 | ||