mirror of
https://github.com/unittest-cpp/unittest-cpp
synced 2026-09-27 00:28:49 +03:00
Merge abfa9478fe into 36c424df17
This commit is contained in:
commit
c4d4cd4c52
4 changed files with 180 additions and 0 deletions
7
CMakeLists.txt
Normal file → Executable file
7
CMakeLists.txt
Normal file → Executable 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
111
UnitTest++/Checks.h
Normal file → Executable 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
18
UnitTest++/Config.h
Normal file → Executable 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
44
tests/TestChecks.cpp
Normal file → Executable 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
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue