userver: /data/code/userver/libraries/protobuf/tests/json/enum_from_json_test.cpp Source File
Loading...
Searching...
No Matches
enum_from_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <limits>
4#include <ostream>
5#include <string>
6
7#include <fmt/format.h>
8
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
11
12#include "utils.hpp"
13
14USERVER_NAMESPACE_BEGIN
15
16namespace protobuf::json::tests {
17
18namespace msgs = proto_json::messages;
19
20constexpr std::int32_t kMax = std::numeric_limits<std::int32_t>::max(); // 2147483647
21constexpr std::int32_t kMin = std::numeric_limits<std::int32_t>::min(); // -2147483648
22
23struct EnumFromJsonSuccessTestParam {
24 std::string input = {};
25 EnumMessageData expected_message = {};
26 ReadOptions options = {};
27};
28
29struct EnumFromJsonFailureTestParam {
30 std::string input = {};
31 ReadErrorCode expected_errc = {};
32 std::string expected_path = {};
33 ReadOptions options = {};
34};
35
36void PrintTo(const EnumFromJsonSuccessTestParam& param, std::ostream* os) {
37 *os << fmt::format("{{ input = '{}' }}", param.input);
38}
39
40void PrintTo(const EnumFromJsonFailureTestParam& param, std::ostream* os) {
41 *os << fmt::format("{{ input = '{}' }}", param.input);
42}
43
44class EnumFromJsonSuccessTest : public ::testing::TestWithParam<EnumFromJsonSuccessTestParam> {};
45class EnumFromJsonFailureTest : public ::testing::TestWithParam<EnumFromJsonFailureTestParam> {};
46
47INSTANTIATE_TEST_SUITE_P(
48 ,
49 EnumFromJsonSuccessTest,
50 ::testing::Values(
51 EnumFromJsonSuccessTestParam{R"({})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
52 EnumFromJsonSuccessTestParam{R"({"field1":null})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
53 EnumFromJsonSuccessTestParam{
54 R"({"field1":"TEST_UNSPECIFIED"})",
55 EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}
56 },
57 EnumFromJsonSuccessTestParam{R"({"field1":"TEST_VALUE1"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE1}},
58 EnumFromJsonSuccessTestParam{R"({"field1":"TEST_VALUE2"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE2}},
59 EnumFromJsonSuccessTestParam{
60 R"({"field1":"TEST_VALUE2_ALIAS"})",
61 EnumMessageData{msgs::EnumMessage::TEST_VALUE2}
62 },
63 EnumFromJsonSuccessTestParam{R"({"field1":"TEST_VALUE3"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE3}},
64 EnumFromJsonSuccessTestParam{R"({"field1":0})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
65 EnumFromJsonSuccessTestParam{R"({"field1":1})", EnumMessageData{msgs::EnumMessage::TEST_VALUE1}},
66 EnumFromJsonSuccessTestParam{R"({"field1":2})", EnumMessageData{msgs::EnumMessage::TEST_VALUE2}},
67 EnumFromJsonSuccessTestParam{R"({"field1":3})", EnumMessageData{msgs::EnumMessage::TEST_VALUE3}},
68 EnumFromJsonSuccessTestParam{R"({"field1":5})", EnumMessageData{static_cast<msgs::EnumMessage::Test>(5)}},
69 EnumFromJsonSuccessTestParam{R"({"field1":-5})", EnumMessageData{static_cast<msgs::EnumMessage::Test>(-5)}},
70 EnumFromJsonSuccessTestParam{
71 R"({"field1":2147483647})",
72 EnumMessageData{static_cast<msgs::EnumMessage::Test>(kMax)}
73 },
74 EnumFromJsonSuccessTestParam{
75 R"({"field1":-2147483648})",
76 EnumMessageData{static_cast<msgs::EnumMessage::Test>(kMin)}
77 }
78 )
79);
80
81INSTANTIATE_TEST_SUITE_P(
82 ,
83 EnumFromJsonFailureTest,
84 ::testing::Values(
85 EnumFromJsonFailureTestParam{R"({"field1":[]})", ReadErrorCode::kInvalidType, "field1"},
86 EnumFromJsonFailureTestParam{R"({"field1":{}})", ReadErrorCode::kInvalidType, "field1"},
87 EnumFromJsonFailureTestParam{R"({"field1":true})", ReadErrorCode::kInvalidType, "field1"},
88 EnumFromJsonFailureTestParam{R"({"field1":"TEST_NON_EXISTENT"})", ReadErrorCode::kUnknownEnum, "field1"},
89 EnumFromJsonFailureTestParam{R"({"field1":2147483648})", ReadErrorCode::kInvalidValue, "field1"},
90 EnumFromJsonFailureTestParam{R"({"field1":-2147483649})", ReadErrorCode::kInvalidValue, "field1"}
91 )
92);
93
94TEST_P(EnumFromJsonSuccessTest, Test) {
95 const auto& param = GetParam();
96
97 proto_json::messages::EnumMessage message, expected_message, sample_message;
98 formats::json::Value input = PrepareJsonTestData(param.input);
99 expected_message = PrepareTestData(param.expected_message);
100
101 message.set_field1(static_cast<proto_json::messages::EnumMessage::Test>(100001));
102
103 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::EnumMessage>(input, param.options)));
104 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
105
106 CheckMessageEqual(message, sample_message);
107 CheckMessageEqual(message, expected_message);
108}
109
110TEST_P(EnumFromJsonFailureTest, Test) {
111 const auto& param = GetParam();
112
113 proto_json::messages::EnumMessage sample_message;
114 formats::json::Value input = PrepareJsonTestData(param.input);
115
116 EXPECT_READ_ERROR(
117 (void)JsonToMessage<proto_json::messages::EnumMessage>(input, param.options),
118 param.expected_errc,
119 param.expected_path
120 );
121
122 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);
123}
124
125} // namespace protobuf::json::tests
126
127USERVER_NAMESPACE_END