mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 18:51:29 +00:00
Unit tests + cleanup
This commit is contained in:
parent
a192e726d4
commit
53d6e4000c
@ -154,5 +154,5 @@ IF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
|
|||||||
ENDIF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
|
ENDIF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
|
||||||
|
|
||||||
IF(EQEMU_BUILD_TESTS)
|
IF(EQEMU_BUILD_TESTS)
|
||||||
#ADD_SUBDIRECTORY(tests)
|
ADD_SUBDIRECTORY(tests)
|
||||||
ENDIF(EQEMU_BUILD_TESTS)
|
ENDIF(EQEMU_BUILD_TESTS)
|
||||||
|
|||||||
@ -8,4 +8,4 @@ StackWalker - New BSD License
|
|||||||
ZLib - ZLib License
|
ZLib - ZLib License
|
||||||
MySQL - GPL
|
MySQL - GPL
|
||||||
Perl - GPL / ActiveState (under the assumption that this is a free project).
|
Perl - GPL / ActiveState (under the assumption that this is a free project).
|
||||||
Google Test - New BSD License
|
CPPUnit - GLP
|
||||||
|
|||||||
37
tests/CMakeLists.txt
Normal file
37
tests/CMakeLists.txt
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
|
||||||
|
ADD_SUBDIRECTORY(cppunit)
|
||||||
|
|
||||||
|
SET(tests_sources
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(tests_headers
|
||||||
|
memory_mapped_file_test.h
|
||||||
|
ipc_mutex_test.h
|
||||||
|
fixed_memory_test.h
|
||||||
|
)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(tests ${tests_sources} ${tests_headers})
|
||||||
|
|
||||||
|
TARGET_LINK_LIBRARIES(tests Common cppunit)
|
||||||
|
|
||||||
|
IF(MSVC)
|
||||||
|
SET_TARGET_PROPERTIES(tests PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||||
|
TARGET_LINK_LIBRARIES(tests "Ws2_32.lib")
|
||||||
|
ENDIF(MSVC)
|
||||||
|
|
||||||
|
IF(MINGW)
|
||||||
|
TARGET_LINK_LIBRARIES(tests "WS2_32")
|
||||||
|
ENDIF(MINGW)
|
||||||
|
|
||||||
|
IF(UNIX)
|
||||||
|
TARGET_LINK_LIBRARIES(tests "dl")
|
||||||
|
TARGET_LINK_LIBRARIES(tests "z")
|
||||||
|
TARGET_LINK_LIBRARIES(tests "m")
|
||||||
|
TARGET_LINK_LIBRARIES(tests "rt")
|
||||||
|
TARGET_LINK_LIBRARIES(tests "pthread")
|
||||||
|
ADD_DEFINITIONS(-fPIC)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
|
SET(EXECUTABLE_OUTPUT_PATH ../Bin)
|
||||||
38
tests/cppunit/CMakeLists.txt
Normal file
38
tests/cppunit/CMakeLists.txt
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
|
||||||
|
SET(cppunit_sources
|
||||||
|
collectoroutput.cpp
|
||||||
|
compileroutput.cpp
|
||||||
|
htmloutput.cpp
|
||||||
|
missing.cpp
|
||||||
|
source.cpp
|
||||||
|
suite.cpp
|
||||||
|
textoutput.cpp
|
||||||
|
time.cpp
|
||||||
|
utils.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(cppunit_headers
|
||||||
|
cpptest-assert.h
|
||||||
|
cpptest-collectoroutput.h
|
||||||
|
cpptest-compileroutput.h
|
||||||
|
cpptest-htmloutput.h
|
||||||
|
cpptest-output.h
|
||||||
|
cpptest-source.h
|
||||||
|
cpptest-suite.h
|
||||||
|
cpptest-textoutput.h
|
||||||
|
cpptest-time.h
|
||||||
|
cpptest.h
|
||||||
|
missing.h
|
||||||
|
utils.h
|
||||||
|
winconfig.h
|
||||||
|
)
|
||||||
|
|
||||||
|
ADD_LIBRARY(cppunit ${cppunit_sources} ${cppunit_headers})
|
||||||
|
|
||||||
|
|
||||||
|
IF(UNIX)
|
||||||
|
ADD_DEFINITIONS(-fPIC)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
|
SET(LIBRARY_OUTPUT_PATH ../../Bin)
|
||||||
106
tests/cppunit/collectoroutput.cpp
Normal file
106
tests/cppunit/collectoroutput.cpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: collectoroutput.cpp,v 1.4 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cpptest-collectoroutput.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
CollectorOutput::TestInfo::TestInfo(const string name)
|
||||||
|
: _name(name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
CollectorOutput::SuiteInfo::SuiteInfo(const string& name, int tests)
|
||||||
|
: _name(name),
|
||||||
|
_errors(0)
|
||||||
|
{
|
||||||
|
_tests.reserve(tests);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Constructs a collector object.
|
||||||
|
///
|
||||||
|
CollectorOutput::CollectorOutput()
|
||||||
|
: Output(),
|
||||||
|
_total_errors(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
CollectorOutput::finished(int tests, const Time& time)
|
||||||
|
{
|
||||||
|
_total_tests = tests;
|
||||||
|
_total_time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CollectorOutput::suite_start(int tests, const string& name)
|
||||||
|
{
|
||||||
|
if (tests > 0)
|
||||||
|
{
|
||||||
|
_suites.push_back(SuiteInfo(name, tests));
|
||||||
|
_cur_suite = &_suites.back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CollectorOutput::suite_end(int tests, const string&, const Time& time)
|
||||||
|
{
|
||||||
|
if (tests > 0)
|
||||||
|
{
|
||||||
|
_cur_suite->_time = time;
|
||||||
|
_total_errors += _cur_suite->_errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CollectorOutput::test_start(const string& name)
|
||||||
|
{
|
||||||
|
_cur_suite->_tests.push_back(TestInfo(name));
|
||||||
|
_cur_test = &_cur_suite->_tests.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CollectorOutput::test_end(const string&, bool ok, const Time& time)
|
||||||
|
{
|
||||||
|
if (!(_cur_test->_success = ok))
|
||||||
|
++_cur_suite->_errors;
|
||||||
|
_cur_test->_time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CollectorOutput::assertment(const Source& s)
|
||||||
|
{
|
||||||
|
_cur_test->_sources.push_back(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
133
tests/cppunit/compileroutput.cpp
Normal file
133
tests/cppunit/compileroutput.cpp
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: compileroutput.cpp,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "cpptest-compileroutput.h"
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// Checks for output format modifiers.
|
||||||
|
//
|
||||||
|
bool
|
||||||
|
check_format(const string& format,
|
||||||
|
string::size_type& pos,
|
||||||
|
const string& mod,
|
||||||
|
int& mod_cnt)
|
||||||
|
{
|
||||||
|
if (format.compare(pos, mod.size(), mod) == 0)
|
||||||
|
{
|
||||||
|
if (++mod_cnt > 1)
|
||||||
|
throw Test::CompilerOutput::InvalidFormat(format);
|
||||||
|
pos += mod.size();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
/// Constructs a compiler output handler.
|
||||||
|
///
|
||||||
|
/// \param format Pre-defined compiler output format.
|
||||||
|
/// \param stream Stream to output to.
|
||||||
|
///
|
||||||
|
CompilerOutput::CompilerOutput(Format format, ostream& stream)
|
||||||
|
: Output(),
|
||||||
|
_stream(stream)
|
||||||
|
{
|
||||||
|
static const char* table[] =
|
||||||
|
{
|
||||||
|
"%file:%line: %text", // Generic
|
||||||
|
"Error cpptest %file %line: %text", // BCC
|
||||||
|
"%file:%line: %text", // GCC
|
||||||
|
"%file(%line) : %text" // MSVC
|
||||||
|
};
|
||||||
|
|
||||||
|
_format = table[format];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Constructs a compiler output handler.
|
||||||
|
///
|
||||||
|
/// \param format %Output format to use.
|
||||||
|
/// \param stream Stream to output to.
|
||||||
|
///
|
||||||
|
/// \exception InvalidFormat Invalid format specified.
|
||||||
|
///
|
||||||
|
CompilerOutput::CompilerOutput(const string& format, ostream& stream)
|
||||||
|
: Output(),
|
||||||
|
_format(format),
|
||||||
|
_stream(stream)
|
||||||
|
{
|
||||||
|
int expr(0), file(0), line(0);
|
||||||
|
|
||||||
|
for (string::size_type pos = 0;
|
||||||
|
(pos = _format.find_first_of('%', pos)) != string::npos; )
|
||||||
|
{
|
||||||
|
++pos;
|
||||||
|
if (check_format(_format, pos, "expr", expr)) ;
|
||||||
|
else if (check_format(_format, pos, "file", file)) ;
|
||||||
|
else if (check_format(_format, pos, "line", line)) ;
|
||||||
|
else
|
||||||
|
throw InvalidFormat(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!expr && !file && !line)
|
||||||
|
throw InvalidFormat(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CompilerOutput::assertment(const Source& s)
|
||||||
|
{
|
||||||
|
string fmt(_format);
|
||||||
|
string::size_type pos;
|
||||||
|
|
||||||
|
fmt.reserve(fmt.size() + 128);
|
||||||
|
|
||||||
|
if ((pos = fmt.find("%file")) != string::npos)
|
||||||
|
fmt.replace(pos, 5, s.file());
|
||||||
|
|
||||||
|
if ((pos = fmt.find("%text")) != string::npos)
|
||||||
|
fmt.replace(pos, 5, s.message());
|
||||||
|
|
||||||
|
if ((pos = fmt.find("%line")) != string::npos)
|
||||||
|
{
|
||||||
|
ostringstream ss;
|
||||||
|
ss << s.line();
|
||||||
|
fmt.replace(pos, 5, ss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
_stream << fmt << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
424
tests/cppunit/cpptest-assert.h
Normal file
424
tests/cppunit/cpptest-assert.h
Normal file
@ -0,0 +1,424 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-assert.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
// Copyright (c) 2010 Nate Gallaher
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_ASSERT_H
|
||||||
|
#define CPPTEST_ASSERT_H
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
/// Unconditional failure.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param msg Provided message.
|
||||||
|
///
|
||||||
|
/// \par Example:
|
||||||
|
/// \code
|
||||||
|
/// void MySuite::test()
|
||||||
|
/// {
|
||||||
|
/// // ...
|
||||||
|
///
|
||||||
|
/// switch (flag)
|
||||||
|
/// {
|
||||||
|
/// // handling valid cases ...
|
||||||
|
///
|
||||||
|
/// default:
|
||||||
|
/// TEST_FAIL("This should not happen")
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// \endcode
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_FAIL(msg) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, (msg) != 0 ? #msg : "")); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and issues an assertment if it fails.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT_MSG(expr, msg)
|
||||||
|
///
|
||||||
|
/// \par Example:
|
||||||
|
/// \code
|
||||||
|
/// void MySuite::test()
|
||||||
|
/// {
|
||||||
|
/// int i;
|
||||||
|
///
|
||||||
|
/// // ...
|
||||||
|
///
|
||||||
|
/// TEST_ASSERT(i == 13)
|
||||||
|
/// }
|
||||||
|
/// \endcode
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_ASSERT(expr) \
|
||||||
|
{ \
|
||||||
|
if (!(expr)) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, #expr)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and issues an assertment if it fails.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
/// \param msg User message.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT(expr)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_ASSERT_MSG(expr, msg) \
|
||||||
|
{ \
|
||||||
|
if (!(expr)) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, msg)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify that two expressions are equal, issues an
|
||||||
|
/// assertment if it fails. Requires the output operator (<<)
|
||||||
|
/// to be defined for both expected and got.
|
||||||
|
///
|
||||||
|
/// If the output operator is not available, you should use
|
||||||
|
/// TEST_ASSERT_EQUALS_OBJ(expected, got).
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expected Expected value.
|
||||||
|
/// \param got Value to test against expected value.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT_EQUALS_MSG(expected, got, msg)
|
||||||
|
/// \see TEST_ASSERT_EQUALS_OBJ(expected, got)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_ASSERT_EQUALS(expected, got) \
|
||||||
|
{ \
|
||||||
|
if (!((got) == (expected))) \
|
||||||
|
{ \
|
||||||
|
std::stringstream tmpstream; \
|
||||||
|
tmpstream << "Got " << (got) << ", expected " << (expected);\
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, \
|
||||||
|
tmpstream.str().c_str())); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify that two expressions are equal, issues an
|
||||||
|
/// assertment if it fails.
|
||||||
|
///
|
||||||
|
/// If the output operator is defined for the objects being compared
|
||||||
|
/// you should use TEST_ASSERT_EQUALS(expected, got) instead for
|
||||||
|
/// more useful failure messages.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expected Expected value.
|
||||||
|
/// \param got Value to test against expected value.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT_EQUALS(expected, got)
|
||||||
|
/// \see TEST_ASSERT_EQUALS_MSG(expected, got, msg)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_ASSERT_EQUALS_OBJ(expected, got) \
|
||||||
|
{ \
|
||||||
|
if (!((got) == (expected))) \
|
||||||
|
{ \
|
||||||
|
std::stringstream tmpstream; \
|
||||||
|
tmpstream << #expected << " object not equal to "; \
|
||||||
|
tmpstream << #got << " object."; \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, \
|
||||||
|
tmpstream.str().c_str())); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify that two expressions are equal, issues an
|
||||||
|
/// assertment if it fails. The output operator (<<) must be defined for the
|
||||||
|
/// object under test. If the output operator is not available, you
|
||||||
|
/// should use TEST_ASSERT_EQUALS_OBJ(expected, got) instead.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expected Expected value.
|
||||||
|
/// \param got Value to test against expected value.
|
||||||
|
/// \param msg User message to print out on failure.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT_EQUALS(expected, got)
|
||||||
|
/// \see TEST_ASSERT_EQUALS_OBJ(expected, got)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
#define TEST_ASSERT_EQUALS_MSG(expected, got, msg) \
|
||||||
|
{ \
|
||||||
|
if (!((got) == (expected))) \
|
||||||
|
{ \
|
||||||
|
std::stringstream tmpstream; \
|
||||||
|
tmpstream << (msg) << ": "; \
|
||||||
|
tmpstream << "Got " << (got) << ", expected " << (expected);\
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, \
|
||||||
|
tmpstream.str().c_str())); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify that two expressions are equal up to a constant, issues an
|
||||||
|
/// assertment if it fails.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param a First expression to test.
|
||||||
|
/// \param b Second expression to test.
|
||||||
|
/// \param delta Constant.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT_DELTA_MSG(a, b, delta, msg)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_ASSERT_DELTA(a, b, delta) \
|
||||||
|
{ \
|
||||||
|
if (((b) < (a) - (delta)) || ((b) > (a) + (delta))) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, \
|
||||||
|
"delta(" #a ", " #b ", " #delta ")" )); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify that two expressions are equal up to a constant, issues an
|
||||||
|
/// assertment if it fails.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param a First expression to test.
|
||||||
|
/// \param b Second expression to test.
|
||||||
|
/// \param delta Constant.
|
||||||
|
/// \param msg User message.
|
||||||
|
///
|
||||||
|
/// \see TEST_ASSERT_DELTA(a, b, delta)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_ASSERT_DELTA_MSG(a, b, delta, msg) \
|
||||||
|
{ \
|
||||||
|
if (((b) < (a) - (delta)) || ((b) > (a) + (delta))) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, msg)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and expects an exception in return.
|
||||||
|
/// An assertment is issued if the exception is not thrown.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
/// \param x Expected exception.
|
||||||
|
///
|
||||||
|
/// \see TEST_THROWS_MSG(expr, x, msg)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_THROWS(expr, x) \
|
||||||
|
{ \
|
||||||
|
bool __expected = false; \
|
||||||
|
try { expr; } \
|
||||||
|
catch (x) { __expected = true; } \
|
||||||
|
catch (...) {} \
|
||||||
|
if (!__expected) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, #expr)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and expects an exception in return.
|
||||||
|
/// An assertment is issued if the exception is not thrown.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
/// \param x Expected exception.
|
||||||
|
/// \param msg User message.
|
||||||
|
///
|
||||||
|
/// \see TEST_THROWS(expr, x)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_THROWS_MSG(expr, x, msg) \
|
||||||
|
{ \
|
||||||
|
bool __expected = false; \
|
||||||
|
try { expr; } \
|
||||||
|
catch (x) { __expected = true; } \
|
||||||
|
catch (...) {} \
|
||||||
|
if (!__expected) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, msg)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and expects any exception in return.
|
||||||
|
/// An assertment is issued if no exception is thrown.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
///
|
||||||
|
/// \see TEST_THROWS_ANYTHING_MSG(expr, msg)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_THROWS_ANYTHING(expr) \
|
||||||
|
{ \
|
||||||
|
bool __expected = false; \
|
||||||
|
try { expr; } \
|
||||||
|
catch (...) { __expected = true; } \
|
||||||
|
if (!__expected) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, #expr)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and expects any exception in return.
|
||||||
|
/// An assertment is issued if no exception is thrown.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
/// \param msg User message.
|
||||||
|
///
|
||||||
|
/// \see TEST_THROWS_ANYTHING(expr)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_THROWS_ANYTHING_MSG(expr, msg) \
|
||||||
|
{ \
|
||||||
|
bool __expected = false; \
|
||||||
|
try { expr; } \
|
||||||
|
catch (...) { __expected = true; } \
|
||||||
|
if (!__expected) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, msg)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and expects no exception in return.
|
||||||
|
/// An assertment is issued if any exception is thrown.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
///
|
||||||
|
/// \see TEST_THROWS_NOTHING_MSG(expr, msg)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_THROWS_NOTHING(expr) \
|
||||||
|
{ \
|
||||||
|
bool __expected = true; \
|
||||||
|
try { expr; } \
|
||||||
|
catch (...) { __expected = false; } \
|
||||||
|
if (!__expected) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, #expr)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Verify an expression and expects no exception in return.
|
||||||
|
/// An assertment is issued if any exception is thrown.
|
||||||
|
///
|
||||||
|
/// Used in conjunction with Test::Suite.
|
||||||
|
///
|
||||||
|
/// \param expr Expression to test.
|
||||||
|
/// \param msg User message.
|
||||||
|
///
|
||||||
|
/// \see TEST_THROWS_NOTHING(expr)
|
||||||
|
///
|
||||||
|
/// For a description of all asserts, see \ref asserts.
|
||||||
|
///
|
||||||
|
#define TEST_THROWS_NOTHING_MSG(expr, msg) \
|
||||||
|
{ \
|
||||||
|
bool __expected = true; \
|
||||||
|
try { expr; } \
|
||||||
|
catch (...) { __expected = false; } \
|
||||||
|
if (!__expected) \
|
||||||
|
{ \
|
||||||
|
assertment(::Test::Source(__FILE__, __LINE__, msg)); \
|
||||||
|
if (!continue_after_failure()) return; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \page asserts Available asserts
|
||||||
|
///
|
||||||
|
/// Normally, assert macros issues an assert if the given expression, if any,
|
||||||
|
/// fails (as defined by the macro). Assertments include information about the
|
||||||
|
/// current test suite, test function, source file, source file line, and a
|
||||||
|
/// message. The message is normally the offending expression, however, for
|
||||||
|
/// macros ending in _MSG it is possibly to supply a user defined message.
|
||||||
|
///
|
||||||
|
/// <b>General asserts</b>
|
||||||
|
/// - TEST_FAIL(msg)
|
||||||
|
///
|
||||||
|
/// <b>Comparision asserts</b>
|
||||||
|
/// - TEST_ASSERT(expr)
|
||||||
|
/// - TEST_ASSERT_MSG(expr, msg)
|
||||||
|
/// - TEST_ASSERT_EQUALS(expected, got)
|
||||||
|
/// - TEST_ASSERT_EQUALS_MSG(expected, got, msg)
|
||||||
|
/// - TEST_ASSERT_EQUALS_OBJ(expected, got)
|
||||||
|
/// - TEST_ASSERT_DELTA(a, b, delta)
|
||||||
|
/// - TEST_ASSERT_DELTA_MSG(a, b, delta, msg)
|
||||||
|
///
|
||||||
|
/// <b>Exception asserts</b>
|
||||||
|
/// - TEST_THROWS(expr, x)
|
||||||
|
/// - TEST_THROWS_MSG(expr, x, msg)
|
||||||
|
/// - TEST_THROWS_ANYTHING(expr)
|
||||||
|
/// - TEST_THROWS_ANYTHING_MSG(expr, msg)
|
||||||
|
/// - TEST_THROWS_NOTHING(expr)
|
||||||
|
/// - TEST_THROWS_NOTHING_MSG(expr, msg)
|
||||||
|
///
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_ASSERT_H
|
||||||
|
|
||||||
106
tests/cppunit/cpptest-collectoroutput.h
Normal file
106
tests/cppunit/cpptest-collectoroutput.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-collectoroutput.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_COLLECTOROUTPUT_H
|
||||||
|
#define CPPTEST_COLLECTOROUTPUT_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "cpptest-output.h"
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
#include "cpptest-time.h"
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
/// \brief Collector output.
|
||||||
|
///
|
||||||
|
/// Base class for output handlers that need to report status when all
|
||||||
|
/// tests have executed.
|
||||||
|
///
|
||||||
|
class CollectorOutput : public Output
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void finished(int tests, const Time& time);
|
||||||
|
virtual void suite_start(int tests, const std::string& name);
|
||||||
|
virtual void suite_end(int tests, const std::string& name,
|
||||||
|
const Time& time);
|
||||||
|
virtual void test_start(const std::string& name);
|
||||||
|
virtual void test_end(const std::string& name, bool ok,
|
||||||
|
const Time& time);
|
||||||
|
virtual void assertment(const Source& s);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
struct OutputSuiteInfo;
|
||||||
|
struct OutputTestInfo;
|
||||||
|
struct OutputErrorTestInfo;
|
||||||
|
|
||||||
|
typedef std::list<Source> Sources;
|
||||||
|
|
||||||
|
struct TestInfo
|
||||||
|
{
|
||||||
|
std::string _name;
|
||||||
|
Time _time;
|
||||||
|
|
||||||
|
bool _success : 1;
|
||||||
|
Sources _sources;
|
||||||
|
|
||||||
|
explicit TestInfo(const std::string name);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<TestInfo> Tests;
|
||||||
|
|
||||||
|
struct SuiteInfo
|
||||||
|
{
|
||||||
|
std::string _name;
|
||||||
|
int _errors;
|
||||||
|
Tests _tests;
|
||||||
|
Time _time;
|
||||||
|
|
||||||
|
SuiteInfo(const std::string& name, int tests);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<SuiteInfo> Suites;
|
||||||
|
|
||||||
|
Suites _suites;
|
||||||
|
int _total_errors;
|
||||||
|
int _total_tests;
|
||||||
|
Time _total_time;
|
||||||
|
|
||||||
|
CollectorOutput();
|
||||||
|
|
||||||
|
private:
|
||||||
|
SuiteInfo* _cur_suite;
|
||||||
|
TestInfo* _cur_test;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_COLLECTOROUTPUT_H
|
||||||
|
|
||||||
112
tests/cppunit/cpptest-compileroutput.h
Normal file
112
tests/cppunit/cpptest-compileroutput.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-compileroutput.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_COMPILEROUTPUT_H
|
||||||
|
#define CPPTEST_COMPILEROUTPUT_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "cpptest-output.h"
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
/// \brief Compiler-like output handler.
|
||||||
|
///
|
||||||
|
/// %Test suite output handler that only outputs failures in compiler
|
||||||
|
/// warning/error format. This way, you can use your IDE to browse between
|
||||||
|
/// failures.
|
||||||
|
///
|
||||||
|
/// The output format is configurable to be able to emulate different
|
||||||
|
/// compiler outputs. The following modifiers exist:
|
||||||
|
/// - \e %file Outputs the file containing the test function.
|
||||||
|
/// - \e %line Line number for the the test function.
|
||||||
|
/// - \e %text Expression (or message) that caused the assertment.
|
||||||
|
/// Note that each modifier can only be specified once.
|
||||||
|
///
|
||||||
|
class CompilerOutput : public Output
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \brief Compiler output exception.
|
||||||
|
///
|
||||||
|
/// Indicates that an invalid message format was given when creating
|
||||||
|
/// a compiler output. The failing format may be retrieved using the
|
||||||
|
/// what() method.
|
||||||
|
///
|
||||||
|
class InvalidFormat : public std::logic_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InvalidFormat(const std::string& what)
|
||||||
|
: std::logic_error(what) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Pre-defined compiler output formats.
|
||||||
|
///
|
||||||
|
enum Format
|
||||||
|
{
|
||||||
|
/// Generic compiler format, which equals:
|
||||||
|
/// <tt>%%file:%%line: %%text</tt>
|
||||||
|
///
|
||||||
|
Generic,
|
||||||
|
|
||||||
|
/// <a href="http://www.borland.com/products/downloads/download_cbuilder.html">
|
||||||
|
/// Borland C++ Compiler</a> (BCC) format, which equals:
|
||||||
|
/// <tt>Error cpptest %%file %%line: %%text</tt>.
|
||||||
|
///
|
||||||
|
BCC,
|
||||||
|
|
||||||
|
/// <a href="http://gcc.gnu.org">GNU Compiler Collection</a>
|
||||||
|
/// (GCC) format, which equals:
|
||||||
|
/// <tt>%%file:%%line: %%text</tt>
|
||||||
|
///
|
||||||
|
GCC,
|
||||||
|
|
||||||
|
/// <a href="http://www.microsoft.com">Microsoft Visual C++</a>
|
||||||
|
/// (MSVC) format, which equals:
|
||||||
|
/// <tt>%%file(%%line) : %%text</tt>
|
||||||
|
///
|
||||||
|
MSVC
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit CompilerOutput(Format format = Generic,
|
||||||
|
std::ostream& stream = std::cout);
|
||||||
|
|
||||||
|
explicit CompilerOutput(const std::string& format,
|
||||||
|
std::ostream& stream = std::cout);
|
||||||
|
|
||||||
|
virtual void assertment(const Source& s);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string _format;
|
||||||
|
std::ostream& _stream;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_COMPILEROUTPUT_H
|
||||||
|
|
||||||
64
tests/cppunit/cpptest-htmloutput.h
Normal file
64
tests/cppunit/cpptest-htmloutput.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-htmloutput.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_HTMLOUTPUT_H
|
||||||
|
#define CPPTEST_HTMLOUTPUT_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "cpptest-collectoroutput.h"
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
/// \brief HTML output.
|
||||||
|
///
|
||||||
|
/// %Output handler that creates a HTML table with detailed information
|
||||||
|
/// about all tests.
|
||||||
|
///
|
||||||
|
class HtmlOutput : public CollectorOutput
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void generate(std::ostream& os, bool incl_ok_tests = true,
|
||||||
|
const std::string& name = "");
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct SuiteRow;
|
||||||
|
struct TestRow;
|
||||||
|
struct TestSuiteRow;
|
||||||
|
struct TestResult;
|
||||||
|
struct TestResultAll;
|
||||||
|
struct SuiteTestResult;
|
||||||
|
|
||||||
|
friend struct TestSuiteRow;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_HTMLOUTPUT_H
|
||||||
|
|
||||||
152
tests/cppunit/cpptest-output.h
Normal file
152
tests/cppunit/cpptest-output.h
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-output.h,v 1.7 2008/07/15 21:20:26 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_OUTPUT_H
|
||||||
|
#define CPPTEST_OUTPUT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define CPPTEST_UNUSED(x)
|
||||||
|
#else
|
||||||
|
# define CPPTEST_UNUSED(x) (void)x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
class Source;
|
||||||
|
class Time;
|
||||||
|
|
||||||
|
/// \brief %Test suite output handler.
|
||||||
|
///
|
||||||
|
/// Abstract base class for all suite output handlers. Derive from this
|
||||||
|
/// class to create real output handlers that creates arbitrary complex
|
||||||
|
/// output handlers.
|
||||||
|
///
|
||||||
|
/// All parts of testing is reported (test start/stop, suite start/stop,
|
||||||
|
/// individual test start/stop, and assertments), thus giving maximum
|
||||||
|
/// flexibility for derived classes.
|
||||||
|
///
|
||||||
|
class Output
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Empty destructor.
|
||||||
|
///
|
||||||
|
virtual ~Output() {}
|
||||||
|
|
||||||
|
/// Called when testing is started.
|
||||||
|
///
|
||||||
|
/// \param tests Total number of tests in all suites.
|
||||||
|
///
|
||||||
|
virtual void initialize(int tests)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(tests);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Called when testing is finished.
|
||||||
|
///
|
||||||
|
/// \param tests Total number of tests in all suites.
|
||||||
|
/// \param time Total elapsed time for all tests.
|
||||||
|
///
|
||||||
|
virtual void finished(int tests, const Time& time)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(tests);
|
||||||
|
CPPTEST_UNUSED(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Called when a suite is entered.
|
||||||
|
///
|
||||||
|
/// \param tests Number of tests in this suite.
|
||||||
|
/// \param name Name of the suite.
|
||||||
|
///
|
||||||
|
virtual void suite_start(int tests, const std::string& name)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(tests);
|
||||||
|
CPPTEST_UNUSED(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Called when a suite is finished.
|
||||||
|
///
|
||||||
|
/// \param tests Number of tests in this suite.
|
||||||
|
/// \param name Name of the suite.
|
||||||
|
/// \param time Total elapsed time for all tests in this suite.
|
||||||
|
///
|
||||||
|
virtual void suite_end(int tests, const std::string& name,
|
||||||
|
const Time& time)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(tests);
|
||||||
|
CPPTEST_UNUSED(name);
|
||||||
|
CPPTEST_UNUSED(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Called when a tests is executed.
|
||||||
|
///
|
||||||
|
/// \param name Name of the test function.
|
||||||
|
///
|
||||||
|
virtual void test_start(const std::string& name)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Called when a test if finished, regardless if an assertment was
|
||||||
|
/// issued.
|
||||||
|
///
|
||||||
|
/// \param name Name of the test function.
|
||||||
|
/// \param ok True if the test was successful; false otherwise.
|
||||||
|
/// \param time Execution time.
|
||||||
|
///
|
||||||
|
virtual void test_end(const std::string& name, bool ok,
|
||||||
|
const Time& time)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(name);
|
||||||
|
CPPTEST_UNUSED(ok);
|
||||||
|
CPPTEST_UNUSED(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Called when an assertment is issued.
|
||||||
|
///
|
||||||
|
/// \param s Assert point information.
|
||||||
|
///
|
||||||
|
virtual void assertment(const Source& s)
|
||||||
|
{
|
||||||
|
CPPTEST_UNUSED(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Empty constructor.
|
||||||
|
///
|
||||||
|
Output() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Output(const Output&);
|
||||||
|
Output& operator=(const Output&);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_OUTPUT_H
|
||||||
67
tests/cppunit/cpptest-source.h
Normal file
67
tests/cppunit/cpptest-source.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-source.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_SOURCE_H
|
||||||
|
#define CPPTEST_SOURCE_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
class Suite;
|
||||||
|
|
||||||
|
/// \brief Assertment source information.
|
||||||
|
///
|
||||||
|
/// Contains information about an assertment point.
|
||||||
|
///
|
||||||
|
class Source
|
||||||
|
{
|
||||||
|
friend class Suite;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Source();
|
||||||
|
Source(const char* file, unsigned int line, const char* msg);
|
||||||
|
|
||||||
|
const std::string& file() const;
|
||||||
|
unsigned int line() const;
|
||||||
|
const std::string& message() const;
|
||||||
|
const std::string& suite() const;
|
||||||
|
const std::string& test() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int _line;
|
||||||
|
std::string _file;
|
||||||
|
std::string _msg;
|
||||||
|
std::string _suite;
|
||||||
|
std::string _test;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_SOURCE_H
|
||||||
|
|
||||||
140
tests/cppunit/cpptest-suite.h
Normal file
140
tests/cppunit/cpptest-suite.h
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-suite.h,v 1.4 2010/03/26 04:45:14 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_SUITE_H
|
||||||
|
#define CPPTEST_SUITE_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "cpptest-time.h"
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
class Output;
|
||||||
|
|
||||||
|
/// \brief Unit testing suite.
|
||||||
|
///
|
||||||
|
/// Base class for all suites. Derive from this class to create own
|
||||||
|
/// test suites.
|
||||||
|
///
|
||||||
|
/// %Test functions in derived classes are registered as tests using the
|
||||||
|
/// TEST_ADD(func). Testing is started by run(). Note that suites may be
|
||||||
|
/// embedded in other suites using add().
|
||||||
|
///
|
||||||
|
class Suite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Suite();
|
||||||
|
virtual ~Suite();
|
||||||
|
|
||||||
|
void add(std::auto_ptr<Suite> suite);
|
||||||
|
|
||||||
|
bool run(Output& output, bool cont_after_fail = true);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Pointer to a test function.
|
||||||
|
///
|
||||||
|
typedef void (Suite::*Func)();
|
||||||
|
|
||||||
|
bool continue_after_failure() const { return _continue; }
|
||||||
|
|
||||||
|
virtual void setup() {}
|
||||||
|
virtual void tear_down() {}
|
||||||
|
|
||||||
|
void register_test(Func func, const std::string& name);
|
||||||
|
void assertment(Source s);
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct DoRun;
|
||||||
|
struct ExecTests;
|
||||||
|
struct SubSuiteTests;
|
||||||
|
struct SuiteTime;
|
||||||
|
struct SubSuiteTime;
|
||||||
|
|
||||||
|
friend struct DoRun;
|
||||||
|
friend struct ExecTests;
|
||||||
|
friend struct SubSuiteTests;
|
||||||
|
friend struct SubSuiteTime;
|
||||||
|
|
||||||
|
struct Data
|
||||||
|
{
|
||||||
|
Func _func;
|
||||||
|
std::string _name;
|
||||||
|
Time _time;
|
||||||
|
|
||||||
|
Data(Func func, const std::string& name)
|
||||||
|
: _func(func), _name(name) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<Data> Tests;
|
||||||
|
typedef std::list<Suite*> Suites;
|
||||||
|
|
||||||
|
std::string _name; // Suite name
|
||||||
|
const std::string* _cur_test; // Current test func name
|
||||||
|
Suites _suites; // External test suites
|
||||||
|
Tests _tests; // All tests
|
||||||
|
Output* _output; // Output handler
|
||||||
|
bool _result : 1; // Test result
|
||||||
|
bool _success : 1; // Set if no test failed
|
||||||
|
bool _continue : 1; // Continue func after failures
|
||||||
|
|
||||||
|
void do_run(Output* os, bool cont_after_fail);
|
||||||
|
int total_tests() const;
|
||||||
|
Time total_time(bool recursive) const;
|
||||||
|
|
||||||
|
// Disable
|
||||||
|
//
|
||||||
|
Suite(const Suite&);
|
||||||
|
Suite& operator=(const Suite&);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Adds a test function to the enclosing suite. Note that test functions
|
||||||
|
/// should be added in the suites constructor.
|
||||||
|
///
|
||||||
|
/// \param func Function to add, must be of type Suite::Func.
|
||||||
|
///
|
||||||
|
/// \par Example:
|
||||||
|
/// \code
|
||||||
|
/// MySuite::MySuite()
|
||||||
|
/// {
|
||||||
|
/// TEST_ADD(&MySuite::test_1)
|
||||||
|
/// TEST_ADD(&MySuite::test_2)
|
||||||
|
/// ...
|
||||||
|
/// }
|
||||||
|
/// \endcode
|
||||||
|
///
|
||||||
|
#define TEST_ADD(func)\
|
||||||
|
register_test(static_cast<Func>(&func), #func);
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_SUITE_H
|
||||||
|
|
||||||
88
tests/cppunit/cpptest-textoutput.h
Normal file
88
tests/cppunit/cpptest-textoutput.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-textoutput.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_TEXTOUTPUT_H
|
||||||
|
#define CPPTEST_TEXTOUTPUT_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
#include "cpptest-output.h"
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
/// \brief Text output handler that outputs to the a stream.
|
||||||
|
///
|
||||||
|
/// %Test suite output handler that writes its information as text to a
|
||||||
|
/// a stream. It it possible to select between two different operational
|
||||||
|
/// modes that controls the detail level, see Mode.
|
||||||
|
///
|
||||||
|
class TextOutput : public Output
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Output mode.
|
||||||
|
///
|
||||||
|
enum Mode
|
||||||
|
{
|
||||||
|
/// Terse output mode, which only shows the number of correct tests.
|
||||||
|
///
|
||||||
|
Terse,
|
||||||
|
|
||||||
|
/// Verbose output mode, which also shows extended assert
|
||||||
|
/// information for each test that failed.
|
||||||
|
///
|
||||||
|
Verbose
|
||||||
|
};
|
||||||
|
|
||||||
|
TextOutput(Mode mode, std::ostream& stream = std::cout);
|
||||||
|
|
||||||
|
virtual void finished(int tests, const Time& time);
|
||||||
|
virtual void suite_start(int tests, const std::string& name);
|
||||||
|
virtual void suite_end(int tests, const std::string& name,
|
||||||
|
const Time& time);
|
||||||
|
virtual void test_end(const std::string& name, bool ok,
|
||||||
|
const Time& time);
|
||||||
|
virtual void assertment(const Source& s);
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef std::list<Source> ErrorList;
|
||||||
|
|
||||||
|
Mode _mode;
|
||||||
|
std::ostream& _stream;
|
||||||
|
ErrorList _suite_error_list;
|
||||||
|
std::string _suite_name;
|
||||||
|
int _suite_errors;
|
||||||
|
int _suite_tests;
|
||||||
|
int _suite_total_tests;
|
||||||
|
int _total_errors;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_TEXTOUTPUT_H
|
||||||
66
tests/cppunit/cpptest-time.h
Normal file
66
tests/cppunit/cpptest-time.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest-time.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_TIME_H
|
||||||
|
#define CPPTEST_TIME_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
/// \brief %Time representation.
|
||||||
|
///
|
||||||
|
/// Encapsulates a time value with microsecond resolution. It is possible
|
||||||
|
/// to retrieve the current time, add and subtract time values, and output
|
||||||
|
/// the time to an output stream.
|
||||||
|
///
|
||||||
|
class Time
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Time();
|
||||||
|
Time(unsigned int sec, unsigned int usec);
|
||||||
|
|
||||||
|
unsigned int seconds() const;
|
||||||
|
unsigned int microseconds() const;
|
||||||
|
|
||||||
|
static Time current();
|
||||||
|
|
||||||
|
friend Time operator+(const Time& t1, const Time& t2);
|
||||||
|
friend Time operator-(const Time& t1, const Time& t2);
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& os, const Time& t);
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int _sec;
|
||||||
|
unsigned int _usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_TIME_H
|
||||||
42
tests/cppunit/cpptest.h
Normal file
42
tests/cppunit/cpptest.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: cpptest.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
|
||||||
|
#ifndef CPPTEST_H
|
||||||
|
#define CPPTEST_H
|
||||||
|
|
||||||
|
#include "cpptest-assert.h"
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
#include "cpptest-suite.h"
|
||||||
|
#include "cpptest-time.h"
|
||||||
|
|
||||||
|
#include "cpptest-compileroutput.h"
|
||||||
|
#include "cpptest-htmloutput.h"
|
||||||
|
#include "cpptest-textoutput.h"
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_H
|
||||||
|
|
||||||
453
tests/cppunit/htmloutput.cpp
Normal file
453
tests/cppunit/htmloutput.cpp
Normal file
@ -0,0 +1,453 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: htmloutput.cpp,v 1.7 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cpptest-htmloutput.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
void
|
||||||
|
strreplace(string &value, char search, const string &replace)
|
||||||
|
{
|
||||||
|
string::size_type idx = 0;
|
||||||
|
while((idx = value.find(search, idx)) != string::npos)
|
||||||
|
{
|
||||||
|
value.replace(idx, 1, replace);
|
||||||
|
idx += replace.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
escape(string value)
|
||||||
|
{
|
||||||
|
strreplace(value, '&', "&");
|
||||||
|
strreplace(value, '<', "<");
|
||||||
|
strreplace(value, '>', ">");
|
||||||
|
strreplace(value, '"', """);
|
||||||
|
strreplace(value, '\'', "'");
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
header(ostream& os, string name)
|
||||||
|
{
|
||||||
|
if (!name.empty())
|
||||||
|
name += " ";
|
||||||
|
name = escape(name);
|
||||||
|
os <<
|
||||||
|
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
|
||||||
|
"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"
|
||||||
|
"<head>\n"
|
||||||
|
" <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n"
|
||||||
|
" <meta name=\"generator\" content=\"CppTest - http://cpptest.sourceforge.net\" />\n"
|
||||||
|
" \n"
|
||||||
|
" <title>" << name << "Unit Tests Results</title>\n"
|
||||||
|
" \n"
|
||||||
|
" <style type=\"text/css\" media=\"screen\">\n"
|
||||||
|
" <!--\n"
|
||||||
|
" hr {\n"
|
||||||
|
" width: 100%;\n"
|
||||||
|
" border-width: 0px;\n"
|
||||||
|
" height: 1px;\n"
|
||||||
|
" color: #cccccc;\n"
|
||||||
|
" background-color: #cccccc;\n"
|
||||||
|
" padding: 0px;\n"
|
||||||
|
" }\n"
|
||||||
|
" \n"
|
||||||
|
" table {\n"
|
||||||
|
" width:100%;\n"
|
||||||
|
" border-collapse:separate;\n"
|
||||||
|
" border-spacing: 2px;\n"
|
||||||
|
" border:0px;\n"
|
||||||
|
" }\n"
|
||||||
|
" tr {\n"
|
||||||
|
" margin:0px;\n"
|
||||||
|
" padding:0px;\n"
|
||||||
|
" }\n"
|
||||||
|
" td {\n"
|
||||||
|
" margin:0px;\n"
|
||||||
|
" padding:1px;\n"
|
||||||
|
" }\n"
|
||||||
|
" .table_summary {\n"
|
||||||
|
" }\n"
|
||||||
|
" .table_suites {\n"
|
||||||
|
" }\n"
|
||||||
|
" .table_suite {\n"
|
||||||
|
" }\n"
|
||||||
|
" .table_result {\n"
|
||||||
|
" margin: 0px 0px 1em 0px;\n"
|
||||||
|
" }\n"
|
||||||
|
" .tablecell_title {\n"
|
||||||
|
" background-color: #a5cef7;\n"
|
||||||
|
" font-weight: bold;\n"
|
||||||
|
" }\n"
|
||||||
|
" \n"
|
||||||
|
" .tablecell_success {\n"
|
||||||
|
" background-color: #efefe7;\n"
|
||||||
|
" }\n"
|
||||||
|
" \n"
|
||||||
|
" .tablecell_error {\n"
|
||||||
|
" color: #ff0808;\n"
|
||||||
|
" background-color: #efefe7;\n"
|
||||||
|
" font-weight: bold;\n"
|
||||||
|
" }\n"
|
||||||
|
" p.spaced {\n"
|
||||||
|
" margin: 0px;\n"
|
||||||
|
" padding: 1em 0px 2em 0px;\n"
|
||||||
|
" }\n"
|
||||||
|
" p.unspaced {\n"
|
||||||
|
" margin: 0px;\n"
|
||||||
|
" padding: 0px 0px 2em 0px;\n"
|
||||||
|
" }\n"
|
||||||
|
" -->\n"
|
||||||
|
" </style>\n"
|
||||||
|
"</head>\n"
|
||||||
|
"\n"
|
||||||
|
"<body>\n"
|
||||||
|
"\n"
|
||||||
|
"<h1><a name=\"top\"></a>" << name << "Unit Tests Results</h1>\n"
|
||||||
|
"\n"
|
||||||
|
"<div style=\"text-align:right\">\n"
|
||||||
|
"Designed by <a href=\"http://cpptest.sourceforge.net\">CppTest</a>\n"
|
||||||
|
"</div>\n"
|
||||||
|
"<hr />\n"
|
||||||
|
"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
footer(ostream& os)
|
||||||
|
{
|
||||||
|
os <<
|
||||||
|
"\n"
|
||||||
|
"<p>\n"
|
||||||
|
" <a href=\"http://validator.w3.org/#validate-by-upload\">\n"
|
||||||
|
" Valid XHTML 1.0 Strict\n"
|
||||||
|
" </a>\n"
|
||||||
|
"</p>\n"
|
||||||
|
"</body>\n</html>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
back_ref(ostream& os, const string& ref, bool prepend_newline = true)
|
||||||
|
{
|
||||||
|
|
||||||
|
os << "<p class=\"" << (prepend_newline ? "spaced" : "unspaced") << "\"><a href=\"#" << ref
|
||||||
|
<< "\">Back to " << escape(ref) << "</a>\n</p>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sub_title(ostream& os, const string& title, int size)
|
||||||
|
{
|
||||||
|
ostringstream h;
|
||||||
|
h << "h" << size;
|
||||||
|
os << "<" << h.str() << ">" << escape(title) << "</" << h.str() << ">\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sub_title(ostream& os, const string& title, int size, const string& mark)
|
||||||
|
{
|
||||||
|
ostringstream h;
|
||||||
|
h << "h" << size;
|
||||||
|
os << "<" << h.str() << "><a name=\"" << mark << "\"></a>" << escape(title) << "</" << h.str() << ">\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ClassTableType { TableClass_Summary, TableClass_Suites, TableClass_Suite, TableClass_Result };
|
||||||
|
|
||||||
|
void
|
||||||
|
table_header(ostream& os, ClassTableType type, const string &summary = "")
|
||||||
|
{
|
||||||
|
static const char* class_tabletypes[] = { "summary", "suites", "suite", "result" };
|
||||||
|
|
||||||
|
os << "<table summary=\"" << escape(summary) << "\" class=\"table_" << class_tabletypes[type] << "\">\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
table_footer(ostream& os)
|
||||||
|
{
|
||||||
|
os << "</table>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
table_tr_header(ostream& os)
|
||||||
|
{
|
||||||
|
os << " <tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
table_tr_footer(ostream& os)
|
||||||
|
{
|
||||||
|
os << " </tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ClassType { Title, Success, Error };
|
||||||
|
|
||||||
|
void
|
||||||
|
table_entry(ostream& os, ClassType type, const string& s,
|
||||||
|
int width = 0, const string& link = "")
|
||||||
|
{
|
||||||
|
static const char* class_types[] = { "title", "success", "error" };
|
||||||
|
|
||||||
|
os << " <td";
|
||||||
|
if (width)
|
||||||
|
os << " style=\"width:" << width << "%\"";
|
||||||
|
if (!link.empty())
|
||||||
|
os << " class=\"tablecell_" << class_types[type] << "\"><a href=\"#" << link << "\">" << escape(s) << "</a>";
|
||||||
|
else
|
||||||
|
os << " class=\"tablecell_" << class_types[type] << "\">" << escape(s);
|
||||||
|
os << "</td>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
// Test suite table
|
||||||
|
//
|
||||||
|
struct HtmlOutput::SuiteRow
|
||||||
|
{
|
||||||
|
ostream& _os;
|
||||||
|
SuiteRow(ostream& os) : _os(os) {}
|
||||||
|
void operator()(const SuiteInfo& si)
|
||||||
|
{
|
||||||
|
ClassType type(si._errors > 0 ? Error : Success);
|
||||||
|
ostringstream ss;
|
||||||
|
|
||||||
|
table_tr_header(_os);
|
||||||
|
table_entry(_os, type, si._name, 0, si._name);
|
||||||
|
ss.str(""), ss << si._tests.size();
|
||||||
|
table_entry(_os, type, ss.str(), 10);
|
||||||
|
ss.str(""), ss << si._errors;
|
||||||
|
table_entry(_os, type, ss.str(), 10);
|
||||||
|
ss.str(""), ss << correct(si._tests.size(), si._errors) << "%";
|
||||||
|
table_entry(_os, type, ss.str(), 10);
|
||||||
|
ss.str(""), ss << si._time;
|
||||||
|
table_entry(_os, type, ss.str(), 10);
|
||||||
|
table_tr_footer(_os);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Individual tests tables, tests
|
||||||
|
//
|
||||||
|
struct HtmlOutput::TestRow
|
||||||
|
{
|
||||||
|
bool _incl_ok_tests;
|
||||||
|
ostream& _os;
|
||||||
|
TestRow(ostream& os, bool incl_ok_tests)
|
||||||
|
: _incl_ok_tests(incl_ok_tests), _os(os) {}
|
||||||
|
void operator()(const TestInfo& ti)
|
||||||
|
{
|
||||||
|
if (!ti._success || _incl_ok_tests)
|
||||||
|
{
|
||||||
|
string link = ti._success ? string(""):
|
||||||
|
ti._sources.front().suite() + "_" + ti._name;
|
||||||
|
ClassType type(ti._success ? Success : Error);
|
||||||
|
ostringstream ss;
|
||||||
|
|
||||||
|
table_tr_header(_os);
|
||||||
|
table_entry(_os, type, ti._name, 0, link);
|
||||||
|
ss.str(""), ss << ti._sources.size();
|
||||||
|
table_entry(_os, type, ss.str());
|
||||||
|
table_entry(_os, type, ti._success ? "true" : "false");
|
||||||
|
ss.str(""), ss << ti._time;
|
||||||
|
table_entry(_os, type, ss.str());
|
||||||
|
table_tr_footer(_os);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Individual tests tables, header
|
||||||
|
//
|
||||||
|
struct HtmlOutput::TestSuiteRow
|
||||||
|
{
|
||||||
|
bool _incl_ok_tests;
|
||||||
|
ostream& _os;
|
||||||
|
TestSuiteRow(ostream& os, bool incl_ok_tests)
|
||||||
|
: _incl_ok_tests(incl_ok_tests), _os(os) {}
|
||||||
|
void operator()(const SuiteInfo& si)
|
||||||
|
{
|
||||||
|
ostringstream ss;
|
||||||
|
|
||||||
|
sub_title(_os, "Suite: " + si._name, 3, si._name);
|
||||||
|
table_header(_os, TableClass_Suite, "Details for suite " + si._name);
|
||||||
|
table_tr_header(_os);
|
||||||
|
table_entry(_os, Title, "Name");
|
||||||
|
table_entry(_os, Title, "Errors", 10);
|
||||||
|
table_entry(_os, Title, "Success", 10);
|
||||||
|
table_entry(_os, Title, "Time (s)", 10);
|
||||||
|
table_tr_footer(_os);
|
||||||
|
for_each(si._tests.begin(), si._tests.end(),
|
||||||
|
TestRow(_os, _incl_ok_tests));
|
||||||
|
table_footer(_os);
|
||||||
|
back_ref(_os, "top");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Individual tests result tables
|
||||||
|
//
|
||||||
|
struct HtmlOutput::TestResult
|
||||||
|
{
|
||||||
|
ostream& _os;
|
||||||
|
TestResult(ostream& os) : _os(os) {}
|
||||||
|
void operator()(const Source& s)
|
||||||
|
{
|
||||||
|
const int TitleSize = 15;
|
||||||
|
|
||||||
|
ostringstream ss;
|
||||||
|
|
||||||
|
table_header(_os, TableClass_Result, "Test Failure");
|
||||||
|
table_tr_header(_os);
|
||||||
|
table_entry(_os, Title, "Test", TitleSize);
|
||||||
|
table_entry(_os, Success, s.suite() + "::" + s.test());
|
||||||
|
table_tr_footer(_os);
|
||||||
|
table_tr_header(_os);
|
||||||
|
table_entry(_os, Title, "File", TitleSize);
|
||||||
|
ss << s.file() << ":" << s.line();
|
||||||
|
table_entry(_os, Success, ss.str());
|
||||||
|
table_tr_footer(_os);
|
||||||
|
table_tr_header(_os);
|
||||||
|
table_entry(_os, Title, "Message", TitleSize);
|
||||||
|
table_entry(_os, Success, s.message());
|
||||||
|
table_tr_footer(_os);
|
||||||
|
table_footer(_os);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// All tests result tables
|
||||||
|
//
|
||||||
|
struct HtmlOutput::TestResultAll
|
||||||
|
{
|
||||||
|
ostream& _os;
|
||||||
|
TestResultAll(ostream& os) : _os(os) {}
|
||||||
|
void operator()(const TestInfo& ti)
|
||||||
|
{
|
||||||
|
if (!ti._success)
|
||||||
|
{
|
||||||
|
const string& suite = ti._sources.front().suite();
|
||||||
|
|
||||||
|
sub_title(_os, suite + "::" + ti._name, 3, suite + "_" + ti._name);
|
||||||
|
for_each(ti._sources.begin(), ti._sources.end(), TestResult(_os));
|
||||||
|
back_ref(_os, suite, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Individual tests result tables, iterator
|
||||||
|
//
|
||||||
|
struct HtmlOutput::SuiteTestResult
|
||||||
|
{
|
||||||
|
ostream& _os;
|
||||||
|
SuiteTestResult(ostream& os) : _os(os) {}
|
||||||
|
void operator()(const SuiteInfo& si)
|
||||||
|
{
|
||||||
|
for_each(si._tests.begin(), si._tests.end(), TestResultAll(_os));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Generates the HTML table. This function should only be called after
|
||||||
|
/// run(), when all tests have been executed.
|
||||||
|
///
|
||||||
|
/// \param os Output stream.
|
||||||
|
/// \param incl_ok_tests Set if successful tests should be shown;
|
||||||
|
/// false otherwise.
|
||||||
|
/// \param name Name of generated report.
|
||||||
|
///
|
||||||
|
void
|
||||||
|
HtmlOutput::generate(ostream& os, bool incl_ok_tests, const string& name)
|
||||||
|
{
|
||||||
|
ClassType type(_total_errors > 0 ? Error : Success);
|
||||||
|
ostringstream ss;
|
||||||
|
|
||||||
|
header(os, name);
|
||||||
|
|
||||||
|
// Table: Summary
|
||||||
|
//
|
||||||
|
sub_title(os, "Summary", 2);
|
||||||
|
table_header(os, TableClass_Summary, "Summary of test results");
|
||||||
|
table_tr_header(os);
|
||||||
|
table_entry(os, Title, "Tests", 30);
|
||||||
|
table_entry(os, Title, "Errors", 30);
|
||||||
|
table_entry(os, Title, "Success", 30);
|
||||||
|
table_entry(os, Title, "Time (s)", 10);
|
||||||
|
table_tr_footer(os);
|
||||||
|
table_tr_header(os);
|
||||||
|
ss.str(""), ss << _total_tests;
|
||||||
|
table_entry(os, type, ss.str(), 30);
|
||||||
|
ss.str(""), ss << _total_errors;
|
||||||
|
table_entry(os, type, ss.str(), 30);
|
||||||
|
ss.str(""), ss << correct(_total_tests, _total_errors) << "%";
|
||||||
|
table_entry(os, type, ss.str(), 30);
|
||||||
|
ss.str(""), ss << _total_time;
|
||||||
|
table_entry(os, type, ss.str(), 10);
|
||||||
|
table_tr_footer(os);
|
||||||
|
table_footer(os);
|
||||||
|
os << "<hr />\n\n";
|
||||||
|
|
||||||
|
// Table: Test suites
|
||||||
|
//
|
||||||
|
sub_title(os, "Test suites", 2);
|
||||||
|
table_header(os, TableClass_Suites, "Test Suites");
|
||||||
|
table_tr_header(os);
|
||||||
|
table_entry(os, Title, "Name");
|
||||||
|
table_entry(os, Title, "Tests", 10);
|
||||||
|
table_entry(os, Title, "Errors", 10);
|
||||||
|
table_entry(os, Title, "Success", 10);
|
||||||
|
table_entry(os, Title, "Time (s)", 10);
|
||||||
|
table_tr_footer(os);
|
||||||
|
for_each(_suites.begin(), _suites.end(), SuiteRow(os));
|
||||||
|
table_footer(os);
|
||||||
|
os << "<hr />\n\n";
|
||||||
|
|
||||||
|
// Individual tests tables
|
||||||
|
//
|
||||||
|
for_each(_suites.begin(), _suites.end(), TestSuiteRow(os, incl_ok_tests));
|
||||||
|
os << "<hr />\n\n";
|
||||||
|
|
||||||
|
// Individual tests result tables
|
||||||
|
//
|
||||||
|
if(_total_errors != 0)
|
||||||
|
{
|
||||||
|
sub_title(os, "Test results", 2);
|
||||||
|
for_each(_suites.begin(), _suites.end(), SuiteTestResult(os));
|
||||||
|
os << "<hr />\n\n";
|
||||||
|
}
|
||||||
|
// EOF
|
||||||
|
//
|
||||||
|
footer(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
80
tests/cppunit/missing.cpp
Normal file
80
tests/cppunit/missing.cpp
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: missing.cpp,v 1.4 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "missing.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_GETTICKCOUNT
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __BORLANDC__
|
||||||
|
#include <cmath>
|
||||||
|
#else
|
||||||
|
#include <math.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
#ifndef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
int
|
||||||
|
gettimeofday(timeval* tv, void*)
|
||||||
|
{
|
||||||
|
assert(tv);
|
||||||
|
|
||||||
|
#ifdef HAVE_GETTICKCOUNT
|
||||||
|
long now = GetTickCount();
|
||||||
|
tv->tv_sec = now / 1000;
|
||||||
|
tv->tv_usec = (now % 1000) * 1000;
|
||||||
|
#else
|
||||||
|
tv->tv_sec = time(0);
|
||||||
|
tv->tv_usec = 0;
|
||||||
|
#endif // #ifdef HAVE_GETTICKCOUNT
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #ifndef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
#ifndef HAVE_ROUND
|
||||||
|
double
|
||||||
|
round(double d)
|
||||||
|
{
|
||||||
|
return d > 0.0 ? floor(d + 0.5) : ceil(d - 0.5);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
56
tests/cppunit/missing.h
Normal file
56
tests/cppunit/missing.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: missing.h,v 1.4 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#ifndef CPPTEST_MISSING_H
|
||||||
|
#define CPPTEST_MISSING_H
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
#ifndef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
struct timeval
|
||||||
|
{
|
||||||
|
long tv_sec;
|
||||||
|
long tv_usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int gettimeofday(timeval* tv, void*);
|
||||||
|
|
||||||
|
#endif // #ifndef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
#ifndef HAVE_ROUND
|
||||||
|
extern double round(double d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_MISSING_H
|
||||||
93
tests/cppunit/source.cpp
Normal file
93
tests/cppunit/source.cpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: source.cpp,v 1.4 2005/06/08 09:25:09 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
/// Constructs an invalid source object, which filename and message are
|
||||||
|
/// empty strings and the line equals zero.
|
||||||
|
///
|
||||||
|
Source::Source()
|
||||||
|
: _line(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// Constructs a source object.
|
||||||
|
///
|
||||||
|
/// \param file Name of the file containing the failing function.
|
||||||
|
/// \param line Line where the function starts.
|
||||||
|
/// \param msg Expression (or message) that caused the failure.
|
||||||
|
///
|
||||||
|
Source::Source(const char* file, unsigned int line, const char* msg)
|
||||||
|
: _line(line),
|
||||||
|
_file(file ? file : ""),
|
||||||
|
_msg(msg ? msg : "")
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// \return Name of the file containing the failing function.
|
||||||
|
///
|
||||||
|
const string&
|
||||||
|
Source::file() const
|
||||||
|
{
|
||||||
|
return _file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return Line where the function starts.
|
||||||
|
///
|
||||||
|
unsigned int
|
||||||
|
Source::line() const
|
||||||
|
{
|
||||||
|
return _line;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return Descriptive message.
|
||||||
|
///
|
||||||
|
const string&
|
||||||
|
Source::message() const
|
||||||
|
{
|
||||||
|
return _msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return Name of the suite, which the test belongs to.
|
||||||
|
///
|
||||||
|
const string&
|
||||||
|
Source::suite() const
|
||||||
|
{
|
||||||
|
return _suite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return Name of failing test.
|
||||||
|
///
|
||||||
|
const string&
|
||||||
|
Source::test() const
|
||||||
|
{
|
||||||
|
return _test;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
281
tests/cppunit/suite.cpp
Normal file
281
tests/cppunit/suite.cpp
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: suite.cpp,v 1.7 2010/03/26 04:38:25 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
#include <functional>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cpptest-output.h"
|
||||||
|
#include "cpptest-source.h"
|
||||||
|
#include "cpptest-suite.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// Destroys all dynamically allocated objects within the given range.
|
||||||
|
//
|
||||||
|
template <class FwdIter>
|
||||||
|
void
|
||||||
|
destroy_range(FwdIter first, FwdIter last)
|
||||||
|
{
|
||||||
|
while (first != last)
|
||||||
|
delete *first++;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
/// Constructs an empty test suite.
|
||||||
|
///
|
||||||
|
Suite::Suite()
|
||||||
|
: _cur_test(0),
|
||||||
|
_output(0),
|
||||||
|
_success(true)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// Destroys this suite object.
|
||||||
|
///
|
||||||
|
Suite::~Suite()
|
||||||
|
{
|
||||||
|
destroy_range(_suites.begin(), _suites.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Starts the testing. All tests in this suite and embedded suites will
|
||||||
|
/// be executed.
|
||||||
|
///
|
||||||
|
/// \param output Progress report destination.
|
||||||
|
/// \param cont_after_fail Continue functions despite failures.
|
||||||
|
///
|
||||||
|
/// \return True if no test failed; false otherwise.
|
||||||
|
///
|
||||||
|
bool
|
||||||
|
Suite::run(Output& output, bool cont_after_fail)
|
||||||
|
{
|
||||||
|
int ntests = total_tests();
|
||||||
|
output.initialize(ntests);
|
||||||
|
do_run(&output, cont_after_fail);
|
||||||
|
output.finished(ntests, total_time(true));
|
||||||
|
return _success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \fn void Suite::setup()
|
||||||
|
///
|
||||||
|
/// Setups a test fixture. This function is called before each test,
|
||||||
|
/// in this suite, is executed.
|
||||||
|
///
|
||||||
|
/// This function should be overloaded by derived classes to provide
|
||||||
|
/// specialized behavior.
|
||||||
|
///
|
||||||
|
/// \see tear_down()
|
||||||
|
|
||||||
|
/// \fn void Suite::tear_down()
|
||||||
|
///
|
||||||
|
/// Tears down a test fixture. This function is called after each test,
|
||||||
|
/// in this suite, have been executed.
|
||||||
|
///
|
||||||
|
/// This function should be overloaded by derived classes to provide
|
||||||
|
/// specialized behavior.
|
||||||
|
///
|
||||||
|
/// \see setup()
|
||||||
|
|
||||||
|
/// Adds a suite to this suite. Tests in added suites will be executed
|
||||||
|
/// when run() of the top-level suite is called.
|
||||||
|
///
|
||||||
|
/// \param suite %Test suite to add.
|
||||||
|
///
|
||||||
|
void
|
||||||
|
Suite::add(auto_ptr<Suite> suite)
|
||||||
|
{
|
||||||
|
_suites.push_back(suite.release());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Registers a test function.
|
||||||
|
///
|
||||||
|
/// \b Note: Do not call this function directly, use the TEST_ADD(func)
|
||||||
|
/// macro instead.
|
||||||
|
///
|
||||||
|
/// \param func Pointer to a test function.
|
||||||
|
/// \param name Class and function name of the function. The format \b must
|
||||||
|
/// equal \e class::func.
|
||||||
|
///
|
||||||
|
void
|
||||||
|
Suite::register_test(Func func, const string& name)
|
||||||
|
{
|
||||||
|
string::size_type pos = name.find_first_of(':');
|
||||||
|
assert(!name.empty() && name[pos + 1] == ':' && name[pos + 2] != '\0');
|
||||||
|
|
||||||
|
_name.assign(name, 0, pos);
|
||||||
|
_tests.push_back(Data(func, name.substr(pos + 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Issues an assertment to the output handler.
|
||||||
|
///
|
||||||
|
/// Do not call this function directly, use one of the available assertment
|
||||||
|
/// macros instead, see \ref asserts.
|
||||||
|
///
|
||||||
|
/// \param s Assert point information.
|
||||||
|
///
|
||||||
|
void
|
||||||
|
Suite::assertment(Source s)
|
||||||
|
{
|
||||||
|
s._suite = _name;
|
||||||
|
s._test = *_cur_test;
|
||||||
|
_output->assertment(s);
|
||||||
|
_result = _success = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Functor to execute tests for the given suite.
|
||||||
|
//
|
||||||
|
struct Suite::ExecTests
|
||||||
|
{
|
||||||
|
Suite& _suite;
|
||||||
|
|
||||||
|
ExecTests(Suite& s) : _suite(s) {}
|
||||||
|
|
||||||
|
void operator()(Data& data)
|
||||||
|
{
|
||||||
|
_suite._cur_test = &data._name;
|
||||||
|
_suite._result = true; // assume success, assert will set to false
|
||||||
|
_suite._output->test_start(data._name);
|
||||||
|
|
||||||
|
_suite.setup();
|
||||||
|
Time start(Time::current());
|
||||||
|
// FIXME Also feedback exception to user
|
||||||
|
try
|
||||||
|
{
|
||||||
|
(_suite.*data._func)();
|
||||||
|
} catch (...) {
|
||||||
|
_suite._result = _suite._success = false;
|
||||||
|
}
|
||||||
|
Time end(Time::current());
|
||||||
|
_suite.tear_down();
|
||||||
|
|
||||||
|
data._time = end - start;
|
||||||
|
_suite._output->test_end(data._name, _suite._result, data._time);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Functor to execute a suite.
|
||||||
|
//
|
||||||
|
struct Suite::DoRun
|
||||||
|
{
|
||||||
|
bool _continue;
|
||||||
|
Output* _output;
|
||||||
|
|
||||||
|
DoRun(Output* output, bool cont) : _continue(cont), _output(output) {}
|
||||||
|
void operator()(Suite* suite) { suite->do_run(_output, _continue); }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Execute all tests in this and added suites.
|
||||||
|
//
|
||||||
|
void
|
||||||
|
Suite::do_run(Output* os, bool cont_after_fail)
|
||||||
|
{
|
||||||
|
_continue = cont_after_fail;
|
||||||
|
_output = os;
|
||||||
|
|
||||||
|
_output->suite_start(_tests.size(), _name);
|
||||||
|
for_each(_tests.begin(), _tests.end(), ExecTests(*this));
|
||||||
|
_output->suite_end(_tests.size(), _name, total_time(false));
|
||||||
|
|
||||||
|
for_each(_suites.begin(), _suites.end(), DoRun(_output, _continue));
|
||||||
|
|
||||||
|
// FIXME Find a cleaner way
|
||||||
|
Suites::const_iterator iter = _suites.begin();
|
||||||
|
while (iter != _suites.end())
|
||||||
|
{
|
||||||
|
if (!(*iter)->_success)
|
||||||
|
{
|
||||||
|
_success = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Functor to count all tests in a suite.
|
||||||
|
//
|
||||||
|
struct Suite::SubSuiteTests
|
||||||
|
{
|
||||||
|
int operator()(size_t value, const Suite* s) const
|
||||||
|
{
|
||||||
|
return value + s->total_tests();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Counts all tests in this and all its embedded suites.
|
||||||
|
//
|
||||||
|
int
|
||||||
|
Suite::total_tests() const
|
||||||
|
{
|
||||||
|
return accumulate(_suites.begin(), _suites.end(),
|
||||||
|
_tests.size(), SubSuiteTests());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Functor to accumulate execution time for tests.
|
||||||
|
//
|
||||||
|
struct Suite::SuiteTime
|
||||||
|
{
|
||||||
|
Time operator()(const Time& time, const Data& data)
|
||||||
|
{
|
||||||
|
return time + data._time;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Functor to accumulate execution time for suites.
|
||||||
|
//
|
||||||
|
struct Suite::SubSuiteTime
|
||||||
|
{
|
||||||
|
Time operator()(Time time, const Suite* s) const
|
||||||
|
{
|
||||||
|
return time + s->total_time(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Counts time accumulated execution time for all tests in this and all
|
||||||
|
// its embedded suites.
|
||||||
|
//
|
||||||
|
Time
|
||||||
|
Suite::total_time(bool recursive) const
|
||||||
|
{
|
||||||
|
Time time = accumulate(_tests.begin(), _tests.end(),
|
||||||
|
Time(), SuiteTime());
|
||||||
|
|
||||||
|
return !recursive ? time : accumulate(_suites.begin(), _suites.end(),
|
||||||
|
time, SubSuiteTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
132
tests/cppunit/textoutput.cpp
Normal file
132
tests/cppunit/textoutput.cpp
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: textoutput.cpp,v 1.4 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cpptest-textoutput.h"
|
||||||
|
#include "cpptest-time.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// Outputs detailed assert source information. Used in verbose mode.
|
||||||
|
//
|
||||||
|
struct ShowSource
|
||||||
|
{
|
||||||
|
ostream& _stream;
|
||||||
|
ShowSource(ostream& stream) : _stream(stream) {}
|
||||||
|
void operator()(const Source& s)
|
||||||
|
{
|
||||||
|
_stream << "\tTest: " << s.test() << endl
|
||||||
|
<< "\tSuite: " << s.suite() << endl
|
||||||
|
<< "\tFile: " << s.file() << endl
|
||||||
|
<< "\tLine: " << s.line() << endl
|
||||||
|
<< "\tMessage: " << s.message() << endl << endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
/// Constructs a text output handler.
|
||||||
|
///
|
||||||
|
/// \param mode Output mode.
|
||||||
|
/// \param stream Stream to output to.
|
||||||
|
///
|
||||||
|
TextOutput::TextOutput(Mode mode, ostream& stream)
|
||||||
|
: _mode(mode),
|
||||||
|
_stream(stream),
|
||||||
|
_total_errors(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
TextOutput::finished(int tests, const Time& time)
|
||||||
|
{
|
||||||
|
_stream << "Total: " << tests << " tests, "
|
||||||
|
<< correct(tests, _total_errors) << "% correct"
|
||||||
|
<< " in " << time << " seconds" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TextOutput::suite_start(int tests, const string& name)
|
||||||
|
{
|
||||||
|
if (tests > 0)
|
||||||
|
{
|
||||||
|
_suite_name = name;
|
||||||
|
_suite_tests = _suite_errors = 0;
|
||||||
|
_suite_total_tests = tests;
|
||||||
|
_suite_error_list.clear();
|
||||||
|
|
||||||
|
_stream << _suite_name << ": "
|
||||||
|
<< "0/" << _suite_total_tests
|
||||||
|
<< "\r" << flush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TextOutput::suite_end(int tests, const string& name, const Time& time)
|
||||||
|
{
|
||||||
|
if (tests > 0)
|
||||||
|
{
|
||||||
|
_stream << name << ": " << tests << "/" << tests << ", "
|
||||||
|
<< correct(tests, _suite_errors) << "% correct"
|
||||||
|
<< " in " << time << " seconds" << endl;
|
||||||
|
|
||||||
|
if (_mode == Verbose && _suite_errors)
|
||||||
|
for_each(_suite_error_list.begin(), _suite_error_list.end(),
|
||||||
|
ShowSource(_stream));
|
||||||
|
|
||||||
|
_total_errors += _suite_errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TextOutput::test_end(const string&, bool ok, const Time&)
|
||||||
|
{
|
||||||
|
_stream << _suite_name << ": "
|
||||||
|
<< ++_suite_tests << "/" << _suite_total_tests
|
||||||
|
<< "\r" << flush;
|
||||||
|
if (!ok)
|
||||||
|
++_suite_errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TextOutput::assertment(const Source& s)
|
||||||
|
{
|
||||||
|
_suite_error_list.push_back(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
176
tests/cppunit/time.cpp
Normal file
176
tests/cppunit/time.cpp
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: time.cpp,v 1.4 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "missing.h"
|
||||||
|
#include "cpptest-time.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_GETTIMEOFDAY
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#else
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const unsigned int UsecPerSec = 1000000;
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
/// Constructs a time object with zeroed time.
|
||||||
|
///
|
||||||
|
Time::Time()
|
||||||
|
: _sec(0),
|
||||||
|
_usec(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// Constructs a time object.
|
||||||
|
///
|
||||||
|
/// \param sec Seconds.
|
||||||
|
/// \param usec Micro-seconds.
|
||||||
|
///
|
||||||
|
Time::Time(unsigned int sec, unsigned int usec)
|
||||||
|
: _sec(sec),
|
||||||
|
_usec(usec)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// \return Seconds.
|
||||||
|
///
|
||||||
|
unsigned int
|
||||||
|
Time::seconds() const
|
||||||
|
{
|
||||||
|
return _sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return Micro-seconds.
|
||||||
|
///
|
||||||
|
unsigned int
|
||||||
|
Time::microseconds() const
|
||||||
|
{
|
||||||
|
return _usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \return The current time.
|
||||||
|
///
|
||||||
|
Time
|
||||||
|
Time::current()
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, 0);
|
||||||
|
return Time(tv.tv_sec, tv.tv_usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \relates Time
|
||||||
|
///
|
||||||
|
/// Computes the time elapsed between two time values.
|
||||||
|
///
|
||||||
|
/// \param t1 Left-hand time, should be greater than \a t2.
|
||||||
|
/// \param t2 Right-hand time, should be less than \a t1.
|
||||||
|
///
|
||||||
|
/// \return Computed time value.
|
||||||
|
///
|
||||||
|
Time
|
||||||
|
operator-(const Time& t1, const Time& t2)
|
||||||
|
{
|
||||||
|
if (t2._sec > t1._sec || (t2._sec == t1._sec && t2._usec > t1._usec))
|
||||||
|
return Time();
|
||||||
|
|
||||||
|
unsigned int sec = t1._sec - t2._sec;
|
||||||
|
unsigned int usec;
|
||||||
|
|
||||||
|
if (t2._usec > t1._usec)
|
||||||
|
{
|
||||||
|
--sec;
|
||||||
|
usec = UsecPerSec - (t2._usec - t1._usec);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
usec = t1._usec - t2._usec;
|
||||||
|
|
||||||
|
return Time(sec, usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \relates Time
|
||||||
|
///
|
||||||
|
/// Adds two time values.
|
||||||
|
///
|
||||||
|
/// \param t1 Left-hand time.
|
||||||
|
/// \param t2 Right-hand time.
|
||||||
|
///
|
||||||
|
/// \return Computed time value.
|
||||||
|
///
|
||||||
|
Time
|
||||||
|
operator+(const Time& t1, const Time& t2)
|
||||||
|
{
|
||||||
|
unsigned int sec = t1._sec + t2._sec;
|
||||||
|
unsigned int usec = t1._usec + t2._usec;
|
||||||
|
|
||||||
|
if (usec > UsecPerSec)
|
||||||
|
{
|
||||||
|
++sec;
|
||||||
|
usec -= UsecPerSec;
|
||||||
|
}
|
||||||
|
return Time(sec, usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \relates Time
|
||||||
|
///
|
||||||
|
/// Outputs a time to an output stream.
|
||||||
|
///
|
||||||
|
/// \param os Output stream to write to.
|
||||||
|
/// \param t %Time to output.
|
||||||
|
///
|
||||||
|
/// \return A reference to the given output stream.
|
||||||
|
///
|
||||||
|
ostream&
|
||||||
|
operator<<(ostream& os, const Time& t)
|
||||||
|
{
|
||||||
|
int old_fill(os.fill());
|
||||||
|
int old_width(os.width());
|
||||||
|
|
||||||
|
os << t.seconds() << '.';
|
||||||
|
os.fill('0');
|
||||||
|
os.width(6);
|
||||||
|
os << t.microseconds();
|
||||||
|
|
||||||
|
os.fill(old_fill);
|
||||||
|
os.width(old_width);
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
50
tests/cppunit/utils.cpp
Normal file
50
tests/cppunit/utils.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: utils.cpp,v 1.5 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(__WIN32__) || defined(WIN32))
|
||||||
|
# include "winconfig.h"
|
||||||
|
#else
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "missing.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
// Computes the procentage of correct tests.
|
||||||
|
//
|
||||||
|
int
|
||||||
|
correct(int tests, int errors)
|
||||||
|
{
|
||||||
|
if ((errors == 0) || (tests == 0))
|
||||||
|
return 100;
|
||||||
|
|
||||||
|
return (tests - errors) * 100 / tests;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
36
tests/cppunit/utils.h
Normal file
36
tests/cppunit/utils.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: utils.h,v 1.3 2005/06/08 08:08:06 nilu Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#ifndef CPPTEST_UTILS_H
|
||||||
|
#define CPPTEST_UTILS_H
|
||||||
|
|
||||||
|
namespace Test
|
||||||
|
{
|
||||||
|
extern int correct(int tests, int errors);
|
||||||
|
|
||||||
|
} // namespace Test
|
||||||
|
|
||||||
|
#endif // #ifndef CPPTEST_UTILS_H
|
||||||
44
tests/cppunit/winconfig.h
Normal file
44
tests/cppunit/winconfig.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// ---
|
||||||
|
//
|
||||||
|
// $Id: winconfig.h,v 1.1 2008/07/15 20:33:31 hartwork Exp $
|
||||||
|
//
|
||||||
|
// CppTest - A C++ Unit Testing Framework
|
||||||
|
// Copyright (c) 2003 Niklas Lundell
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library 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
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
//
|
||||||
|
// ---
|
||||||
|
|
||||||
|
#ifndef TEST_CONFIG_H
|
||||||
|
#define TEST_CONFIG_H
|
||||||
|
|
||||||
|
// Capabilities
|
||||||
|
//
|
||||||
|
#define HAVE_GETTICKCOUNT
|
||||||
|
|
||||||
|
// Compiler specific stuff
|
||||||
|
//
|
||||||
|
#if _MSC_VER == 1200 // MS Visual C++ 6.0
|
||||||
|
#pragma warning (disable: 4786)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if _MSC_VER > 1300 // MS Visual C++ .NET 2002 and above
|
||||||
|
#pragma warning (disable: 4267)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // #ifndef TEST_CONFIG_H
|
||||||
150
tests/fixed_memory_test.h
Normal file
150
tests/fixed_memory_test.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
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; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
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, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EQEMU_TESTS_FIXED_MEMORY_H
|
||||||
|
#define __EQEMU_TESTS_FIXED_MEMORY_H
|
||||||
|
|
||||||
|
#include "cppunit/cpptest.h"
|
||||||
|
#include "../common/fixed_memory_hash_set.h"
|
||||||
|
#include "../common/Item.h"
|
||||||
|
|
||||||
|
class FixedMemoryHashTest : public Test::Suite {
|
||||||
|
typedef void(FixedMemoryHashTest::*TestFunction)(void);
|
||||||
|
public:
|
||||||
|
FixedMemoryHashTest() {
|
||||||
|
size_ = EQEmu::FixedMemoryHashSet<Item_Struct>::estimated_size(72000, 190000);
|
||||||
|
data_ = new uint8[size_];
|
||||||
|
memset(data_, 0, size_);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::InitTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::LoadTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::InsertTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::RetrieveTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::OverwriteTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::OverwriteRetrieveTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::InsertAgainTest);
|
||||||
|
TEST_ADD(FixedMemoryHashTest::RetrieveAgainTest);
|
||||||
|
}
|
||||||
|
~FixedMemoryHashTest() {
|
||||||
|
delete[] data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_, 72000, 190000);
|
||||||
|
TEST_ASSERT(!hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 0);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(hash.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoadTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
TEST_ASSERT(!hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 0);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(hash.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsertTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
Item_Struct item;
|
||||||
|
memset(&item, 0, sizeof(item));
|
||||||
|
strcpy(item.Name, "Iron Sword");
|
||||||
|
item.ID = 1001;
|
||||||
|
hash.insert(1001, item);
|
||||||
|
|
||||||
|
TEST_ASSERT(hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 1);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(!hash.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void RetrieveTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
TEST_ASSERT(hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 1);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
|
Item_Struct item = hash[1001];
|
||||||
|
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
||||||
|
TEST_ASSERT(item.ID == 1001);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OverwriteTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
Item_Struct item;
|
||||||
|
memset(&item, 0, sizeof(item));
|
||||||
|
strcpy(item.Name, "Steel Sword");
|
||||||
|
item.ID = 1001;
|
||||||
|
hash.insert(1001, item);
|
||||||
|
|
||||||
|
TEST_ASSERT(hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 1);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(!hash.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void OverwriteRetrieveTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
TEST_ASSERT(hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 1);
|
||||||
|
TEST_ASSERT((hash.max_size() == 72000));
|
||||||
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
|
Item_Struct item = hash[1001];
|
||||||
|
TEST_ASSERT(strcmp(item.Name, "Steel Sword") == 0);
|
||||||
|
TEST_ASSERT(item.ID == 1001);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsertAgainTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
Item_Struct item;
|
||||||
|
memset(&item, 0, sizeof(item));
|
||||||
|
strcpy(item.Name, "Iron Sword");
|
||||||
|
item.ID = 1000;
|
||||||
|
hash.insert(1000, item);
|
||||||
|
|
||||||
|
TEST_ASSERT(hash.exists(1000));
|
||||||
|
TEST_ASSERT(hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 2);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(!hash.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void RetrieveAgainTest() {
|
||||||
|
EQEmu::FixedMemoryHashSet<Item_Struct> hash(data_, size_);
|
||||||
|
TEST_ASSERT(hash.exists(1000));
|
||||||
|
TEST_ASSERT(hash.exists(1001));
|
||||||
|
TEST_ASSERT(hash.size() == 2);
|
||||||
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
|
Item_Struct item = hash[1000];
|
||||||
|
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
||||||
|
TEST_ASSERT(item.ID == 1000);
|
||||||
|
|
||||||
|
item = hash[1001];
|
||||||
|
TEST_ASSERT(strcmp(item.Name, "Steel Sword") == 0);
|
||||||
|
TEST_ASSERT(item.ID == 1001);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
uint8 *data_;
|
||||||
|
size_t size_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
63
tests/ipc_mutex_test.h
Normal file
63
tests/ipc_mutex_test.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
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; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
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, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EQEMU_TESTS_IPC_MUTEX_H
|
||||||
|
#define __EQEMU_TESTS_IPC_MUTEX_H
|
||||||
|
|
||||||
|
#include "cppunit/cpptest.h"
|
||||||
|
#include "../common/ipc_mutex.h"
|
||||||
|
|
||||||
|
class IPCMutexTest : public Test::Suite {
|
||||||
|
typedef void(IPCMutexTest::*TestFunction)(void);
|
||||||
|
public:
|
||||||
|
IPCMutexTest() {
|
||||||
|
TEST_ADD(IPCMutexTest::LockMutexTest);
|
||||||
|
TEST_ADD(IPCMutexTest::UnlockMutexTest);
|
||||||
|
TEST_ADD(IPCMutexTest::DoubleLockMutexTest);
|
||||||
|
TEST_ADD(IPCMutexTest::DoubleUnlockMutexTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
~IPCMutexTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void LockMutexTest() {
|
||||||
|
EQEmu::IPCMutex mutex("TestMutex1");
|
||||||
|
TEST_ASSERT(mutex.Lock());
|
||||||
|
TEST_ASSERT(mutex.Unlock());
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnlockMutexTest() {
|
||||||
|
EQEmu::IPCMutex mutex("TestMutex2");
|
||||||
|
TEST_ASSERT(!mutex.Unlock());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoubleLockMutexTest() {
|
||||||
|
EQEmu::IPCMutex mutex("TestMutex3");
|
||||||
|
TEST_ASSERT(mutex.Lock());
|
||||||
|
TEST_ASSERT(!mutex.Lock());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoubleUnlockMutexTest() {
|
||||||
|
EQEmu::IPCMutex mutex("TestMutex4");
|
||||||
|
TEST_ASSERT(mutex.Lock());
|
||||||
|
TEST_ASSERT(mutex.Unlock());
|
||||||
|
TEST_ASSERT(!mutex.Unlock());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
64
tests/main.cpp
Normal file
64
tests/main.cpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
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; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
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, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
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; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
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, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <memory>
|
||||||
|
#include "memory_mapped_file_test.h"
|
||||||
|
#include "ipc_mutex_test.h"
|
||||||
|
#include "fixed_memory_test.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
try {
|
||||||
|
std::unique_ptr<Test::Output> output(new Test::HtmlOutput);
|
||||||
|
Test::Suite tests;
|
||||||
|
tests.add(std::auto_ptr<MemoryMappedFileTest>(new MemoryMappedFileTest()));
|
||||||
|
tests.add(std::auto_ptr<IPCMutexTest>(new IPCMutexTest()));
|
||||||
|
tests.add(std::auto_ptr<FixedMemoryHashTest>(new FixedMemoryHashTest()));
|
||||||
|
tests.run(*output, true);
|
||||||
|
|
||||||
|
std::ofstream outfile("tests.html");
|
||||||
|
Test::HtmlOutput* const html = dynamic_cast<Test::HtmlOutput*>(output.get());
|
||||||
|
if(html)
|
||||||
|
html->generate(outfile, true, "EQEmuTests");
|
||||||
|
|
||||||
|
outfile.close();
|
||||||
|
} catch(...) {
|
||||||
|
getchar();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
getchar();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
66
tests/memory_mapped_file_test.h
Normal file
66
tests/memory_mapped_file_test.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
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; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
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, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EQEMU_TESTS_MEMORY_MAPPED_FILE_H
|
||||||
|
#define __EQEMU_TESTS_MEMORY_MAPPED_FILE_H
|
||||||
|
|
||||||
|
#include "cppunit/cpptest.h"
|
||||||
|
#include "../common/memory_mapped_file.h"
|
||||||
|
|
||||||
|
class MemoryMappedFileTest : public Test::Suite {
|
||||||
|
typedef void(MemoryMappedFileTest::*TestFunction)(void);
|
||||||
|
public:
|
||||||
|
MemoryMappedFileTest() {
|
||||||
|
TEST_ADD(MemoryMappedFileTest::LoadAndZeroMMF)
|
||||||
|
TEST_ADD(MemoryMappedFileTest::LoadExistingMMF)
|
||||||
|
}
|
||||||
|
|
||||||
|
~MemoryMappedFileTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void LoadAndZeroMMF() {
|
||||||
|
EQEmu::MemoryMappedFile mmf("testfile.txt", 512);
|
||||||
|
mmf.ZeroFile();
|
||||||
|
TEST_ASSERT(!mmf.Loaded());
|
||||||
|
TEST_ASSERT(mmf.Size() == 512);
|
||||||
|
|
||||||
|
unsigned char *data = reinterpret_cast<unsigned char*>(mmf.Get());
|
||||||
|
TEST_ASSERT(data != NULL);
|
||||||
|
|
||||||
|
*reinterpret_cast<uint32*>(data) = 562;
|
||||||
|
mmf.SetLoaded();
|
||||||
|
|
||||||
|
TEST_ASSERT(mmf.Loaded());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoadExistingMMF() {
|
||||||
|
EQEmu::MemoryMappedFile mmf("testfile.txt");
|
||||||
|
TEST_ASSERT(mmf.Size() == 512);
|
||||||
|
TEST_ASSERT(mmf.Loaded());
|
||||||
|
|
||||||
|
unsigned char *data = reinterpret_cast<unsigned char*>(mmf.Get());
|
||||||
|
TEST_ASSERT(data != NULL);
|
||||||
|
|
||||||
|
uint32 val = *reinterpret_cast<uint32*>(data);
|
||||||
|
TEST_ASSERT(val == 562);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
x
Reference in New Issue
Block a user