#include // 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::type #endif template static RET_TYPE(S) castToUnderlying(S in) { return in; } #include "header.h" DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN #include #include 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::type> T printable(E val) { return static_cast(val); } } TEST_CASE("enum 1") { std::ostringstream ostr; ostr << Zero << One << Two; ostr << TypedZero << TypedOne << TypedTwo; static_assert(std::is_enum::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); }