aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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