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 RepeatedFromJsonSuccessTestParam {
18 std::string input = {};
23struct RepeatedFromJsonFailureTestParam {
24 std::string input = {};
26 std::string expected_path = {};
32 bool skip_native_check =
false;
35void PrintTo(
const RepeatedFromJsonSuccessTestParam& param, std::ostream* os) {
36 *os << fmt::format(
"{{ input = '{}' }}", param.input);
39void PrintTo(
const RepeatedFromJsonFailureTestParam& param, std::ostream* os) {
40 *os << fmt::format(
"{{ input = '{}' }}", param.input);
43class RepeatedFromJsonSuccessTest :
public ::testing::TestWithParam<RepeatedFromJsonSuccessTestParam> {};
44class RepeatedFromJsonFailureTest :
public ::testing::TestWithParam<RepeatedFromJsonFailureTestParam> {};
46INSTANTIATE_TEST_SUITE_P(
48 RepeatedFromJsonSuccessTest,
50 RepeatedFromJsonSuccessTestParam{R"({})", RepeatedMessageData{}},
51 RepeatedFromJsonSuccessTestParam{
53 "field1":[],"field2":[],"field3":[],"field4":[],"field5":[],"field6":[],"field7":[],
54 "field8":[],"field9":[],"field10":[],"field11":[],"field12":[]
55 })",
58 RepeatedFromJsonSuccessTestParam{
61 "field1":null,"field2":null,"field3":null,"field5":null,"field6":null,"field7":null,"field8":null,
62 "field9":null,"field10":null,"field11":null,"field12":null
63 })",
66 RepeatedFromJsonSuccessTestParam{
68 "field1":[100],
69 "field2":[{"field1":true}],
70 "field3":["123.987s"],
71 "field4":[null],
72 "field5":[1],
73 "field6":["-1"],
74 "field7":["1"],
75 "field8":["-1.5"],
76 "field9":[1.5],
77 "field10":[false],
78 "field11":["hello"],
79 "field12":["TEST_VALUE1"]
80 })",
84 {{.seconds = 123, .nanos = 987'000'000}},
85 {ProtoValue{ProtoNullValue{}}},
93 {proto_json::messages::RepeatedMessage::TEST_VALUE1}
96 RepeatedFromJsonSuccessTestParam{
98 "field1":[100,0,200],
99 "field2":[{"field1":true},{"field1":false}],
100 "field3":["123.987s","0s","-987s"]
101 })",
105 {{.seconds = 123, .nanos = 987'000'000}, {}, {.seconds = -987}}
111INSTANTIATE_TEST_SUITE_P(
113 RepeatedFromJsonFailureTest,
116 RepeatedFromJsonFailureTestParam{
126 RepeatedFromJsonFailureTestParam{
127 R"({"field1":[1, null, 2]})",
135 RepeatedFromJsonFailureTestParam{
136 R"({"field3":["123.100s", "-123.100s", null]})",
143 RepeatedFromJsonFailureTestParam{
144 R"({"field1":[[1,2,3]]})",
151 RepeatedFromJsonFailureTestParam{
152 R"({"field2":[[{"field1":true}]]})",
159 RepeatedFromJsonFailureTestParam{
160 R"({"field2":[{"field1":true},"oops"]})",
164 RepeatedFromJsonFailureTestParam{
165 R"({"field3":["123.100s", "oops"]})",
172TEST_P(RepeatedFromJsonSuccessTest, Test) {
173 using Message = proto_json::messages::RepeatedMessage;
174 const auto& param = GetParam();
177 Message expected_message;
178 Message sample_message;
179 formats::
json::
Value input = PrepareJsonTestData(param.input);
180 expected_message = PrepareTestData(param.expected_message);
183 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
185 CheckMessageEqual(message, sample_message);
186 CheckMessageEqual(message, expected_message);
189TEST_P(RepeatedFromJsonFailureTest, Test) {
190 using Message = proto_json::messages::RepeatedMessage;
191 const auto& param = GetParam();
194 formats::
json::
Value input = PrepareJsonTestData(param.input);
196 EXPECT_PARSE_ERROR((
void)JsonToMessage<Message>(input, param.options), param.expected_errc, param.expected_path);
198 if (!param.skip_native_check) {