1#include <gtest/gtest.h>
5#include <userver/protobuf/json/convert.hpp>
6#include <userver/utest/assert_macros.hpp>
10USERVER_NAMESPACE_BEGIN
12namespace protobuf::json::tests {
14struct MapToJsonSuccessTestParam {
16 std::string expected_json = {};
17 PrintOptions options = {};
20struct MapToJsonFailureTestParam {
22 PrintErrorCode expected_errc = {};
23 std::string expected_path = {};
24 PrintOptions options = {};
27class MapToJsonSuccessTest :
public ::testing::TestWithParam<MapToJsonSuccessTestParam> {};
28class MapToJsonFailureTest :
public ::testing::TestWithParam<MapToJsonFailureTestParam> {};
30INSTANTIATE_TEST_SUITE_P(
34 MapToJsonSuccessTestParam{MapMessageData{}, R"({})"},
35 MapToJsonSuccessTestParam{
37 R"({"field1":{},"field2":{},"field3":{},"field4":{},"field5":{},"field6":{},"field7":{},"field8":{}})",
38 {.always_print_fields_with_no_presence =
true}
40 MapToJsonSuccessTestParam{
42 .field1 = {{1, 2}, {3, 4}, {5, 6}},
43 .field2 = {{10, 1.5}, {20, 1.5}},
44 .field3 = {{100,
true}, {-200,
false}},
45 .field4 = {{1000,
"hello"}, {2000,
"world"}},
47 {{
true, proto_json::messages::MapMessage::TEST_ENUM_VALUE1},
48 {
false, proto_json::messages::MapMessage::TEST_ENUM_VALUE0}},
49 .field6 = {{
"aaa", {
true}}, {
"bbb", {
false}}},
50 .field7 = {{
"ccc", {.seconds = 10, .nanos = 999}}},
51 .field8 = {{-2, ProtoValue{}}, {-1, ProtoValue{
"test"}}, {0, ProtoValue{}}, {1, ProtoValue{
true}}}
54 "field1":{"1":2,"3":4,"5":6},
55 "field2":{"10":1.5,"20":1.5},
56 "field3":{"100":true,"-200":false},
57 "field4":{"1000":"hello","2000":"world"},
58 "field5":{"true":"TEST_ENUM_VALUE1","false":"TEST_ENUM_VALUE0"},
59 "field6":{"aaa":{"field1":true},"bbb":{}},
60 "field7":{"ccc":"10.000000999s"},
61 "field8":{"-1":"test","1":true}
62 })"
64 MapToJsonSuccessTestParam{
67 {{
true, proto_json::messages::MapMessage::TEST_ENUM_VALUE0},
68 {
false, proto_json::messages::MapMessage::TEST_ENUM_VALUE1}}
70 R"({"field5":{"true":0,"false":1}})",
71 {.always_print_enums_as_ints =
true}
76INSTANTIATE_TEST_SUITE_P(
79 ::testing::Values(MapToJsonFailureTestParam{
80 MapMessageData{.field7 = {{
"aaa", {.seconds = 1, .nanos = -1}}}},
81 PrintErrorCode::kInvalidValue,
86TEST_P(MapToJsonSuccessTest, Test) {
87 const auto& param = GetParam();
89 auto input = PrepareTestData(param.input);
90 formats::json::
Value json;
91 formats::json::
Value expected_json;
92 formats::json::
Value sample_json;
94 UASSERT_NO_THROW((json = MessageToJson(input, param.options)));
95 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
96 UASSERT_NO_THROW((sample_json = CreateSampleJson(input, param.options)));
98 EXPECT_EQ(json, expected_json);
99 EXPECT_EQ(expected_json, sample_json);
102TEST_P(MapToJsonFailureTest, Test) {
103 const auto& param = GetParam();
104 auto input = PrepareTestData(param.input);
106 EXPECT_PRINT_ERROR((
void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
107 UEXPECT_THROW((
void)CreateSampleJson(input, param.options), SampleError);