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>
12#include <userver/utils/box.hpp>
14#include <box/options/initialization.pb.h>
15#include <box/options/initialization.structs.usrv.pb.hpp>
16#include <test_utils/type_assertions.hpp>
18namespace structs = box::options::structs;
20USERVER_NAMESPACE_BEGIN
22TEST(BoxInitialization, NotDefinedYet) { AssertFieldCount<structs::NotDefinedYet, 0>(); }
26template <
typename FieldType,
typename MessageType>
27void CheckDependsOnNotDefinedYet() {
28 AssertFieldCount<MessageType, 5>();
29 AssertFieldType<
decltype(MessageType::plain_field),
utils::
Box<FieldType>>();
30 AssertFieldType<
decltype(MessageType::optional_field), std::optional<
utils::
Box<FieldType>>>();
31 AssertFieldType<
decltype(MessageType::vector_field), std::vector<FieldType>>();
32 AssertFieldType<
decltype(MessageType::map_field), utils::Box<proto_structs::HashMap<std::string, FieldType>>>();
33 AssertFieldType<
decltype(MessageType::oneof),
typename MessageType::Oneof>();
35 static_assert(std::same_as<
36 proto_structs::OneofAlternativeType<0,
typename MessageType::Oneof>,
37 utils::Box<FieldType>>);
39 MessageType test_struct{
40 .plain_field = FieldType{},
41 .optional_field = FieldType{},
42 .vector_field = {FieldType{}},
43 .map_field = {{{
"key", FieldType{}}}},
44 .oneof = MessageType::Oneof::make_oneof_field(FieldType{}),
47 auto test_message = proto_structs::StructToMessage(test_struct);
48 auto test_struct_again = proto_structs::MessageToStruct<MessageType>(test_message);
56TEST(BoxInitialization, DependsOnNotDefinedYet) {
57 CheckDependsOnNotDefinedYet<structs::NotDefinedYet, structs::DependsOnNotDefinedYet>();
60TEST(BoxInitialization, IndirectlyDependsOnNotDefinedYet) {
61 CheckDependsOnNotDefinedYet<structs::DependsOnNotDefinedYet, structs::IndirectlyDependsOnNotDefinedYet>();