1#include <gtest/gtest.h>
9#include <userver/proto-structs/convert.hpp>
10#include <userver/proto-structs/hash_map.hpp>
11#include <userver/proto-structs/type_mapping.hpp>
13#include <box/options/initialization.pb.h>
14#include <box/options/initialization.structs.usrv.pb.hpp>
15#include <test_utils/type_assertions.hpp>
17namespace structs = box::options::structs;
19USERVER_NAMESPACE_BEGIN
21TEST(BoxInitialization, NotDefinedYet) { AssertFieldCount<structs::NotDefinedYet, 0>(); }
25template <
typename FieldType,
typename MessageType>
26void CheckDependsOnNotDefinedYet() {
27 AssertFieldCount<MessageType, 5>();
28 AssertFieldType<
decltype(MessageType::plain_field), utils::Box<FieldType>>();
29 AssertFieldType<
decltype(MessageType::optional_field), std::optional<utils::Box<FieldType>>>();
30 AssertFieldType<
decltype(MessageType::vector_field), std::vector<FieldType>>();
31 AssertFieldType<
decltype(MessageType::map_field), utils::Box<proto_structs::HashMap<std::string, FieldType>>>();
32 AssertFieldType<
decltype(MessageType::oneof),
typename MessageType::Oneof>();
34 static_assert(std::same_as<
35 proto_structs::OneofAlternativeType<0,
typename MessageType::Oneof>,
36 utils::Box<FieldType>>);
38 MessageType test_struct{
39 .plain_field = FieldType{},
40 .optional_field = FieldType{},
41 .vector_field = {FieldType{}},
42 .map_field = {{{
"key", FieldType{}}}},
43 .oneof = MessageType::Oneof::make_oneof_field(FieldType{}),
46 auto test_message = proto_structs::StructToMessage(test_struct);
47 auto test_struct_again = proto_structs::MessageToStruct<MessageType>(test_message);
49 ASSERT_EQ(test_struct_again, test_struct);
54TEST(BoxInitialization, DependsOnNotDefinedYet) {
55 CheckDependsOnNotDefinedYet<structs::NotDefinedYet, structs::DependsOnNotDefinedYet>();
58TEST(BoxInitialization, IndirectlyDependsOnNotDefinedYet) {
59 CheckDependsOnNotDefinedYet<structs::DependsOnNotDefinedYet, structs::IndirectlyDependsOnNotDefinedYet>();