1#include <gtest/gtest.h>
5#include <box/autobox/cycles.structs.usrv.pb.hpp>
6#include <test_utils/type_assertions.hpp>
10TEST(AutoboxCycles, Self) {
11 namespace ss = box::autobox::structs;
12 AssertFieldType<
decltype(ss::Self::self), utils::Box<ss::Self>>();
13 AssertFieldCount<ss::CycleEnd, 1>();
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>>();
22 AssertFieldCount<ss::First, 1>();
23 AssertFieldCount<ss::Second, 1>();
24 AssertFieldCount<ss::Third, 1>();
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>>();
33 AssertFieldCount<ss::CycleEnd, 1>();
34 AssertFieldCount<ss::CycleStart, 2>();
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>>();
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>();
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>>();
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>();
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>>();
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>();
84TEST(AutoboxCycles, OptionalSelf) {
85 namespace ss = box::autobox::structs;
89 const auto [_] = ss::OptionalSelf{};
91 AssertFieldType<
decltype(ss::OptionalSelf::self), std::optional<utils::Box<ss::OptionalSelf>>>();
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>>>();
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>>>();