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 ParseOptions options = {};
27};
28
29struct EnumFromJsonFailureTestParam {
30 std::string input = {};
31 ParseErrorCode expected_errc = {};
32 std::string expected_path = {};
33 ParseOptions 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{
65 R"({"field1":"TEST_NON_EXISTENT"})",
66 EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED},
67 {.ignore_unknown_fields = true}
68 },
69 EnumFromJsonSuccessTestParam{
70 R"({"field2":"TEST_NON_EXISTENT"})",
71 EnumMessageData{},
72 {.ignore_unknown_fields = true}
73 },
74 EnumFromJsonSuccessTestParam{R"({"field1":"0"})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
75 EnumFromJsonSuccessTestParam{R"({"field1":1})", EnumMessageData{msgs::EnumMessage::TEST_VALUE1}},
76 EnumFromJsonSuccessTestParam{R"({"field1":"2"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE2}},
77 EnumFromJsonSuccessTestParam{R"({"field1":3})", EnumMessageData{msgs::EnumMessage::TEST_VALUE3}},
78 EnumFromJsonSuccessTestParam{R"({"field1":5})", EnumMessageData{static_cast<msgs::EnumMessage::Test>(5)}},
79 EnumFromJsonSuccessTestParam{R"({"field1":"-5"})", EnumMessageData{static_cast<msgs::EnumMessage::Test>(-5)}},
80 EnumFromJsonSuccessTestParam{
81 R"({"field1":2147483647})",
82 EnumMessageData{static_cast<msgs::EnumMessage::Test>(kMax)}
83 },
84 EnumFromJsonSuccessTestParam{
85 R"({"field1":-2147483648})",
86 EnumMessageData{static_cast<msgs::EnumMessage::Test>(kMin)}
87 }
88 )
89);
90
91INSTANTIATE_TEST_SUITE_P(
92 ,
93 EnumFromJsonFailureTest,
94 ::testing::Values(
95 EnumFromJsonFailureTestParam{R"({"field1":[]})", ParseErrorCode::kInvalidType, "field1"},
96 EnumFromJsonFailureTestParam{R"({"field1":{}})", ParseErrorCode::kInvalidType, "field1"},
97 EnumFromJsonFailureTestParam{R"({"field1":true})", ParseErrorCode::kInvalidType, "field1"},
98 EnumFromJsonFailureTestParam{R"({"field1":"TEST_NON_EXISTENT"})", ParseErrorCode::kUnknownEnum, "field1"},
99 EnumFromJsonFailureTestParam{R"({"field1":"1+1"})", ParseErrorCode::kInvalidValue, "field1"},
100 EnumFromJsonFailureTestParam{R"({"field1":"-1a"})", ParseErrorCode::kInvalidValue, "field1"},
101 EnumFromJsonFailureTestParam{R"({"field1":2147483648})", ParseErrorCode::kInvalidValue, "field1"},
102 EnumFromJsonFailureTestParam{R"({"field1":-2147483649})", ParseErrorCode::kInvalidValue, "field1"}
103 )
104);
105
106TEST_P(EnumFromJsonSuccessTest, Test) {
107 const auto& param = GetParam();
108
109 proto_json::messages::EnumMessage message;
110 proto_json::messages::EnumMessage expected_message;
111 proto_json::messages::EnumMessage sample_message;
112 formats::json::Value input = PrepareJsonTestData(param.input);
113 expected_message = PrepareTestData(param.expected_message);
114
115 message.set_field1(static_cast<proto_json::messages::EnumMessage::Test>(100001));
116
117 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::EnumMessage>(input, param.options)));
118 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
119
120 CheckMessageEqual(message, sample_message);
121 CheckMessageEqual(message, expected_message);
122}
123
124TEST_P(EnumFromJsonFailureTest, Test) {
125 const auto& param = GetParam();
126
127 proto_json::messages::EnumMessage sample_message;
128 formats::json::Value input = PrepareJsonTestData(param.input);
129
131 (void)JsonToMessage<proto_json::messages::EnumMessage>(input, param.options),
132 param.expected_errc,
133 param.expected_path
134 );
135
136 UEXPECT_THROW(InitSampleMessage(param.input, sample_message, param.options), SampleError);
137}
138
139} // namespace protobuf::json::tests
140
141USERVER_NAMESPACE_END