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 = {};
29 bool skip_native_check =
false;
32struct EnumFromJsonFailureTestParam {
33 std::string input = {};
35 std::string expected_path = {};
39void PrintTo(
const EnumFromJsonSuccessTestParam& param, std::ostream* os) {
40 *os << fmt::format(
"{{ input = '{}' }}", param.input);
43void PrintTo(
const EnumFromJsonFailureTestParam& param, std::ostream* os) {
44 *os << fmt::format(
"{{ input = '{}' }}", param.input);
47class EnumFromJsonSuccessTest :
public ::testing::TestWithParam<EnumFromJsonSuccessTestParam> {};
48class EnumFromJsonFailureTest :
public ::testing::TestWithParam<EnumFromJsonFailureTestParam> {};
50INSTANTIATE_TEST_SUITE_P(
52 EnumFromJsonSuccessTest,
54 EnumFromJsonSuccessTestParam{R"({})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
55 EnumFromJsonSuccessTestParam{R"({"field1":null})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
56 EnumFromJsonSuccessTestParam{
57 R"({"field1":"TEST_UNSPECIFIED"})",
58 EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}
60 EnumFromJsonSuccessTestParam{R"({"field1":"TEST_VALUE1"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE1}},
61 EnumFromJsonSuccessTestParam{R"({"field1":"TEST_VALUE2"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE2}},
62 EnumFromJsonSuccessTestParam{
63 R"({"field1":"TEST_VALUE2_ALIAS"})",
64 EnumMessageData{msgs::EnumMessage::TEST_VALUE2}
66 EnumFromJsonSuccessTestParam{R"({"field1":"TEST_VALUE3"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE3}},
67 EnumFromJsonSuccessTestParam{
68 R"({"field1":"TEST_NON_EXISTENT"})",
69 EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED},
70 {.ignore_unknown_fields =
true}
72 EnumFromJsonSuccessTestParam{
73 R"({"field2":"TEST_NON_EXISTENT"})",
75 {.ignore_unknown_fields =
true}
77 EnumFromJsonSuccessTestParam{R"({"field1":"0"})", EnumMessageData{msgs::EnumMessage::TEST_UNSPECIFIED}},
78 EnumFromJsonSuccessTestParam{R"({"field1":1})", EnumMessageData{msgs::EnumMessage::TEST_VALUE1}},
79 EnumFromJsonSuccessTestParam{R"({"field1":"2"})", EnumMessageData{msgs::EnumMessage::TEST_VALUE2}},
80 EnumFromJsonSuccessTestParam{R"({"field1":3})", EnumMessageData{msgs::EnumMessage::TEST_VALUE3}},
81 EnumFromJsonSuccessTestParam{R"({"field1":5})", EnumMessageData{
static_cast<msgs::EnumMessage::Test>(5)}},
82 EnumFromJsonSuccessTestParam{
84 EnumMessageData{
static_cast<msgs::EnumMessage::Test>(-5)},
88 EnumFromJsonSuccessTestParam{
89 R"({"field1":2147483647})",
90 EnumMessageData{
static_cast<msgs::EnumMessage::Test>(kMax)}
92 EnumFromJsonSuccessTestParam{
93 R"({"field1":-2147483648})",
94 EnumMessageData{
static_cast<msgs::EnumMessage::Test>(kMin)}
99INSTANTIATE_TEST_SUITE_P(
101 EnumFromJsonFailureTest,
114TEST_P(EnumFromJsonSuccessTest, Test) {
115 const auto& param = GetParam();
117 proto_json::messages::EnumMessage message;
118 proto_json::messages::EnumMessage expected_message;
119 proto_json::messages::EnumMessage sample_message;
120 formats::
json::
Value input = PrepareJsonTestData(param.input);
121 expected_message = PrepareTestData(param.expected_message);
123 message.set_field1(
static_cast<proto_json::messages::EnumMessage::Test>(100001));
125 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::EnumMessage>(input, param.options)));
127 if (!param.skip_native_check) {
128 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
129 CheckMessageEqual(message, sample_message);
132 CheckMessageEqual(message, expected_message);
135TEST_P(EnumFromJsonFailureTest, Test) {
136 const auto& param = GetParam();
138 proto_json::messages::EnumMessage sample_message;
139 formats::
json::
Value input = PrepareJsonTestData(param.input);
142 (
void)JsonToMessage<proto_json::messages::EnumMessage>(input, param.options),