aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2007-04-10 16:02:07 +0000
committerMike Buland <eichlan@xagasoft.com>2007-04-10 16:02:07 +0000
commitb6e100b94b12f3f92ec025dc2363eaf7c0ee6662 (patch)
tree7fa6f7c9450f0ef866e50e1d096ad854a5892aa0
parent5a0d7856dc265580cebaa833e0367d03ef21bbc3 (diff)
downloadlibbu++-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.conf16
-rw-r--r--src/fstring.h24
-rw-r--r--src/ssocket.cpp4
-rw-r--r--src/unit/fstring.cpp28
-rw-r--r--src/unit/sfile.cpp27
-rw-r--r--src/unitsuite.cpp67
-rw-r--r--src/unitsuite.h60
7 files changed, 224 insertions, 2 deletions
diff --git a/build.conf b/build.conf
index 5c4dbb6..bc186f9 100644
--- a/build.conf
+++ b/build.conf
@@ -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
33directoriesIn("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
41filesIn("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
35rule "exe": 51rule "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
3SSocket::SSocket() 3Bu::SSocket::SSocket()
4{ 4{
5} 5}
6 6
7SSocket::~SSocket() 7Bu::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
4class Unit : public Bu::UnitSuite
5{
6public:
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
24int 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
3class Unit : public Bu::UnitSuite
4{
5public:
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
23int 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
3Bu::UnitSuite::UnitSuite()
4{
5}
6
7Bu::UnitSuite::~UnitSuite()
8{
9}
10
11int 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
48void 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
63void 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
8namespace 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