userver: /data/code/userver/libraries/protobuf/tests/json/repeated_to_json_test.cpp Source File
Loading...
Searching...
No Matches
repeated_to_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <string>
4
5#include <userver/protobuf/json/convert.hpp>
6#include <userver/utest/assert_macros.hpp>
7
8#include "utils.hpp"
9
10USERVER_NAMESPACE_BEGIN
11
12namespace protobuf::json::tests {
13
14struct RepeatedToJsonSuccessTestParam {
15 RepeatedMessageData input = {};
16 std::string expected_json = {};
17 PrintOptions options = {};
18};
19
20struct RepeatedToJsonFailureTestParam {
21 RepeatedMessageData input = {};
22 PrintErrorCode expected_errc = {};
23 std::string expected_path = {};
24 PrintOptions options = {};
25};
26
27class RepeatedToJsonSuccessTest : public ::testing::TestWithParam<RepeatedToJsonSuccessTestParam> {};
28class RepeatedToJsonFailureTest : public ::testing::TestWithParam<RepeatedToJsonFailureTestParam> {};
29
30INSTANTIATE_TEST_SUITE_P(
31 ,
32 RepeatedToJsonSuccessTest,
33 ::testing::Values(
34 RepeatedToJsonSuccessTestParam{RepeatedMessageData{}, R"({})"},
35 RepeatedToJsonSuccessTestParam{
36 RepeatedMessageData{},
37 R"({
38 "field1":[],"field2":[],"field3":[],"field4":[],"field5":[],"field6":[],"field7":[],
39 "field8":[],"field9":[],"field10":[],"field11":[],"field12":[]
40 })",
41 {.always_print_fields_with_no_presence = true}
42 },
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}]})"
47 },
48 RepeatedToJsonSuccessTestParam{
49 RepeatedMessageData{.field3 = {{.seconds = 123, .nanos = 987000000}}},
50 R"({"field3":["123.987s"]})"
51 },
52 RepeatedToJsonSuccessTestParam{
53 RepeatedMessageData{
54 .field4 = {ProtoValue{}, ProtoValue{-10.0}, ProtoValue{}, ProtoValue{"hello"}, ProtoValue{}}
55 },
56 R"({"field4":[-10,"hello"]})"
57 },
58 RepeatedToJsonSuccessTestParam{
59 RepeatedMessageData{.field1 = {0}, .field2 = {{false}}, .field3 = {{.seconds = 0, .nanos = 0}}},
60 R"({"field1":[0],"field2":[{}],"field3":["0s"]})"
61 },
62 RepeatedToJsonSuccessTestParam{
63 RepeatedMessageData{
64 .field1 = {0},
65 .field2 = {{false}},
66 .field3 = {{.seconds = 0, .nanos = 0}},
67 .field4 = {ProtoValue{1.5}},
68 .field5 = {1},
69 .field6 = {-1},
70 .field7 = {1},
71 .field8 = {1.5},
72 .field9 = {-1.5},
73 .field10 = {false},
74 .field11 = {"hello"},
75 .field12 = {proto_json::messages::RepeatedMessage::TEST_VALUE1}
76 },
77 R"({
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 })"
81 }
82 )
83);
84
85INSTANTIATE_TEST_SUITE_P(
86 ,
87 RepeatedToJsonFailureTest,
88 ::testing::Values(RepeatedToJsonFailureTestParam{
89 RepeatedMessageData{
90 .field3 = {{.seconds = 1, .nanos = 1}, {.seconds = 1, .nanos = -1}, {.seconds = 0, .nanos = 1}}
91 },
92 PrintErrorCode::kInvalidValue,
93 "field3[1]"
94 })
95);
96
97TEST_P(RepeatedToJsonSuccessTest, Test) {
98 const auto& param = GetParam();
99
100 auto input = PrepareTestData(param.input);
101 formats::json::Value json;
102 formats::json::Value expected_json;
103 formats::json::Value sample_json;
104
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)));
108
109 EXPECT_EQ(json, expected_json);
110 EXPECT_EQ(expected_json, sample_json);
111}
112
113TEST_P(RepeatedToJsonFailureTest, Test) {
114 const auto& param = GetParam();
115 auto input = PrepareTestData(param.input);
116
117 EXPECT_PRINT_ERROR((void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
118 UEXPECT_THROW((void)CreateSampleJson(input, param.options), SampleError);
119}
120
121} // namespace protobuf::json::tests
122
123USERVER_NAMESPACE_END