⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testingframework.hh

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 HH
字号:
// ============================================================================// $Id: TestingFramework.hh,v 1.1.1.1 2004-09-06 12:37:50 botsch Exp $// ----------------------------------------------------------------------------#ifndef TESTINGFRAMEWORK_HH#define TESTINGFRAMEWORK_HH// ----------------------------------------------------------------------------/** \file TestingFramework.hh    This file contains a little framework for test programms*/// ----------------------------------------------------------------------------#include "Config.hh"#include <iosfwd>#include <sstream>#include <vector>#include <algorithm>#include <stdexcept>#include <OpenMesh/Core/Utils/Noncopyable.hh>// ------------------------------------------------------------- namespace ----namespace OpenMesh { // BEGIN_NS_OPENMESHnamespace Utils { // BEGIN_NS_UTILS// ----------------------------------------------------------------- class ----//// Usage Example//// #include <iostream>// #include <.../TestingFramework.hh>//// struct test_func : public TestingFramework::TestFunc// {//    typedef test_func Self;////    // define ctor and copy-ctor//    test_func( TestingFramework& _th, std::string _n ) : TestingFramework::TestFunc( _th, _n ) { }//    test_func( Self& _cpy ) : TestingFramework::TestFunc(_cpy) { }////    // overload body()//    void body()//    {////       // Do the tests//       // direct call to verify//       verify( testResult, expectedResult, "additional information" );////       // or use the define TH_VERIFY. The test-expression will be used as the message string//       TH_VERIFY( testResult, expectedResult );////       ...//    }// };//// int main(...)// {//    TestingFramework testSuite(std::cout); // send output to stdout////    new test_func(testSuite);        // create new test instance. It registers with testSuite.//    return testSuite.run();// }//// #define TH_VERIFY( expr, expt ) \     verify( expr, expt, #expr )//#define TH_VERIFY_X( expr, expt ) \     verify_x( expr, expt, #expr )/** Helper class for test programms.    \internal */class TestingFramework : Noncopyable{public:  typedef TestingFramework Self;  typedef std::logic_error verify_error;   #ifndef DOXY_IGNORE_THIS  class TestFunc  {  public:    TestFunc( TestingFramework& _th, const std::string& _n )       : th_(_th), name_(_n)    {      th_.reg(this);    }        virtual ~TestFunc()    { }        void operator() ( void )    {      prolog();      try      {        body();      }      catch( std::exception& x )      {        std::cerr << "<<Error>>: Cannot proceed test due to failure of last"                  << "  test: " << x.what() << std::endl;      }      catch(...)      {        std::cerr << "Fatal: cannot proceed test due to unknown error!"                   << std::endl;      }      epilog();    }        const TestingFramework& testHelper() const { return th_; }      protected:        virtual void prolog(void)    {      begin(name_);    }        virtual void body(void) = 0;        virtual void epilog(void)    {      end();    }      protected:        TestingFramework& testHelper() { return th_; }        TestFunc( const TestFunc& _cpy ) : th_(_cpy.th_), name_(_cpy.name_) { }            // Use the following method in prolog()    TestFunc& begin(std::string _title, const std::string& _info = "")    { th_.begin(_title,_info); return *this; }            // Use the following method in epilog()    TestFunc& end(void)    { th_.end(); return *this; }            // Use the followin methods in body()        template <typename ValueType>    bool    verify( const ValueType& _rc, const ValueType& _expected,             std::string _info )    { return th_.verify( _rc, _expected, _info ); }        template <typename ValueType>    void    verify_x( const ValueType& _rc, const ValueType& _expected,               std::string _info )    {      if ( !verify(_rc, _expected, _info) )        throw verify_error(_info);    }        TestFunc& info(const std::string& _info)     { th_.info(_info); return *this; }    TestFunc& info(const std::ostringstream& _ostr)     { th_.info(_ostr); return *this; }      private:          TestFunc();      protected:    TestingFramework& th_;    std::string name_;        };#endif  typedef TestFunc*                TestFuncPtr;  typedef std::vector<TestFuncPtr> TestSet;  public:    TestingFramework(std::ostream& _os)     : errTotal_(0),    errCount_(0),      verifyTotal_(0), verifyCount_(0),      testTotal_(0),   testCount_(0),      os_(_os)  { }  protected:  #ifndef DOXY_IGNORE_THIS  struct TestDeleter  {    void operator() (TestFuncPtr _tfptr) { delete _tfptr; }  };#endifpublic:      virtual ~TestingFramework()   {      std::for_each(tests_.begin(), tests_.end(), TestDeleter() );   }public:      template <typename ValueType>   bool verify(const ValueType& _rc, 	       const ValueType& _expected, 	       const std::string& _info)   {      ++verifyTotal_;      if ( _rc == _expected )      {         os_ << "    " << _info << ", result: " << _rc << ", OK!" << std::endl;         return true;      }      ++errTotal_;      os_ << "    " << _info << ", result: " << _rc << " != " << _expected          << " <<ERROR>>" << std::endl;      return false;   }      Self& begin(std::string _title, const std::string& _info = "")   {      std::ostringstream ostr;            testTitle_ = _title;      errCount_  = errTotal_;      ++testTotal_;            ostr << _title;      if ( !_info.empty() )         ostr << " ["<< _info << "]";      testTitle_ = ostr.str();      os_ << "Begin " << testTitle_ << std::endl;      return *this;   }      Self& end()   {      if (errorCount()==0)         ++testCount_;            os_ << "End " << testTitle_ << ": " << errorCount() << " Error(s)." << std::endl;      return *this;   }   Self& info(const std::string& _info)   {      os_ << "  + " << _info << std::endl;      return *this;   }      Self& info(const std::ostringstream& _ostr)   {      os_ << "  + " << _ostr.str() << std::endl;      return *this;   }      size_t errorTotal()  const { return errTotal_; }   size_t errorCount()  const { return errTotal_ - errCount_; }   size_t verifyTotal() const { return verifyTotal_; }   size_t verifyCount() const { return verifyTotal_ - verifyCount_; }   size_t goodTotal()   const { return verifyTotal() - errorTotal(); }   size_t goodCount()   const { return verifyCount() - errorCount(); }      size_t testTotal()   const { return testTotal_; }   size_t testCount()   const { return testCount_; }public:   int run(void)   {      os_ << "Test started\n";      TestRunner executer;      std::for_each(tests_.begin(), tests_.end(), executer );      os_ << std::endl;      os_ << "All tests completed" << std::endl          << "   #Tests: " << testCount() << "/" << testTotal() << std::endl          << "  #Errors: " << errorTotal() << "/" << verifyTotal() << std::endl;      return errorTotal();   }protected:#ifndef DOXY_IGNORE_THIS  struct TestRunner  {    void operator() (TestFuncPtr _tfptr) { (*_tfptr)(); }  };   #endif  int reg(TestFuncPtr _tfptr)  {    tests_.push_back(_tfptr);    return true;  }  friend class TestFunc;   private:  size_t errTotal_;      size_t errCount_;      size_t verifyTotal_;  size_t verifyCount_;     size_t testTotal_;   // #Tests  size_t testCount_;   // #Tests ohne Fehler    std::string testTitle_;  std::ostream& os_;    TestSet tests_;  };// ============================================================================} // END_NS_UTILS} // END_NS_OPENMESH// ============================================================================#endif // TESTINGFRMEWORK_HH// ============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -