userver: /home/antonyzhilin/arcadia/taxi/uservices/userver/libraries/proto-structs/codegen-tests/src/cycles_test.cpp Source File
Loading...
Searching...
No Matches
cycles_test.cpp
1#include <gtest/gtest.h>
2
3#include <fmt/format.h>
4#include <boost/pfr.hpp>
5
6#include <simple/cycles.structs.usrv.pb.hpp>
7
8USERVER_NAMESPACE_BEGIN
9
10template <typename Field, typename Expected>
11constexpr void AssertFieldType() {
12 static_assert(std::is_same_v<Field, Expected>, "Must be equal");
13}
14
15template <typename T>
16constexpr std::size_t GetFieldCount() {
17 return boost::pfr::tuple_size<T>::value;
18}
19
20template <typename T, std::size_t Count>
21constexpr void AssertFieldCount() {
22 static_assert(GetFieldCount<T>() == Count);
23}
24
25TEST(Cycles, Self) {
26 namespace ss = simple::structs;
27 AssertFieldType<decltype(ss::Self::self), USERVER_NAMESPACE::utils::Box<ss::Self>>();
28 AssertFieldCount<ss::CycleEnd, 1>();
29}
30
31TEST(Cycles, MyMap) {
32 namespace ss = simple::structs;
33
34 AssertFieldType<
35 decltype(ss::MyMap::self),
36 USERVER_NAMESPACE::utils::Box<::proto_structs::HashMap<std::string, std::string>>>();
37
38 AssertFieldCount<ss::MyMap, 1>();
39}
40
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>>();
46
47 AssertFieldCount<ss::First, 1>();
48 AssertFieldCount<ss::Second, 1>();
49 AssertFieldCount<ss::Third, 1>();
50}
51
52TEST(Cycles, Simple) {
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>>();
57
58 AssertFieldCount<ss::CycleEnd, 1>();
59 AssertFieldCount<ss::CycleStart, 2>();
60}
61
62TEST(Cycles, Main) {
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>>();
70
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>();
77}
78
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>>();
86 AssertFieldType<
87 decltype(ss::NewCycle::Inner2Below::InnerInner::inner),
88 USERVER_NAMESPACE::utils::Box<ss::NewCycle::Inner1>>();
89
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>();
94}
95
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>>();
103 AssertFieldType<
104 decltype(ss::NewCycle2::Inner2Above::InnerInner::inner),
105 USERVER_NAMESPACE::utils::Box<ss::NewCycle2::Inner1>>();
106
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>();
111}
112
113USERVER_NAMESPACE_END