This commit is contained in:
Edward Woolhouse 2014-12-19 17:54:04 +00:00
commit c4d4cd4c52
4 changed files with 180 additions and 0 deletions

7
CMakeLists.txt Normal file → Executable file
View file

@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8.1)
project(UnitTest++)
option(UTPP_USE_PLUS_SIGN "Set this to OFF is you with to use '-cpp' instead of '++' in lib/include paths" ON)
option(UTPP_USE_CPP11 "Set this to ON is you with support C++11 features such as strongly typed enum" OFF)
# get the main sources
file(GLOB headers_ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} UnitTest++/*.h)
@ -16,6 +17,12 @@ else()
set(platformDir_ Posix)
endif(WIN32)
if(${UTPP_USE_CPP11})
if (${CMAKE_COMPILER_IS_GNUCXX})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
endif()
endif()
file(GLOB platformHeaders_ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} UnitTest++/${platformDir_}/*.h)
file(GLOB platformSources_ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} UnitTest++/${platformDir_}/*.cpp)
source_group(${platformDir_} FILES ${platformHeaders_} ${platformSources_})

111
UnitTest++/Checks.h Normal file → Executable file
View file

@ -5,6 +5,10 @@
#include "TestResults.h"
#include "MemoryOutStream.h"
#ifdef UNITTEST_CPP11
#include <type_traits>
#endif
namespace UnitTest {
@ -15,6 +19,40 @@ bool Check(Value const value)
}
#ifdef UNITTEST_CPP11
// C++11 strongly typed enum overload
template< typename Expected, typename Actual >
typename std::enable_if<std::is_enum<Expected>::value && std::is_enum<Actual>::value>::type
CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details)
{
if (!(expected == actual))
{
UnitTest::MemoryOutStream stream;
stream << "Expected " << static_cast<int>(expected)
<< " but was " << static_cast<int>(actual);
results.OnTestFailure(details, stream.GetText());
}
}
// Non-strongly type enum overload
template< typename Expected, typename Actual >
typename std::enable_if<!std::is_enum<Expected>::value || !std::is_enum<Actual>::value>::type
CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details)
{
if (!(expected == actual))
{
UnitTest::MemoryOutStream stream;
stream << "Expected " << expected << " but was " << actual;
results.OnTestFailure(details, stream.GetText());
}
}
#else
template< typename Expected, typename Actual >
void CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details)
{
@ -27,6 +65,9 @@ void CheckEqual(TestResults& results, Expected const& expected, Actual const& ac
}
}
#endif
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details);
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details);
@ -54,6 +95,74 @@ void CheckClose(TestResults& results, Expected const& expected, Actual const& ac
}
}
#ifdef UNITTEST_CPP11
// C++11 strongly typed enum overload
template< typename Expected, typename Actual >
typename std::enable_if<std::is_enum<typename std::remove_all_extents<Expected>::type>::value &&
std::is_enum<typename std::remove_all_extents<Actual>::type>::value>::type
CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual,
int const count, TestDetails const& details)
{
bool equal = true;
for (int i = 0; i < count; ++i)
equal &= (expected[i] == actual[i]);
if (!equal)
{
UnitTest::MemoryOutStream stream;
stream << "Expected [ ";
for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex)
stream << static_cast<int>(expected[expectedIndex]) << " ";
stream << "] but was [ ";
for (int actualIndex = 0; actualIndex < count; ++actualIndex)
stream << static_cast<int>(actual[actualIndex]) << " ";
stream << "]";
results.OnTestFailure(details, stream.GetText());
}
}
// Non-strongly type enum overload
template< typename Expected, typename Actual >
typename std::enable_if<!std::is_enum<typename std::remove_all_extents<Expected>::type>::value ||
!std::is_enum<typename std::remove_all_extents<Actual>::type>::value>::type
CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual,
int const count, TestDetails const& details)
{
bool equal = true;
for (int i = 0; i < count; ++i)
equal &= (expected[i] == actual[i]);
if (!equal)
{
UnitTest::MemoryOutStream stream;
stream << "Expected [ ";
for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex)
stream << expected[expectedIndex] << " ";
stream << "] but was [ ";
for (int actualIndex = 0; actualIndex < count; ++actualIndex)
stream << actual[actualIndex] << " ";
stream << "]";
results.OnTestFailure(details, stream.GetText());
}
}
#else
template< typename Expected, typename Actual >
void CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual,
@ -83,6 +192,8 @@ void CheckArrayEqual(TestResults& results, Expected const& expected, Actual cons
}
}
#endif
template< typename Expected, typename Actual, typename Tolerance >
bool ArrayAreClose(Expected const& expected, Actual const& actual, int const count, Tolerance const& tolerance)
{

18
UnitTest++/Config.h Normal file → Executable file
View file

@ -70,4 +70,22 @@
#define UNIITEST_NS_QUAL_STD(x) ::std::x
#endif
//#define UNITTEST_FORCE_CPP11_DETECTION
//#define UNITTEST_DISABLE_CPP11
/* C++11 features are enabled when __cplusplus > 199711L
* but compiler support is patchy. You can manually force or disable C++11
* by defining UNITTEST_FORCE_CPP11_DETECTION
* or UNITTEST_DISABLE_CPP11
* You will also require compiler options that enable C++11 eg
* gcc 4.6: -std=c++0x
* gcc 4.7+: -std=c++11
* MSVC 2012+: No options required
* MSVC 2010 and earlier do not support strongly typed enums
*/
#if ((__cplusplus > 199711L ) || defined( UNITTEST_FORCE_CPP11_DETECTION )) && !defined( UNITTEST_DISABLE_CPP11 )
#define UNITTEST_CPP11
#endif
#endif

44
tests/TestChecks.cpp Normal file → Executable file
View file

@ -315,4 +315,48 @@ TEST(CheckArray2DCloseFailureIncludesDetails)
CHECK_EQUAL(1234, reporter.lastFailedLine);
}
// C++11 specific tests
#ifdef UNITTEST_CPP11
enum class StronglyTypedColorEnum : unsigned short
{
Red, Blue
};
TEST(CheckEqualWithStronglyTypedEnum)
{
TestResults results;
CheckEqual(results, StronglyTypedColorEnum::Red, StronglyTypedColorEnum::Blue, TestDetails("", "", "", 0));
CHECK_EQUAL(1, results.GetFailureCount());
CheckEqual(results, StronglyTypedColorEnum::Red, StronglyTypedColorEnum::Red, TestDetails("", "", "", 0));
CHECK_EQUAL(1, results.GetFailureCount());
}
TEST(CheckArrayEqualWithStronglyTypedEnum)
{
TestResults results;
StronglyTypedColorEnum expected[] = {StronglyTypedColorEnum::Red,
StronglyTypedColorEnum::Red,
StronglyTypedColorEnum::Blue};
StronglyTypedColorEnum results1[] = {StronglyTypedColorEnum::Red,
StronglyTypedColorEnum::Red,
StronglyTypedColorEnum::Blue};
StronglyTypedColorEnum results2[] = {StronglyTypedColorEnum::Red,
StronglyTypedColorEnum::Blue,
StronglyTypedColorEnum::Blue};
CheckArrayEqual(results, expected, results1, 3, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
CheckArrayEqual(results, expected, results2, 3, TestDetails("", "", "", 0));
CHECK_EQUAL(1, results.GetFailureCount());
}
#endif
}