/***************************************************************************
* GTestSuite.hpp - Abstract test suite base class *
* ----------------------------------------------------------------------- *
* copyright (C) 2012-2014 by Jean-Baptiste Cayrou *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
***************************************************************************/
/**
* @file GTestSuite.hpp
* @brief Abstract test suite base class definition
* @author Jean-Baptiste Cayrou
*/
#ifndef GTESTSUITE_HPP
#define GTESTSUITE_HPP
/* __ Forward declarations _______________________________________________ */
class GTestSuite;
/* __ Test suite pointer _________________________________________________ */
typedef void (GTestSuite::*pfunction)(void);
/* __ Includes ___________________________________________________________ */
#include
#include
#include "GLog.hpp"
#include "GException.hpp"
#include "GTestCase.hpp"
#include "GTypemaps.hpp"
/***********************************************************************//**
* @class GTestSuite
*
* @brief Abstract test suite class for unit testing on GammaLib fixtures
*
* @todo Detailed explanation.
***************************************************************************/
class GTestSuite : public GBase {
public:
// Constructors and destructors
GTestSuite(void);
GTestSuite(const GTestSuite& testsuite);
GTestSuite(const std::string& name);
virtual ~GTestSuite(void);
// Operators
GTestSuite& operator=(const GTestSuite& testsuite);
GTestCase& operator[](const int& index);
const GTestCase& operator[](const int& index) const;
// Pure virtual methods
virtual GTestSuite* clone(void) const = 0;
virtual std::string classname(void) const = 0;
virtual void set(void) = 0;
// Other methods
void clear(void);
int size(void) const;
void append(pfunction function, const std::string& name);
bool run(void);
const std::string& name(void) const;
void name(const std::string& name);
void cout(const bool& flag);
void test_assert(const bool& result,
const std::string& name,
const std::string& message="");
void test_value(const int& value,
const int& expected,
const std::string& name="",
const std::string& message="");
void test_value(const double& value,
const double& expected,
const double& eps = 1.0e-10,
const std::string& name="",
const std::string& message="");
void test_try(const std::string& name);
void test_try_success(void);
void test_try_failure(const std::string& message = "",
const std::string& type = "");
void test_try_failure(const std::exception& e);
GException::test_failure& exception_failure(const std::string& message);
GException::test_error& exception_error(const std::string& message);
const int& errors(void) const;
const int& failures(void) const;
int success(void) const;
const time_t& timestamp(void) const;
double duration(void) const;
std::string print(const GChatter& chatter = NORMAL) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GTestSuite& testsuite);
void free_members(void);
std::string format_name(const std::string& name);
// Protected members
std::string m_name; //!< Name of the test suite
std::vector m_names; //!< Names of test functions
std::vector m_functions; //!< Test functions of this suite
std::vector m_tests; //!< List of test results
std::vector m_stack_try; //!< Stack for nested try blocks
int m_index; //!< Index of actual test function
int m_failures; //!< Number of failures
int m_errors; //!< Number of errors
GLog m_log; //!< Log
time_t m_timestamp; //!< Timestamp
};
/***********************************************************************//**
* @brief Return number of tests in test suite
***************************************************************************/
inline
int GTestSuite::size(void) const
{
return m_tests.size();
}
/***********************************************************************//**
* @brief Return test suite name
***************************************************************************/
inline
const std::string& GTestSuite::name(void) const
{
return m_name;
}
/***********************************************************************//**
* @brief Set Test Suite name
*
* @param[in] name Test suite name.
***************************************************************************/
inline
void GTestSuite::name(const std::string& name)
{
m_name = name;
return;
}
/***********************************************************************//**
* @brief Enables/disables logging into standard output stream
*
* @param[in] flag Enable/disable logging (true/false).
*
* Enables or disables logging into the standard output stream.
***************************************************************************/
inline
void GTestSuite::cout(const bool& flag)
{
m_log.cout(flag);
return;
}
/***********************************************************************//**
* @brief Return the number of errors
*
* @return Number of errors.
***************************************************************************/
inline
const int& GTestSuite::errors(void) const
{
return m_errors;
}
/***********************************************************************//**
* @brief Return the number of failures
*
* @return Number of failures.
***************************************************************************/
inline
const int& GTestSuite::failures(void) const
{
return m_failures;
}
/***********************************************************************//**
* @brief Return the timestamp
*
* @return Timestamp.
*
* The timestamp is set at the construction of the object.
***************************************************************************/
inline
const time_t& GTestSuite::timestamp(void) const
{
return m_timestamp;
}
#endif /* GTESTSUITE_HPP */