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

📄 unittest.h

📁 设计模式模板源码
💻 H
字号:
///////////////////////////////////////////////////////////////////////////////
// Unit Test framework
//

#ifndef UNITTEST_H
#define UNITTEST_H

#include <iostream>
#include <string>
#include <vector>

///////////////////////////////////////////////////////////////////////////////
// TestResult
///////////////////////////////////////////////////////////////////////////////

class TestResult
{
public:
  TestResult() : pos(0),passed(0),failed(0),notSupported(0) {}

  int pos;
  int passed;
  int failed;
  int notSupported;
};


///////////////////////////////////////////////////////////////////////////////
// Test
///////////////////////////////////////////////////////////////////////////////

class Test
{
typedef std::vector<Test*> tests_type;
static tests_type tests;

public:
  explicit Test(const std::string &n) : name(n)
    {
    Test::tests.push_back(this);
    }

  virtual void execute(TestResult &) =0;
  
protected:
  virtual ~Test() {}

  void printName(const TestResult &result) const
    {
    if(name.length()!=0)
      std::cout << std::string(result.pos,' ') << name << '\n';
    }

  void testAssert(const std::string &s,bool assertion,TestResult &result,bool supported =true,
                  const std::string &failStr =emptyStr())
    {
    std::string str=std::string(result.pos+2,' ')+s;

    str+=std::string(offset-str.length(),' ');

    if(supported)
      {
      if(assertion)
        {
        std::cout << str << "Passed\n";

        ++result.passed;
        }
      else
        {
        std::cout << str << (failStr==emptyStr() ? std::string("Failed") : "Failed - "+failStr) << '\n';

        ++result.failed;
        }
      }
    else
      {
      std::cout << str << "Not Supported\n";

      ++result.notSupported;
      }
    }

  static std::string emptyStr()
    {
    return std::string();
    }

public:
  enum { offset=63 };

protected:
  const std::string name;
  
public:
  static int run(const std::string &title)
    {
    std::cout << title << std::string(Test::offset-title.length(),' ') << "Result\n";
    std::cout << std::string(76,'-') << '\n';
    
    TestResult testResult;
    
    tests_type::iterator it;
    tests_type::const_iterator itEnd = Test::tests.end();
    for(it=Test::tests.begin(); it!=itEnd; ++it)
      {
      Test* test = *it;
      test->execute(testResult);
      }
    
    std::cout << std::string(76,'-') << '\n';

    const int total=testResult.passed+testResult.failed;
    const int totalAll=total+testResult.notSupported;

    if(total!=0)
      std::cout << "Total - " << testResult.passed << '/' << total << (total==1 ? " test, " : " tests, ")
                << testResult.passed*100/total << "% Passed\n";

    if(testResult.notSupported!=0)
      std::cout << "Not Supported - " << testResult.notSupported << '/' << totalAll << ", "
                << testResult.notSupported*100/totalAll << "%\n";

    return testResult.failed;
    }

};


#endif

⌨️ 快捷键说明

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