1#include <gtest/gtest.h>
8#include <google/protobuf/dynamic_message.h>
10#include <userver/protobuf/datetime.hpp>
11#include <userver/protobuf/json/convert.hpp>
12#include <userver/utest/assert_macros.hpp>
16USERVER_NAMESPACE_BEGIN
18namespace protobuf::json::tests {
20struct DurationToJsonSuccessTestParam {
22 std::string expected_json = {};
26struct DurationToJsonFailureTestParam {
29 std::string expected_path = {};
33void PrintTo(
const DurationToJsonSuccessTestParam& param, std::ostream* os) {
34 *os << fmt::format(
"{{ input = {{.seconds={}, .nanos={}}} }}", param.input.seconds, param.input.nanos);
37void PrintTo(
const DurationToJsonFailureTestParam& param, std::ostream* os) {
38 *os << fmt::format(
"{{ input = {{.seconds={}, .nanos={}}} }}", param.input.seconds, param.input.nanos);
41class DurationToJsonSuccessTest :
public ::testing::TestWithParam<DurationToJsonSuccessTestParam> {};
42class DurationToJsonFailureTest :
public ::testing::TestWithParam<DurationToJsonFailureTestParam> {};
44INSTANTIATE_TEST_SUITE_P(
46 DurationToJsonSuccessTest,
52 DurationToJsonSuccessTestParam{
DurationMessageData{0, 567}, R"({"field1": "0.000000567s"})"},
53 DurationToJsonSuccessTestParam{
DurationMessageData{0, -567}, R"({"field1": "-0.000000567s"})"},
54 DurationToJsonSuccessTestParam{
DurationMessageData{123, 987654321}, R"({"field1": "123.987654321s"})"},
55 DurationToJsonSuccessTestParam{
DurationMessageData{-123, -987654320}, R"({"field1": "-123.987654320s"})"},
56 DurationToJsonSuccessTestParam{
DurationMessageData{123, 987654000}, R"({"field1": "123.987654s"})"},
57 DurationToJsonSuccessTestParam{
DurationMessageData{-123, -987600000}, R"({"field1": "-123.987600s"})"},
58 DurationToJsonSuccessTestParam{
DurationMessageData{123, 987000000}, R"({"field1": "123.987s"})"},
59 DurationToJsonSuccessTestParam{
DurationMessageData{-123, -980000000}, R"({"field1": "-123.980s"})"},
60 DurationToJsonSuccessTestParam{
62 R"({"field1": "315576000000.999999999s"})"
64 DurationToJsonSuccessTestParam{
66 R"({"field1": "-315576000000.999999999s"})"
71INSTANTIATE_TEST_SUITE_P(
73 DurationToJsonFailureTest,
75 DurationToJsonFailureTestParam{
80 DurationToJsonFailureTestParam{
85 DurationToJsonFailureTestParam{
90 DurationToJsonFailureTestParam{
95 DurationToJsonFailureTestParam{
103TEST_P(DurationToJsonSuccessTest, Test) {
104 const auto& param = GetParam();
106 auto input = PrepareTestData(param.input);
112 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
115 EXPECT_EQ(json, expected_json);
116 EXPECT_EQ(expected_json, sample_json);
119TEST_P(DurationToJsonFailureTest, Test) {
120 const auto& param = GetParam();
121 auto input = PrepareTestData(param.input);
123 EXPECT_PRINT_ERROR((
void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
127TEST(DurationToJsonAdditionalTest, InlinedNonNull) {
129 auto message = PrepareTestData(data);
136 EXPECT_EQ(json, sample);
137 EXPECT_EQ(json.As<std::string>(),
"123.000000321s");
140TEST(DurationToJsonAdditionalTest, InlinedNull) {
141 proto_json::messages::DurationMessage message;
148 EXPECT_EQ(json, sample);
149 EXPECT_EQ(json.As<std::string>(),
"0s");
152TEST(DurationToJsonAdditionalTest, DynamicMessage) {
153 using Message = ::google::protobuf::Duration;
154 ::google::protobuf::DynamicMessageFactory factory;
157 std::unique_ptr<::google::protobuf::Message> message(factory.GetPrototype(Message::descriptor())->New());
158 const auto reflection = message->GetReflection();
159 const auto seconds_desc = message->GetDescriptor()->FindFieldByName(
"seconds");
160 const auto nanos_desc = message->GetDescriptor()->FindFieldByName(
"nanos");
162 reflection->SetInt64(message.get(), seconds_desc, -123);
163 reflection->SetInt32(message.get(), nanos_desc, -987);
169 EXPECT_EQ(json.As<std::string>(),
"-123.000000987s");