userver: /home/antonyzhilin/arcadia/taxi/uservices/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
33// TODO enable once fields of message and enum types are implemented.
34#if 0
35
36TEST(OneofProto2, OneofMessage) {
37 oneof::structs::Proto2 message;
38
39 message.oneof.set_message({.field = "message_text"});
40 EXPECT_TRUE(message.oneof.has_message());
41 EXPECT_EQ(message.oneof.message().field, "message_text");
42}
43
44TEST(OneofProto2, OneofEnum) {
45 oneof::structs::Proto2 message;
46
47 message.oneof.set_enum(oneof::structs::Proto2::ENUM2_FOO);
48 EXPECT_TRUE(message.oneof.has_enum());
49 EXPECT_EQ(message.oneof.enum_(), oneof::structs::Proto2::ENUM2_FOO);
50}
51
52TEST(OneofProto2, OneofGroup) {
53 oneof::structs::Proto2 message;
54
55 oneof::structs::Proto2::Group group;
56 group.x = 100;
57 group.y = "group_text";
58 message.oneof.set_group(group);
59
60 EXPECT_TRUE(message.oneof.has_group());
61 EXPECT_EQ(message.oneof.group().x, 100);
62 EXPECT_EQ(message.oneof.group().y, "group_text");
63}
64
65TEST(OneofProto2, GroupOneof) {
66 oneof::structs::Proto2 message;
67
68 oneof::structs::Proto2::Group group;
69 group.x = 100;
70 group.group_oneof.set_z({.field = "nested_message"});
71 message.oneof.set_group(group);
72
73 EXPECT_TRUE(message.oneof.has_group());
74 EXPECT_TRUE(message.oneof.group().group_oneof.has_z());
75 EXPECT_EQ(message.oneof.group().group_oneof.z().field, "nested_message");
76
77 // Change the oneof inside the group
78 message.oneof.group().group_oneof.set_w(oneof::structs::Proto2::ENUM2_FOO);
79 EXPECT_TRUE(message.oneof.group().group_oneof.has_w());
80 EXPECT_EQ(message.oneof.group().group_oneof.w(), oneof::structs::Proto2::ENUM2_FOO);
81 EXPECT_FALSE(message.oneof.group().group_oneof.has_z());
82}
83
84TEST(OneofProto2, NestedTypesOutsideGroup) {
85 oneof::structs::Proto2 message;
86
87 // Using MessageInGroup outside the group context
88 message.message_from_group.foo = "foo_value";
89 EXPECT_EQ(message.message_from_group.foo, "foo_value");
90
91 // Using EnumInGroup outside the group context
92 message.enum_from_group.push_back(oneof::structs::Proto2::Group::ENUM_IN_GROUP_FOO);
93 EXPECT_EQ(message.enum_from_group.size(), 1);
94 EXPECT_EQ(message.enum_from_group[0], oneof::structs::Proto2::Group::ENUM_IN_GROUP_FOO);
95}
96
97#endif
98
99TEST(OneofProto2, SingleFieldOneof) {
100 oneof::structs::Proto2 message;
101 static_assert(std::is_same_v<decltype(message.single_field_oneof), oneof::structs::Proto2::SingleFieldOneof>);
102
103 EXPECT_FALSE(message.single_field_oneof.has_single());
104
105 message.single_field_oneof.set_single("single_field_text");
106 EXPECT_TRUE(message.single_field_oneof.has_single());
107 EXPECT_EQ(message.single_field_oneof.single(), "single_field_text");
108}
109
110TEST(OneofProto2, OptionalFieldBefore) {
111 oneof::structs::Proto2 message;
112 static_assert(std::is_same_v<decltype(message.field_before), std::optional<std::string>>);
113
114 EXPECT_FALSE(message.field_before.has_value());
115
116 message.field_before = "field_before_value";
117 EXPECT_TRUE(message.field_before.has_value());
118 EXPECT_EQ(*message.field_before, "field_before_value");
119}
120
121USERVER_NAMESPACE_END