/**
* @file 本文件名为SuiteUI.h
*
* 本文件仅包含类SuiteUI声明(定义).
*
* @author MM
* @version 1.0
* @date 2007-05-20
*/
#ifndef SUITEUI_H_HEADER_INCLUDED
#define SUITEUI_H_HEADER_INCLUDED
#pragma warning (disable: 4786)
#include <string>
#include <vector>
using std::string;
using std::vector;
namespace CppUnit
{
/**
* @brief 将每个测试集测试的结果显示在控制台上.
*
*
* 用法简介:
*
* 构造时传入测试集的名称,显示的长度和宽度,单位是字符串"- "的长度;
*
* 利用add_testItem()方法添加过程语句;
*
* 利用add_testResult()方法添加结果语句;
*
* 然后调用show()方法显示结果.
*
*/
class SuiteUI
{
private:
string m_name; ///< 名
unsigned short m_width; ///< 宽
unsigned short m_high; ///< 高
vector<string> m_testItmes; ///< 过程集
vector<string> m_testResults; ///< 结果集
void adapt();
unsigned short cal(string str);
public:
SuiteUI(std::string name = "Suite",unsigned short wid = 30,unsigned short high = 20);
void add_testItem(const string &testItem);
void add_testResult(const string &testResult);
void show();
};
}
#endif /* SUITEUI_H_HEADER_INCLUDED */
/**
* @file 本文件名为SuiteUI.cpp
*
* 本文件仅包含类SuiteUI的实现.
*
* @author 蒙德鑫
* @version 1.0
* @date 2007-05-20
*/
#include "SuiteUI.h"
#include <iostream>
//using std::vector<std::string>::iterator;
using std::cout;
using std::endl;
namespace CppUnit
{
/**
* @brief 类SuiteUI的构造方法.
*
* 构造一个SuiteUI对象,传入各个参数;
*
* @param name 要显示的suite的名称.
*
* @param wid 要显示的宽度,单位是字符串"- "的长度.
*
* @param high 要显示的高度,单位是字符串"- "的长度.
*
* @see TestSuite
*/
SuiteUI::SuiteUI(std::string name /* = "Suite" */,unsigned short wid /* = 30 */,unsigned short high /* = 20 */):
m_name(name),m_width(wid),m_high(high)
{
//
}
/**
* @brief 添加过程语句.
*
* 向过程集m_testItems添加过程语句.
*
* @param testItem 要添加的过程语句.
*
* @return 无返回值
*/
void SuiteUI::add_testItem(const string &testItem)
{
m_testItmes.push_back(testItem);
}
/**
* @brief 添加结果语句.
*
* 向过程集m_testResults添加结果语句.
*
* @return 无返回值
*/
void SuiteUI::add_testResult(const string &testResult)
{
m_testResults.push_back(testResult);
}
/**
* @brief 适当地宽度或高度.
*
* 根据宽度和高度,以及过程集和结果集语句的个数,当宽度或者高度不够时,会适当地宽度或高度.
*
* @return 无返回值
*/
void SuiteUI::adapt()
{
unsigned short maxWidth = 0;
unsigned short maxHigth = 0;
std::vector<std::string>::iterator pr;
for (pr = m_testItmes.begin(); pr != m_testItmes.end(); pr++)
{
if((*pr).size() > maxWidth) //找出语句的最大长度
maxWidth = (*pr).size();
++maxHigth;
}
for (pr = m_testResults.begin(); pr != m_testResults.end(); pr++)
{
if((*pr).size() > maxWidth) //找出语句的最大长度
maxWidth = (*pr).size();
++maxHigth;
}
if(m_width < maxWidth + 2) //重新设置宽度
m_width = maxWidth + 4;
if(m_high < 2*maxHigth) //重新设置高度
m_high = 2*maxHigth + 5;
}
/**
* @brief 语句的横坐标.
*
* 根据语句的长度和当前的宽度,计算出语句的横坐标,以便使语句显示在中间位置.
*
* param str 要计算的语句.
*
* @return 无返回值
*/
unsigned short SuiteUI::cal(string str)
{
return (m_width - str.size())/2;
}
/**
* @brief 显示结果.
*
* 调用adapt(),以适当增加当前的宽度和高度;
* 第一行左上角显示名称;
* 调用cal()方法获得每条语句显示的起始位置;
* 以下逐行显示.
*
* @return 无返回值
*/
void SuiteUI::show()
{
int pos = 0;
int i = 0;
//显示左上角的内容
string top_left_corner("Suite: ");
top_left_corner += m_name;
pos = cal(top_left_corner);
for(i = 0; i < m_width - top_left_corner.size(); ++i)
{
if(pos == i)
cout << top_left_corner;
else
cout << "*";
}
cout << endl;
cout << endl;
//过程集
//cout << "过程集" << endl;
std::vector<std::string>::iterator pr;
for (pr = m_testItmes.begin(); pr != m_testItmes.end(); pr++)
{
pos = cal(*pr); //获得每条语句显示的起始位置
for (i = 0; i < m_width; ++i)
{
if(pos == i)
cout << (*pr);
else
cout << " ";
}
cout << endl;
}
for (i = 0; i < m_width; ++i)
cout << "-";
cout << endl;
//结果集
for (pr = m_testResults.begin(); pr != m_testResults.end(); pr++)
{
pos = cal(*pr); //获得每条语句显示的起始位置
for (i = 0; i < m_width; ++i)
{
if(pos == i)
cout << (*pr);
else
cout << " ";
}
cout << endl;
}
for (i = 0; i < m_width; ++i)
cout << "*";
cout << endl;
cout << endl;
cout << endl;
}
}