userver: /data/code/userver/libraries/proto-structs/codegen-tests/src/oneof/proto2_test.cpp Source File
Loading...
Searching...
No Matches
proto2_test.cpp
1#include <type_traits>
2
3#include <gtest/gtest.h>
4
5#include <oneof/proto2.structs.usrv.pb.hpp>
6
7USERVER_NAMESPACE_BEGIN
8
9TEST(OneofProto2, OneofEmpty) {
10 oneof::structs::Proto2 message;
11 static_assert(std::is_same_v<decltype(message.oneof), oneof::structs::Proto2::Oneof>);
12
13 EXPECT_FALSE(message.oneof.has_integer());
14 EXPECT_THROW([[maybe_unused]] const auto& not_found = message.oneof.integer(), proto_structs::OneofAccessError);
15}
16
17TEST(OneofProto2, OneofFundamentalTypes) {
18 oneof::structs::Proto2 message;
19
20 message.oneof.set_integer(42);
21 EXPECT_TRUE(message.oneof.has_integer());
22 EXPECT_EQ(message.oneof.integer(), 42);
23 EXPECT_FALSE(message.oneof.has_string());
24 EXPECT_THROW([[maybe_unused]] const auto& not_found1 = message.oneof.string(), proto_structs::OneofAccessError);
25
26 message.oneof.set_string("proto2_text");
27 EXPECT_TRUE(message.oneof.has_string());
28 EXPECT_EQ(message.oneof.string(), "proto2_text");
29 EXPECT_FALSE(message.oneof.has_integer());
30 EXPECT_THROW([[maybe_unused]] const auto& not_found2 = message.oneof.integer(), proto_structs::OneofAccessError);
31}
32
33TEST(OneofProto2, OneofMessage) {
34 oneof::structs::Proto2 message;
35
36 message.oneof.set_message({.field = "message_text"});
37 EXPECT_TRUE(message.oneof.has_message());
38 EXPECT_EQ(message.oneof.message().field, "message_text");
39}
40
41TEST(OneofProto2, OneofEnum) {
42 oneof::structs::Proto2 message;
43
44 message.oneof.set_enum_(oneof::structs::Proto2::Enum::kFoo);
45 EXPECT_TRUE(message.oneof.has_enum_());
46 EXPECT_EQ(message.oneof.enum_(), oneof::structs::Proto2::Enum::kFoo);
47}
48
49TEST(OneofProto2, OneofGroup) {
50 oneof::structs::Proto2 message;
51
52 oneof::structs::Proto2::Group group;
53 group.x = 100;
54 group.y = "group_text";
55 message.oneof.set_group(group);
56
57 EXPECT_TRUE(message.oneof.has_group());
58 EXPECT_EQ(message.oneof.group().x, 100);
59 EXPECT_EQ(message.oneof.group().y, "group_text");
60}
61
62TEST(OneofProto2, GroupOneof) {
63 oneof::structs::Proto2 message;
64
65 oneof::structs::Proto2::Group group;
66 group.x = 100;
67 group.group_oneof.set_z({.field = "nested_message"});
68 message.oneof.set_group(group);
69
70 EXPECT_TRUE(message.oneof.has_group());
71 EXPECT_TRUE(message.oneof.group().group_oneof.has_z());
72 EXPECT_EQ(message.oneof.group().group_oneof.z().field, "nested_message");
73
74 // Change the oneof inside the group
75 message.oneof.mutable_group().group_oneof.set_w(oneof::structs::Proto2::Enum::kFoo);
76 EXPECT_TRUE(message.oneof.mutable_group().group_oneof.has_w());
77 EXPECT_EQ(message.oneof.mutable_group().group_oneof.w(), oneof::structs::Proto2::Enum::kFoo);
78 EXPECT_FALSE(message.oneof.mutable_group().group_oneof.has_z());
79}
80
81TEST(OneofProto2, NestedTypesOutsideGroup) {
82 oneof::structs::Proto2 message;
83
84 // Using MessageInGroup outside the group context
85 message.message_from_group.foo = "foo_value";
86 EXPECT_EQ(message.message_from_group.foo, "foo_value");
87
88 // Using EnumInGroup outside the group context
89 message.enum_from_group.push_back(oneof::structs::Proto2::Group::EnumInGroup::kFoo);
90 EXPECT_EQ(message.enum_from_group.size(), std::size_t{1});
91 EXPECT_EQ(message.enum_from_group[0], oneof::structs::Proto2::Group::EnumInGroup::kFoo);
92}
93
94TEST(OneofProto2, SingleFieldOneof) {
95 oneof::structs::Proto2 message;
96 static_assert(std::is_same_v<decltype(message.single_field_oneof), oneof::structs::Proto2::SingleFieldOneof>);
97
98 EXPECT_FALSE(message.single_field_oneof.has_single());
99
100 message.single_field_oneof.set_single("single_field_text");
101 EXPECT_TRUE(message.single_field_oneof.has_single());
102 EXPECT_EQ(message.single_field_oneof.single(), "single_field_text");
103}
104
105TEST(OneofProto2, OptionalFieldBefore) {
106 oneof::structs::Proto2 message;
107 static_assert(std::is_same_v<decltype(message.field_before), std::optional<std::string>>);
108
109 EXPECT_FALSE(message.field_before.has_value());
110
111 message.field_before = "field_before_value";
112 EXPECT_TRUE(message.field_before.has_value());
113 EXPECT_EQ(*message.field_before, "field_before_value");
114}
115
116USERVER_NAMESPACE_END