1#include <gtest/gtest.h>
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
13USERVER_NAMESPACE_BEGIN
15namespace protobuf::json::tests {
17struct MapFromJsonSuccessTestParam {
18 std::string input = {};
23struct MapFromJsonFailureTestParam {
24 std::string input = {};
26 std::string expected_path = {};
30 bool skip_native_check =
false;
33void PrintTo(
const MapFromJsonSuccessTestParam& param, std::ostream* os) {
34 *os << fmt::format(
"{{ input = '{}' }}", param.input);
37void PrintTo(
const MapFromJsonFailureTestParam& param, std::ostream* os) {
38 *os << fmt::format(
"{{ input = '{}' }}", param.input);
41class MapFromJsonSuccessTest :
public ::testing::TestWithParam<MapFromJsonSuccessTestParam> {};
42class MapFromJsonFailureTest :
public ::testing::TestWithParam<MapFromJsonFailureTestParam> {};
44INSTANTIATE_TEST_SUITE_P(
46 MapFromJsonSuccessTest,
48 MapFromJsonSuccessTestParam{R"({})", MapMessageData{}},
49 MapFromJsonSuccessTestParam{
50 R"({"field1":{},"field2":{},"field3":{},"field4":{},"field5":{},"field6":{},"field7":{}})",
53 MapFromJsonSuccessTestParam{
55 "field1":{"1":2,"3":4,"5":6},
56 "field2":{"10":1.5,"20":1.5},
57 "field3":{"100":true,"200":false},
58 "field4":{"1000":"hello","2000":"world"},
59 "field5":{"true":"TEST_ENUM_VALUE1","false":"TEST_ENUM_VALUE0"},
60 "field6":{"aaa":{"field1":true},"bbb":{}},
61 "field7":{"ccc":"10.000000999s"}
62 })",
64 .field1 = {{1, 2}, {3, 4}, {5, 6}},
65 .field2 = {{10, 1.5}, {20, 1.5}},
66 .field3 = {{100,
true}, {200,
false}},
67 .field4 = {{1000,
"hello"}, {2000,
"world"}},
69 {{
true, proto_json::messages::MapMessage::TEST_ENUM_VALUE1},
70 {
false, proto_json::messages::MapMessage::TEST_ENUM_VALUE0}},
71 .field6 = {{
"aaa", {
true}}, {
"bbb", {
false}}},
72 .field7 = {{
"ccc", {.seconds = 10, .nanos = 999}}}
75 MapFromJsonSuccessTestParam{
76 R"({"field5":{"true":0,"false":1}})",
79 {{
true, proto_json::messages::MapMessage::TEST_ENUM_VALUE0},
80 {
false, proto_json::messages::MapMessage::TEST_ENUM_VALUE1}}
86INSTANTIATE_TEST_SUITE_P(
88 MapFromJsonFailureTest,
95 MapFromJsonFailureTestParam{
96 R"({"field2":{"10":1.5,"-10":0,"0":0}})",
100 MapFromJsonFailureTestParam{
101 R"({"field3":{"10":true,"10x":false}})",
106 MapFromJsonFailureTestParam{
107 R"({"field5":{"TRUE":0}})",
118TEST_P(MapFromJsonSuccessTest, Test) {
119 using Message = proto_json::messages::MapMessage;
120 const auto& param = GetParam();
123 Message expected_message;
124 Message sample_message;
125 formats::
json::
Value input = PrepareJsonTestData(param.input);
126 expected_message = PrepareTestData(param.expected_message);
129 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
131 CheckMessageEqual(message, sample_message);
132 CheckMessageEqual(message, expected_message);
135TEST_P(MapFromJsonFailureTest, Test) {
136 using Message = proto_json::messages::MapMessage;
137 const auto& param = GetParam();
140 formats::
json::
Value input = PrepareJsonTestData(param.input);
142 EXPECT_PARSE_ERROR((
void)JsonToMessage<Message>(input, param.options), param.expected_errc, param.expected_path);
144 if (!param.skip_native_check) {