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 RepeatedToJsonSuccessTestParam {
16 std::string expected_json = {};
17 PrintOptions options = {};
20struct RepeatedToJsonFailureTestParam {
22 PrintErrorCode expected_errc = {};
23 std::string expected_path = {};
24 PrintOptions options = {};
27class RepeatedToJsonSuccessTest :
public ::testing::TestWithParam<RepeatedToJsonSuccessTestParam> {};
28class RepeatedToJsonFailureTest :
public ::testing::TestWithParam<RepeatedToJsonFailureTestParam> {};
30INSTANTIATE_TEST_SUITE_P(
32 RepeatedToJsonSuccessTest,
34 RepeatedToJsonSuccessTestParam{RepeatedMessageData{}, R"({})"},
35 RepeatedToJsonSuccessTestParam{
36 RepeatedMessageData{},
38 "field1":[],"field2":[],"field3":[],"field4":[],"field5":[],"field6":[],"field7":[],
39 "field8":[],"field9":[],"field10":[],"field11":[],"field12":[]
40 })",
41 {.always_print_fields_with_no_presence =
true}
43 RepeatedToJsonSuccessTestParam{RepeatedMessageData{.field1 = {1, 2, 3}}, R"({"field1":[1,2,3]})"},
44 RepeatedToJsonSuccessTestParam{
45 RepeatedMessageData{.field2 = {{
true}, {
false}, {
true}, {
true}}},
46 R"({"field2":[{"field1":true},{},{"field1":true},{"field1":true}]})"
48 RepeatedToJsonSuccessTestParam{
49 RepeatedMessageData{.field3 = {{.seconds = 123, .nanos = 987000000}}},
50 R"({"field3":["123.987s"]})"
52 RepeatedToJsonSuccessTestParam{
54 .field4 = {ProtoValue{}, ProtoValue{-10.0}, ProtoValue{}, ProtoValue{
"hello"}, ProtoValue{}}
56 R"({"field4":[-10,"hello"]})"
58 RepeatedToJsonSuccessTestParam{
59 RepeatedMessageData{.field1 = {0}, .field2 = {{
false}}, .field3 = {{.seconds = 0, .nanos = 0}}},
60 R"({"field1":[0],"field2":[{}],"field3":["0s"]})"
62 RepeatedToJsonSuccessTestParam{
66 .field3 = {{.seconds = 0, .nanos = 0}},
67 .field4 = {ProtoValue{1.5}},
75 .field12 = {proto_json::messages::RepeatedMessage::TEST_VALUE1}
78 "field1":[0],"field2":[{}],"field3":["0s"],"field4":[1.5],"field5":[1],"field6":["-1"],"field7":["1"],
79 "field8":[1.5],"field9":[-1.5],"field10":[false],"field11":["hello"],"field12":["TEST_VALUE1"]
80 })"
85INSTANTIATE_TEST_SUITE_P(
87 RepeatedToJsonFailureTest,
88 ::testing::Values(RepeatedToJsonFailureTestParam{
90 .field3 = {{.seconds = 1, .nanos = 1}, {.seconds = 1, .nanos = -1}, {.seconds = 0, .nanos = 1}}
92 PrintErrorCode::kInvalidValue,
97TEST_P(RepeatedToJsonSuccessTest, Test) {
98 const auto& param = GetParam();
100 auto input = PrepareTestData(param.input);
101 formats::json::
Value json;
102 formats::json::
Value expected_json;
103 formats::json::
Value sample_json;
105 UASSERT_NO_THROW((json = MessageToJson(input, param.options)));
106 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
107 UASSERT_NO_THROW((sample_json = CreateSampleJson(input, param.options)));
109 EXPECT_EQ(json, expected_json);
110 EXPECT_EQ(expected_json, sample_json);
113TEST_P(RepeatedToJsonFailureTest, Test) {
114 const auto& param = GetParam();
115 auto input = PrepareTestData(param.input);
117 EXPECT_PRINT_ERROR((
void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
118 UEXPECT_THROW((
void)CreateSampleJson(input, param.options), SampleError);