File: enums.cpp

package info (click to toggle)
doctest 2.4.12-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,436 kB
  • sloc: cpp: 13,546; python: 261; makefile: 30; sh: 1
file content (121 lines) | stat: -rw-r--r-- 2,809 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#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);
}