testregistry.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 ** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB.  All rights reserved.
00003 **
00004 ** This file is part of the KD Chart library.
00005 **
00006 ** Licensees holding valid commercial KD Chart licenses may use this file in
00007 ** accordance with the KD Chart Commercial License Agreement provided with
00008 ** the Software.
00009 **
00010 **
00011 ** This file may be distributed and/or modified under the terms of the
00012 ** GNU General Public License version 2 and version 3 as published by the
00013 ** Free Software Foundation and appearing in the file LICENSE.GPL included.
00014 **
00015 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00016 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00017 **
00018 ** Contact info@kdab.com if any conditions of this licensing are not
00019 ** clear to you.
00020 **
00021 **********************************************************************/
00022 
00023 #ifndef KDAB_NO_UNIT_TESTS
00024 
00025 #include "testregistry.h"
00026 
00027 #include "test.h"
00028 
00029 #include <memory>
00030 #include <iostream>
00031 #include <iomanip>
00032 #include <cassert>
00033 
00034 KDAB::UnitTest::TestRegistry::TestRegistry()
00035     : mTests()
00036 {
00037 
00038 }
00039 
00040 KDAB::UnitTest::TestRegistry::~TestRegistry() {}
00041 
00042 KDAB::UnitTest::TestRegistry * KDAB::UnitTest::TestRegistry::mSelf = 0;
00043 
00044 // static
00045 KDAB::UnitTest::TestRegistry * KDAB::UnitTest::TestRegistry::instance() {
00046     if ( !mSelf )
00047         mSelf = new TestRegistry;
00048     return mSelf;
00049 }
00050 
00051 // static
00052 void KDAB::UnitTest::TestRegistry::deleteInstance() {
00053     delete mSelf; mSelf = 0;
00054 }
00055 
00056 void KDAB::UnitTest::TestRegistry::registerTestFactory( const TestFactory * tf, const char * group ) {
00057     assert( tf );
00058     mTests[group].push_back( tf );
00059 }
00060 
00061 unsigned int KDAB::UnitTest::TestRegistry::run() const {
00062   unsigned int failed = 0;
00063   for ( std::map< std::string, std::vector<const TestFactory*> >::const_iterator g = mTests.begin() ; g != mTests.end() ; ++g ) {
00064     std::cerr << "===== GROUP \"" << g->first << "\" =========" << std::endl;
00065     for ( std::vector<const TestFactory*>::const_iterator it = g->second.begin() ; it != g->second.end() ; ++it ) {
00066       std::auto_ptr<Test> t( (*it)->create() );
00067       assert( t.get() );
00068       std::cerr << "  === \"" << t->name() << "\" ===" << std::endl;
00069       t->run();
00070       std::cerr << "    Succeeded: " << std::setw( 4 ) << t->succeeded()
00071                 << ";  failed: " << std::setw( 4 ) << t->failed() << std::endl;
00072       failed += t->failed();
00073     }
00074   }
00075   return failed;
00076 }
00077 
00078 
00079 unsigned int KDAB::UnitTest::TestRegistry::run( const char * group ) const {
00080   assert( group ); assert( *group );
00081   unsigned int failed = 0;
00082   const std::map< std::string, std::vector<const TestFactory*> >::const_iterator g = mTests.find( group );
00083   if ( g == mTests.end() ) {
00084     std::cerr << "ERROR: No such group \"" << group << "\"" << std::endl;
00085     return 1;
00086   }
00087   std::cerr << "===== GROUP \"" << g->first << "\" =========" << std::endl;
00088   for ( std::vector<const TestFactory*>::const_iterator it = g->second.begin() ; it != g->second.end() ; ++it ) {
00089     std::auto_ptr<Test> t( (*it)->create() );
00090     assert( t.get() );
00091     std::cerr << "  === \"" << t->name() << "\" ===" << std::endl;
00092     t->run();
00093     std::cerr << "    Succeeded: " << t->succeeded() << ";  failed: " << t->failed() << std::endl;
00094     failed += t->failed();
00095   }
00096   return failed;
00097 }
00098 
00099 KDAB::UnitTest::Runner::~Runner()
00100 {
00101         TestRegistry::deleteInstance();
00102 }
00103 
00104 unsigned int KDAB::UnitTest::Runner::run( const char * group ) const
00105 {
00106   if ( group && *group )
00107     return TestRegistry::instance()->run( group );
00108   else
00109     return TestRegistry::instance()->run();
00110 }
00111 
00112 
00113 #endif // KDAB_NO_UNIT_TESTS