userver: /data/code/userver/libraries/proto-structs/codegen-tests/src/box/autobox/cycles_test.cpp Source File
Loading...
Searching...
No Matches
cycles_test.cpp
1#include <gtest/gtest.h>
2
3#include <fmt/format.h>
4
5#include <box/autobox/cycles.structs.usrv.pb.hpp>
6#include <test_utils/type_assertions.hpp>
7
8USERVER_NAMESPACE_BEGIN
9
10TEST(AutoboxCycles, Self) {
11 namespace ss = box::autobox::structs;
12 AssertFieldType<decltype(ss::Self::self), utils::Box<ss::Self>>();
13 AssertFieldCount<ss::CycleEnd, 1>();
14}
15
16TEST(AutoboxCycles, CycleLenIsThree) {
17 namespace ss = box::autobox::structs;
18 AssertFieldType<decltype(ss::First::c), utils::Box<ss::Second>>();
19 AssertFieldType<decltype(ss::Second::c), utils::Box<ss::Third>>();
20 AssertFieldType<decltype(ss::Third::c), utils::Box<ss::First>>();
21
22 AssertFieldCount<ss::First, 1>();
23 AssertFieldCount<ss::Second, 1>();
24 AssertFieldCount<ss::Third, 1>();
25}
26
27TEST(AutoboxCycles, box) {
28 namespace ss = box::autobox::structs;
29 AssertFieldType<decltype(ss::CycleStart::cycle), utils::Box<ss::CycleEnd>>();
30 AssertFieldType<decltype(ss::CycleStart::not_boxed), std::vector<ss::CycleEnd>>();
31 AssertFieldType<decltype(ss::CycleEnd::cycle), utils::Box<ss::CycleStart>>();
32
33 AssertFieldCount<ss::CycleEnd, 1>();
34 AssertFieldCount<ss::CycleStart, 2>();
35}
36
37TEST(AutoboxCycles, Main) {
38 namespace ss = box::autobox::structs;
39 AssertFieldType<decltype(ss::Main1::inner), ss::Main1::Inner>();
40 AssertFieldType<decltype(ss::Main1::Inner::cycle), utils::Box<ss::ImBelowMain1>>();
41 AssertFieldType<decltype(ss::IamAboveMain2::cycle), utils::Box<ss::Main2>>();
42 AssertFieldType<decltype(ss::Main2::inner), ss::Main2::Inner>();
43 AssertFieldType<decltype(ss::Main2::Inner::cycle), utils::Box<ss::IamAboveMain2>>();
44 AssertFieldType<decltype(ss::ImBelowMain1::cycle), utils::Box<ss::Main1>>();
45
46 AssertFieldCount<ss::Main1, 1>();
47 AssertFieldCount<ss::Main1::Inner, 1>();
48 AssertFieldCount<ss::IamAboveMain2, 1>();
49 AssertFieldCount<ss::Main2, 1>();
50 AssertFieldCount<ss::Main2::Inner, 1>();
51 AssertFieldCount<ss::ImBelowMain1, 1>();
52}
53
54TEST(AutoboxCycles, NewCycle) {
55 namespace ss = box::autobox::structs;
56 AssertFieldType<decltype(ss::NewCycle::inner), ss::NewCycle::Inner1>();
57 AssertFieldCount<ss::NewCycle, 1>();
58 AssertFieldType<decltype(ss::NewCycle::Inner1::inner), ss::NewCycle::Inner1::InnerInner>();
59 AssertFieldType<decltype(ss::NewCycle::Inner1::InnerInner::inner), utils::Box<ss::NewCycle::Inner2Below>>();
60 AssertFieldType<decltype(ss::NewCycle::Inner2Below::i), ss::NewCycle::Inner2Below::InnerInner>();
61 AssertFieldType<decltype(ss::NewCycle::Inner2Below::InnerInner::inner), utils::Box<ss::NewCycle::Inner1>>();
62
63 AssertFieldCount<ss::NewCycle::Inner1, 1>();
64 AssertFieldCount<ss::NewCycle::Inner1::InnerInner, 1>();
65 AssertFieldCount<ss::NewCycle::Inner2Below, 1>();
66 AssertFieldCount<ss::NewCycle::Inner2Below::InnerInner, 1>();
67}
68
69TEST(AutoboxCycles, NewCycle2) {
70 namespace ss = box::autobox::structs;
71 AssertFieldType<decltype(ss::NewCycle2::inner), ss::NewCycle2::Inner1>();
72 AssertFieldCount<ss::NewCycle2, 1>();
73 AssertFieldType<decltype(ss::NewCycle2::Inner1::inner), ss::NewCycle2::Inner1::InnerInner>();
74 AssertFieldType<decltype(ss::NewCycle2::Inner1::InnerInner::inner), utils::Box<ss::NewCycle2::Inner2Above>>();
75 AssertFieldType<decltype(ss::NewCycle2::Inner2Above::i), ss::NewCycle2::Inner2Above::InnerInner>();
76 AssertFieldType<decltype(ss::NewCycle2::Inner2Above::InnerInner::inner), utils::Box<ss::NewCycle2::Inner1>>();
77
78 AssertFieldCount<ss::NewCycle2::Inner1, 1>();
79 AssertFieldCount<ss::NewCycle2::Inner1::InnerInner, 1>();
80 AssertFieldCount<ss::NewCycle2::Inner2Above, 1>();
81 AssertFieldCount<ss::NewCycle2::Inner2Above::InnerInner, 1>();
82}
83
84TEST(AutoboxCycles, OptionalSelf) {
85 namespace ss = box::autobox::structs;
86 {
87 // Boost.Pfr refuses to process a struct in which first field is constructible from the same struct.
88 // So we can't use Boost.Pfr to check that `OptionalSelf` has exactly 1 field.
89 const auto [_] = ss::OptionalSelf{};
90 }
91 AssertFieldType<decltype(ss::OptionalSelf::self), std::optional<utils::Box<ss::OptionalSelf>>>();
92}
93
94TEST(AutoboxCycles, OptionalDouble) {
95 namespace ss = box::autobox::structs;
96 AssertFieldCount<ss::OptionalDouble::First, 1>();
97 AssertFieldType<decltype(ss::OptionalDouble::First::c), std::optional<utils::Box<ss::OptionalDouble::Second>>>();
98 AssertFieldCount<ss::OptionalDouble::Second, 1>();
99 AssertFieldType<decltype(ss::OptionalDouble::Second::c), std::optional<utils::Box<ss::OptionalDouble::First>>>();
100}
101
102TEST(AutoboxCycles, OptionalTriple) {
103 namespace ss = box::autobox::structs;
104 AssertFieldCount<ss::OptionalTriple::First, 1>();
105 AssertFieldType<decltype(ss::OptionalTriple::First::c), std::optional<utils::Box<ss::OptionalTriple::Second>>>();
106 AssertFieldCount<ss::OptionalTriple::Second, 1>();
107 AssertFieldType<decltype(ss::OptionalTriple::Second::c), std::optional<utils::Box<ss::OptionalTriple::Third>>>();
108 AssertFieldCount<ss::OptionalTriple::Third, 1>();
109 AssertFieldType<decltype(ss::OptionalTriple::Third::c), std::optional<utils::Box<ss::OptionalTriple::First>>>();
110}
111
112USERVER_NAMESPACE_END