00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "BUnit.h"
00011 #include <iostream>
00012 using namespace std;
00013
00014
00015 class test_BUnit : public TestCase {
00016 public:
00017 bool run();
00018 void test_constructor();
00019 void test_reset();
00020 void test_addTest();
00021 void test_run();
00022 void test_setName();
00023 void test_testThis();
00024 void test_BUnit_macro();
00025 void test_assertTrue_Msg();
00026 void test_Allison();
00027 };
00028
00029
00030 bool test_BUnit::run() {
00031 test_constructor();
00032 test_reset();
00033 test_addTest();
00034 test_run();
00035 test_setName();
00036 test_testThis();
00037 test_BUnit_macro();
00038 test_assertTrue_Msg();
00039 test_Allison();
00040
00041 return wasSuccessful();
00042 }
00043
00044
00045 void test_BUnit::test_constructor() {
00046 {{
00047 test_BUnit thisTest;
00048 assertTrue( string::npos != thisTest.getName().find( "test_BUnit" ) );
00049 assertTrue( thisTest.failureCount() == 0 );
00050 assertTrue( thisTest.countTestCases() == 1 );
00051 assertTrue( thisTest.successCount() == 0 );
00052 assertTrue( thisTest.runCount() == 0 );
00053 assertTrue( thisTest.failureString() == "" );
00054 }}
00055 {
00056 test_BUnit thisTest;
00057 assertTrue( thisTest.m_pass == 0 );
00058 assertTrue( thisTest.m_failure == 0 );
00059 assertTrue( thisTest.m_name == 0 );
00060 assertTrue( thisTest.m_failureList.empty() );
00061 }
00062 }
00063
00064
00065 void test_BUnit::test_reset() {
00066 {{
00067 class MyTest : public TestCase {
00068 public:
00069 bool run() {
00070 assertTrue( 1 == 2 );
00071 assertTrue( 1 == 1 );
00072 assertTrue( 2 == 2 );
00073 return wasSuccessful();
00074 }
00075 };
00076 MyTest thisTest;
00077 for ( int i=0; i<11; ++i ) {
00078 thisTest.run();
00079 }
00080 assertTrue( 11 == thisTest.failureCount() );
00081 assertTrue( 22 == thisTest.successCount() );
00082 assertTrue( 33 == thisTest.runCount() );
00083 assertTrue( "" != thisTest.failureString() );
00084 std::string remember = thisTest.getName();
00085
00086 thisTest.reset();
00087
00088 assertTrue( 0 == thisTest.failureCount() );
00089 assertTrue( 0 == thisTest.successCount() );
00090 assertTrue( 0 == thisTest.runCount() );
00091 assertTrue( "" == thisTest.failureString() );
00092 assertTrue( remember == thisTest.getName() );
00093 }}
00094 }
00095
00096
00097 void test_BUnit::test_addTest() {
00098 {{
00099 class MyTest : public TestCase {
00100 public:
00101 bool run() {
00102 assertTrue( 1 == 1 );
00103 assertTrue( 1 == 2 );
00104 return wasSuccessful();
00105 }
00106 };
00107 TestSuite<TestCase> SSS;
00108 MyTest thisTest, *ptr_test = new MyTest;
00109 SSS.addTest( thisTest );
00110 SSS.addTest( ptr_test );
00111 assertTrue( 0 == SSS.failureCount() );
00112 SSS.run();
00113 assertTrue( 1+1 == SSS.failureCount() );
00114 assertTrue( "" != SSS.toXML() );
00115
00116 TestSuite<TestCase> TTT, RRR;
00117 TTT.addTest( & SSS );
00118 assertTrue( "" == SSS.toXML() );
00119 assertTrue( "" != TTT.toXML() );
00120 RRR.addTest( TTT );
00121 assertTrue( 0 == SSS.countTestCases() );
00122 assertTrue( 0 == TTT.countTestCases() );
00123 assertTrue( 2 == RRR.countTestCases() );
00124 assertTrue( 2 == RRR.failureCount() );
00125 assertTrue( "" != RRR.toXML() );
00126 }}
00127 {
00128 class MyTest : public TestCase {
00129 public:
00130 bool run() {
00131 assertTrue( 1 == 1 );
00132 assertTrue( 1 == 2 );
00133 return wasSuccessful();
00134 }
00135 };
00136 TestSuite<TestCase> SSS, TTT;
00137 MyTest thisTest, *ptr_test = new MyTest;
00138 SSS.addTest( thisTest );
00139 SSS.addTest( ptr_test );
00140 SSS.addTest( ptr_test );
00141 SSS.addTest( ptr_test );
00142 SSS.addTest( (MyTest*)(0) );
00143 SSS.run();
00144 assertTrue( 2 == SSS.countTestCases() );
00145 assertTrue( 1+1 == SSS.failureCount() );
00146
00147 TTT.addSuite( *( (TestSuite<TestCase>*)(0) ) );
00148 TTT.addSuite( TTT );
00149 assertTrue( 0 == TTT.countTestCases() );
00150
00151 TTT.addTest( thisTest );
00152 TTT.addTest( ptr_test );
00153 assertTrue( 2 == TTT.countTestCases() );
00154
00155 SSS.addTest( new MyTest );
00156 TTT.addSuite( SSS );
00157 TTT.addSuite( TTT ); TTT.addTest( TTT ); TTT.addTest( & TTT );
00158 assertTrue( 0 == SSS.countTestCases() );
00159 assertTrue( 3 == TTT.countTestCases() );
00160
00161 TTT.run( );
00162 assertTrue( 000 == SSS.failureCount() );
00163 assertTrue( 2+3 == TTT.failureCount() );
00164 thisTest.run();
00165 assertTrue( 1+2+3 == TTT.failureCount() );
00166 }
00167 }
00168
00169
00170 void test_BUnit::test_run() {
00171 {{
00172 class MyTest : public TestCase {
00173 int m_val;
00174 public:
00175 MyTest() : m_val(0) {}
00176 void setUp() { m_val = 1; }
00177 void tearDown() { m_val = 2; }
00178 bool run() {
00179 assertTrue( m_val == 1 );
00180 return wasSuccessful();
00181 }
00182 };
00183 TestSuite<TestCase> SSS;
00184 SSS.addTest( new MyTest ); SSS.addTest( new MyTest );
00185 assertTrue( 2 == SSS.countTestCases() );
00186 assertTrue( "" == SSS.failureString() );
00187
00188 SSS.runBare();
00189 assertTrue( "" == SSS.toXML() );
00190
00191 SSS.run();
00192 std::string sssXML = SSS.toXML();
00193 assertTrue( "" != sssXML );
00194 assertTrue( sssXML.find("m_val") != string::npos );
00195 assertTrue( SSS.runCount() == 2+2 );
00196 }}
00197 }
00198
00199
00200 void test_BUnit::test_setName() {
00201 {{
00202 class MyTest : public TestCase {
00203 public:
00204 bool run() {
00205 assertTrue( 2 == 2 );
00206 return wasSuccessful();
00207 }
00208 };
00209 MyTest thisTest;
00210 assertTrue( "chorlito" != thisTest.getName() );
00211 thisTest.setName( "chorlito" );
00212 assertTrue( "chorlito" == thisTest.getName() );
00213 {
00214
00215 thisTest.setName( std::string("chorlito").c_str() );
00216 std::string V("boom!");
00217 assertTrue( 0==strcmp( V.c_str() , "boom!") );
00218 assertTrue( "chorlito" != thisTest.getName() );
00219 assertTrue( "boom!" == thisTest.getName() );
00220 }
00221 }}
00222 }
00223
00224
00225 void test_BUnit::test_testThis() {
00226 {{
00227 class MyTest : public TestCase {
00228 public:
00229 bool run() {
00230 bool dont_copy = false;
00231 testThis( 2 == 2, "2 is 2", __FILE__, __LINE__, dont_copy );
00232 testThis( 1 == 2, "1 is 2", __FILE__, __LINE__, dont_copy );
00233 testThis( 2 == 1, "2 is 1", __FILE__, __LINE__, dont_copy );
00234 return wasSuccessful();
00235 }
00236 };
00237 MyTest thisTest;
00238 assertTrue( thisTest.wasSuccessful() );
00239 thisTest.run();
00240 assertTrue( thisTest.failureCount() == 2 );
00241 assertTrue( ! thisTest.wasSuccessful() );
00242 }}
00243 }
00244
00245 #include <vector>
00246 #include <stdexcept>
00247
00248
00249 void test_BUnit::test_BUnit_macro() {
00250 {{
00251 class MyTest : public TestCase {
00252 public:
00253 bool run() {
00254 testThis( 2 == 2, "2 == 2", __FILE__, __LINE__ );
00255 BUnit_TEST( 2 == 2 );
00256 testThis( 1 == 2, "1 == 2", __FILE__, __LINE__ );
00257 assertTrue( 1 == 2 );
00258 {
00259 std::vector<int> V;
00260 try {
00261 int i = V.at(2);
00262 BUnit_FAILURE("V.at(2)");
00263 }
00264 catch (std::logic_error&) {
00265 BUnit_SUCCESS();
00266 }
00267 }
00268 {
00269 std::vector<int> V;
00270 try {
00271 int i = V.at(2);
00272 recordFailure("V.at(2)" , __FILE__ , __LINE__ );
00273 }
00274 catch (std::logic_error&) {
00275 recordSuccess();
00276 }
00277 }
00278 return wasSuccessful();
00279 }
00280 };
00281 MyTest thisTest;
00282 assertTrue( thisTest.wasSuccessful() );
00283 thisTest.run();
00284 assertTrue( thisTest.failureCount() == 2 );
00285 assertTrue( thisTest.toXML() != "" );
00286 assertTrue( ! thisTest.wasSuccessful() );
00287 }}
00288 }
00289
00290
00291 void test_BUnit::test_assertTrue_Msg() {
00292 {{
00293 class MyTest : public TestCase {
00294 enum { N = 6 };
00295 int m_Matrix[N][N];
00296 public:
00297 void setUp() {
00298 for ( int i=0; i<N; ++i ) {
00299 for ( int j=0; j<N; ++j ) {
00300 m_Matrix[i][j] = 666;
00301 }
00302 }
00303 }
00304 bool run() {
00305 for ( int i=0; i<N; ++i ) {
00306 for ( int j=0; j<N; ++j ) {
00307 std::string err = "m_Matrix";
00308 err += '[' + TestCase::toString(i) + ']';
00309 err += '[' + TestCase::toString(j) + ']';
00310 err += " == 0";
00311 assertTrue_Msg( err , m_Matrix[i][j] == 0 );
00312 }
00313 }
00314 return wasSuccessful();
00315 }
00316 };
00317 MyTest tester;
00318 tester.runBare();
00319 assertTrue( ! tester.wasSuccessful() );
00320
00321 assertTrue( string::npos == tester.toString().find( "m_Matrix[i][j] == 0" ) );
00322
00323 assertTrue( string::npos != tester.toString().find( "m_Matrix[3][5] == 0" ) );
00324 }}
00325 }
00326
00327 #include <exception>
00328
00329
00330 void test_BUnit::test_Allison() {
00331 {{
00332
00333
00334
00335
00336 class Stack {
00337 public:
00338 enum { N = 5 };
00339
00340 Stack() : m_top(0) { m_vec[m_top] = 0; }
00341
00342 void push(const char& v) {
00343 if ( m_top != N ) { m_vec[m_top] = v; m_top++; }
00344 else { throw std::out_of_range("Stack::push()"); }
00345 }
00346
00347 void pop() {
00348 if ( m_top>0 ) { m_top--; }
00349 else { throw std::out_of_range("Stack::pop()"); }
00350 }
00351
00352 char& top() {
00353 if ( m_top>0 ) { return m_vec[m_top-1]; }
00354 else { throw std::out_of_range("Stack::top()"); }
00355 }
00356
00357 unsigned size() const { return m_top; }
00358 private:
00359 char m_vec[N+1] ;
00360 int m_top;
00361 };
00362
00363 class MyTest : public TestCase {
00364 public:
00365 bool run() {
00366 Stack S;
00367
00368 try {
00369 S.pop();
00370 fail_Msg("! S.pop()");
00371 }
00372 catch ( std::out_of_range & ex ) {
00373 assertTrue( 0 == strcmp( ex.what() , "Stack::pop()" ) );
00374 }
00375 catch (...) {
00376 fail_Msg("! ( std::out_of_range & )");
00377 }
00378
00379 try {
00380 for (int i=0; true; ++i) {
00381 S.push('0'+i);
00382 assertTrue( S.top() == '0'+i );
00383 }
00384 fail_Msg("! S.push()");
00385 }
00386 catch ( std::out_of_range & ex ) {
00387 assertTrue( 0 == strcmp( ex.what() , "Stack::push()" ) );
00388 }
00389 catch (...) {
00390 fail_Msg("! ( std::out_of_range & )");
00391 }
00392
00393 try {
00394 for (int i=Stack::N-1; true; --i) {
00395 assertTrue( S.top() == '0'+i );
00396 S.pop();
00397 }
00398 fail_Msg("! S.pop()");
00399 }
00400 catch ( std::out_of_range & ex ) {
00401 assertTrue( 0 == strcmp( ex.what() , "Stack::top()" ) );
00402 }
00403 catch (...) {
00404 fail_Msg("! ( std::out_of_range & )");
00405 }
00406 return wasSuccessful();
00407 }
00408 };
00409 MyTest thisTest;
00410 thisTest.run();
00411 assertTrue( thisTest.wasSuccessful() );
00412 }}
00413 }
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 int main() {
00427 if (1) {
00428 test_BUnit test_BUnit_Instance;
00429 test_BUnit_Instance.setUp();
00430 test_BUnit_Instance.run();
00431 cout << test_BUnit_Instance.summary() << endl;
00432 cout << test_BUnit_Instance.toString() << endl;
00433 cout << test_BUnit_Instance.toXML() << endl;
00434
00435 TestSuite<TestCase> SSS;
00436 SSS.addTest( test_BUnit_Instance );
00437 SSS.addTest( new test_BUnit );
00438 SSS.run();
00439 cout << SSS.report() << endl;
00440 cout << SSS.toXML() << endl;
00441
00442 TestSuite<TestCase> TTT;
00443 TTT.addTest( SSS );
00444 TTT.run();
00445 cout << TTT.summary() << endl;
00446 cout << TTT.toString() << endl;
00447 }
00448 return 0;
00449 }
00450
00451