1#include <gtest/gtest.h>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
16namespace protobuf::json::tests {
18namespace msgs = proto_json::messages;
20constexpr std::int32_t kMax = std::numeric_limits<std::int32_t>::max();
21constexpr std::int32_t kMin = std::numeric_limits<std::int32_t>::min();
23struct EnumFromJsonSuccessTestParam {
24 std::string input = {};
26 ParseOptions options = {};
29struct EnumFromJsonFailureTestParam {
30 std::string input = {};
31 ParseErrorCode expected_errc = {};
32 std::string expected_path = {};
33 ParseOptions options = {};
36void PrintTo(
const EnumFromJsonSuccessTestParam& param, std::ostream* os) {
37 *os << fmt::format(
"{{ input = '{}' }}", param.input);
40void PrintTo(
const EnumFromJsonFailureTestParam& param, std::ostream* os) {
41 *os << fmt::format(
"{{ input = '{}' }}", param.input);
44class EnumFromJsonSuccessTest :
public ::testing::TestWithParam<EnumFromJsonSuccessTestParam> {};
45class EnumFromJsonFailureTest :
public ::testing::TestWithParam<EnumFromJsonFailureTestParam> {};
47INSTANTIATE_TEST_SUITE_P(
49 EnumFromJsonSuccessTest,
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}
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}
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}
69 EnumFromJsonSuccessTestParam{
70 R"({"field2":"TEST_NON_EXISTENT"})",
72 {.ignore_unknown_fields =
true}
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)}
84 EnumFromJsonSuccessTestParam{
85 R"({"field1":-2147483648})",
86 EnumMessageData{
static_cast<msgs::EnumMessage::Test>(kMin)}
91INSTANTIATE_TEST_SUITE_P(
93 EnumFromJsonFailureTest,
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"}
106TEST_P(EnumFromJsonSuccessTest, Test) {
107 const auto& param = GetParam();
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);
115 message.set_field1(
static_cast<proto_json::messages::EnumMessage::Test>(100001));
117 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::EnumMessage>(input, param.options)));
118 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
120 CheckMessageEqual(message, sample_message);
121 CheckMessageEqual(message, expected_message);
124TEST_P(EnumFromJsonFailureTest, Test) {
125 const auto& param = GetParam();
127 proto_json::messages::EnumMessage sample_message;
128 formats::json::
Value input = PrepareJsonTestData(param.input);
131 (
void)JsonToMessage<proto_json::messages::EnumMessage>(input, param.options),
136 UEXPECT_THROW(InitSampleMessage(param.input, sample_message, param.options), SampleError);