1// Copyright 2020, 2021 Peter Dimov
2// Distributed under the Boost Software License, Version 1.0.
3// https://www.boost.org/LICENSE_1_0.txt
4
5#include <boost/describe/enumerators.hpp>
6#include <boost/describe/enum.hpp>
7#include <boost/core/lightweight_test.hpp>
8
9struct X1
10{
11 enum E
12 {
13 v1 = 5
14 };
15
16 BOOST_DESCRIBE_NESTED_ENUM(E, v1)
17};
18
19class X2
20{
21private:
22
23 enum E
24 {
25 v1, v2
26 };
27
28 BOOST_DESCRIBE_NESTED_ENUM(E, v1, v2)
29
30public:
31
32 typedef E E2;
33};
34
35#if !defined(BOOST_DESCRIBE_CXX11)
36
37#include <boost/config/pragma_message.hpp>
38
39BOOST_PRAGMA_MESSAGE("Skipping test because C++11 is not available")
40int main() {}
41
42#else
43
44struct X3
45{
46 enum class E
47 {
48 v1 = 7
49 };
50
51 BOOST_DESCRIBE_NESTED_ENUM(E, v1)
52};
53
54class X4
55{
56private:
57
58 enum class E
59 {
60 v1, v2
61 };
62
63 BOOST_DESCRIBE_NESTED_ENUM(E, v1, v2)
64
65public:
66
67 typedef E E2;
68};
69
70#if !defined(BOOST_DESCRIBE_CXX14)
71
72#include <boost/config/pragma_message.hpp>
73
74BOOST_PRAGMA_MESSAGE("Skipping test because C++14 is not available")
75int main() {}
76
77#else
78
79#include <boost/mp11.hpp>
80using namespace boost::mp11;
81
82int main()
83{
84 {
85 using D = boost::describe::describe_enumerators<X1::E>;
86
87 BOOST_TEST_EQ( mp_size<D>::value, 1 );
88
89 BOOST_TEST_EQ( (mp_at_c<D, 0>::value), X1::v1 );
90 BOOST_TEST_CSTR_EQ( (mp_at_c<D, 0>::name), "v1" );
91 }
92
93 {
94 using D = boost::describe::describe_enumerators<X2::E2>;
95
96 BOOST_TEST_EQ( mp_size<D>::value, 2 );
97
98 BOOST_TEST_EQ( (mp_at_c<D, 0>::value), 0 );
99 BOOST_TEST_CSTR_EQ( (mp_at_c<D, 0>::name), "v1" );
100
101 BOOST_TEST_EQ( (mp_at_c<D, 1>::value), 1 );
102 BOOST_TEST_CSTR_EQ( (mp_at_c<D, 1>::name), "v2" );
103 }
104
105 {
106 using D = boost::describe::describe_enumerators<X3::E>;
107
108 BOOST_TEST_EQ( mp_size<D>::value, 1 );
109
110 BOOST_TEST_EQ( (int)(mp_at_c<D, 0>::value), (int)X3::E::v1 );
111 BOOST_TEST_CSTR_EQ( (mp_at_c<D, 0>::name), "v1" );
112 }
113
114 {
115 using D = boost::describe::describe_enumerators<X4::E2>;
116
117 BOOST_TEST_EQ( mp_size<D>::value, 2 );
118
119 BOOST_TEST_EQ( (int)(mp_at_c<D, 0>::value), 0 );
120 BOOST_TEST_CSTR_EQ( (mp_at_c<D, 0>::name), "v1" );
121
122 BOOST_TEST_EQ( (int)(mp_at_c<D, 1>::value), 1 );
123 BOOST_TEST_CSTR_EQ( (mp_at_c<D, 1>::name), "v2" );
124 }
125
126 return boost::report_errors();
127}
128
129#endif // !defined(BOOST_DESCRIBE_CXX14)
130#endif // !defined(BOOST_DESCRIBE_CXX11)
131

source code of boost/libs/describe/test/nested_enum_test.cpp