blob: d92127d0fdc4c6100b5df3705936a0a911bdfd74 [file] [log] [blame]
#include <doctest/doctest.h>
// GCC < 5 breaks when trying to compare enums to integers when using std headers.
#if !defined(DOCTEST_CONFIG_USE_STD_HEADERS) || DOCTEST_GCC == 0 || DOCTEST_GCC >= DOCTEST_COMPILER(5, 0, 0)
#define RET_TYPE(x) x
#else
#define RET_TYPE(x) typename doctest::detail::types::underlying_type<x>::type
#endif
template <typename S>
static RET_TYPE(S) castToUnderlying(S in) {
return in;
}
#include "header.h"
DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
#include <cstdint>
#include <sstream>
DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
namespace
{
enum StandardEnum
{
Zero,
One,
Two,
};
enum TypedEnum : int64_t
{
TypedZero,
TypedOne,
TypedTwo,
};
enum class EnumClassC : char
{
Zero = '0',
One = '1',
Two = '2',
};
enum class EnumClassSC : signed char
{
Zero = '0',
One = '1',
Two = '2',
};
enum class EnumClassUC : unsigned char
{
Zero = '0',
One = '1',
Two = '2',
};
enum class EnumClassU8 : uint8_t
{
Zero,
One,
Two,
};
template<class E, class T = typename std::underlying_type<E>::type>
T printable(E val)
{
return static_cast<T>(val);
}
}
TEST_CASE("enum 1")
{
std::ostringstream ostr;
ostr << Zero << One << Two;
ostr << TypedZero << TypedOne << TypedTwo;
static_assert(std::is_enum<EnumClassSC>::value, "");
ostr << printable(EnumClassSC::Zero) << printable(EnumClassSC::One) << printable(EnumClassSC::Two);
CHECK_EQ(castToUnderlying(Zero), 0);
CHECK_EQ(castToUnderlying(One), 1);
CHECK_EQ(castToUnderlying(Two), 2);
CHECK_EQ(castToUnderlying(TypedZero), 0);
CHECK_EQ(castToUnderlying(TypedOne), 1);
CHECK_EQ(castToUnderlying(TypedTwo), 2);
CHECK_EQ(EnumClassSC::Zero, EnumClassSC::Zero);
CHECK_EQ(EnumClassSC::One, EnumClassSC::One);
CHECK_EQ(EnumClassSC::Two, EnumClassSC::Two);
}
TEST_CASE("enum 2" * doctest::should_fail())
{
CHECK_EQ(castToUnderlying(Zero), 1);
CHECK_EQ(castToUnderlying(One), 2);
CHECK_EQ(castToUnderlying(Two), 3);
CHECK_EQ(castToUnderlying(TypedZero), 1);
CHECK_EQ(castToUnderlying(TypedOne), 2);
CHECK_EQ(castToUnderlying(TypedTwo), 3);
CHECK_EQ(EnumClassC::Zero, EnumClassC::One);
CHECK_EQ(EnumClassC::One, EnumClassC::Two);
CHECK_EQ(EnumClassC::Two, EnumClassC::Zero);
CHECK_EQ(EnumClassSC::Zero, EnumClassSC::One);
CHECK_EQ(EnumClassSC::One, EnumClassSC::Two);
CHECK_EQ(EnumClassSC::Two, EnumClassSC::Zero);
CHECK_EQ(EnumClassUC::Zero, EnumClassUC::One);
CHECK_EQ(EnumClassUC::One, EnumClassUC::Two);
CHECK_EQ(EnumClassUC::Two, EnumClassUC::Zero);
CHECK_EQ(EnumClassU8::Zero, EnumClassU8::One);
CHECK_EQ(EnumClassU8::One, EnumClassU8::Two);
CHECK_EQ(EnumClassU8::Two, EnumClassU8::Zero);
}