1#include <gtest/gtest.h>
4#include <boost/pfr.hpp>
6#include <simple/cycles.structs.usrv.pb.hpp>
10template <
typename Field,
typename Expected>
11constexpr void AssertFieldType() {
12 static_assert(std::is_same_v<Field, Expected>,
"Must be equal");
16constexpr std::size_t GetFieldCount() {
17 return boost::pfr::tuple_size<T>::value;
20template <
typename T, std::size_t Count>
21constexpr void AssertFieldCount() {
22 static_assert(GetFieldCount<T>() == Count);
26 namespace ss = simple::structs;
27 AssertFieldType<
decltype(ss::Self::self), USERVER_NAMESPACE::utils::Box<ss::Self>>();
28 AssertFieldCount<ss::CycleEnd, 1>();
32 namespace ss = simple::structs;
35 decltype(ss::MyMap::self),
36 USERVER_NAMESPACE::utils::Box<::proto_structs::HashMap<std::string, std::string>>>();
38 AssertFieldCount<ss::MyMap, 1>();
41TEST(Cycles, CycleLenIsThree) {
42 namespace ss = simple::structs;
43 AssertFieldType<
decltype(ss::First::c), std::optional<ss::Second>>();
44 AssertFieldType<
decltype(ss::Second::c), std::optional<ss::Third>>();
45 AssertFieldType<
decltype(ss::Third::c), USERVER_NAMESPACE::utils::Box<ss::First>>();
47 AssertFieldCount<ss::First, 1>();
48 AssertFieldCount<ss::Second, 1>();
49 AssertFieldCount<ss::Third, 1>();
53 namespace ss = simple::structs;
54 AssertFieldType<
decltype(ss::CycleStart::cycle), USERVER_NAMESPACE::utils::Box<ss::CycleEnd>>();
55 AssertFieldType<
decltype(ss::CycleStart::not_boxed), std::vector<ss::CycleEnd>>();
56 AssertFieldType<
decltype(ss::CycleEnd::cycle), std::optional<ss::CycleStart>>();
58 AssertFieldCount<ss::CycleEnd, 1>();
59 AssertFieldCount<ss::CycleStart, 2>();
63 namespace ss = simple::structs;
64 AssertFieldType<
decltype(ss::Main1::inner), std::optional<ss::Main1::Inner>>();
65 AssertFieldType<
decltype(ss::Main1::Inner::cycle), USERVER_NAMESPACE::utils::Box<ss::ImBelowMain1>>();
66 AssertFieldType<
decltype(ss::IamAboveMain2::cycle), std::optional<ss::Main2>>();
67 AssertFieldType<
decltype(ss::Main2::inner), std::optional<ss::Main2::Inner>>();
68 AssertFieldType<
decltype(ss::Main2::Inner::cycle), USERVER_NAMESPACE::utils::Box<ss::IamAboveMain2>>();
69 AssertFieldType<
decltype(ss::ImBelowMain1::cycle), std::optional<ss::Main1>>();
71 AssertFieldCount<ss::Main1, 1>();
72 AssertFieldCount<ss::Main1::Inner, 1>();
73 AssertFieldCount<ss::IamAboveMain2, 1>();
74 AssertFieldCount<ss::Main2, 1>();
75 AssertFieldCount<ss::Main2::Inner, 1>();
76 AssertFieldCount<ss::ImBelowMain1, 1>();
79TEST(Cycles, NewCycle) {
80 namespace ss = simple::structs;
81 AssertFieldType<
decltype(ss::NewCycle::inner), std::optional<ss::NewCycle::Inner1>>();
82 AssertFieldCount<ss::NewCycle, 1>();
83 AssertFieldType<
decltype(ss::NewCycle::Inner1::inner), std::optional<ss::NewCycle::Inner1::InnerInner>>();
84 AssertFieldType<
decltype(ss::NewCycle::Inner1::InnerInner::inner), std::optional<ss::NewCycle::Inner2Below>>();
85 AssertFieldType<
decltype(ss::NewCycle::Inner2Below::i), std::optional<ss::NewCycle::Inner2Below::InnerInner>>();
87 decltype(ss::NewCycle::Inner2Below::InnerInner::inner),
88 USERVER_NAMESPACE::utils::Box<ss::NewCycle::Inner1>>();
90 AssertFieldCount<ss::NewCycle::Inner1, 1>();
91 AssertFieldCount<ss::NewCycle::Inner1::InnerInner, 1>();
92 AssertFieldCount<ss::NewCycle::Inner2Below, 1>();
93 AssertFieldCount<ss::NewCycle::Inner2Below::InnerInner, 1>();
96TEST(Cycles, NewCycle2) {
97 namespace ss = simple::structs;
98 AssertFieldType<
decltype(ss::NewCycle2::inner), std::optional<ss::NewCycle2::Inner1>>();
99 AssertFieldCount<ss::NewCycle2, 1>();
100 AssertFieldType<
decltype(ss::NewCycle2::Inner1::inner), std::optional<ss::NewCycle2::Inner1::InnerInner>>();
101 AssertFieldType<
decltype(ss::NewCycle2::Inner1::InnerInner::inner), std::optional<ss::NewCycle2::Inner2Above>>();
102 AssertFieldType<
decltype(ss::NewCycle2::Inner2Above::i), std::optional<ss::NewCycle2::Inner2Above::InnerInner>>();
104 decltype(ss::NewCycle2::Inner2Above::InnerInner::inner),
105 USERVER_NAMESPACE::utils::Box<ss::NewCycle2::Inner1>>();
107 AssertFieldCount<ss::NewCycle2::Inner1, 1>();
108 AssertFieldCount<ss::NewCycle2::Inner1::InnerInner, 1>();
109 AssertFieldCount<ss::NewCycle2::Inner2Above, 1>();
110 AssertFieldCount<ss::NewCycle2::Inner2Above::InnerInner, 1>();