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 WriteOptions options = {};
18};
19
20struct RepeatedToJsonFailureTestParam {
21 RepeatedMessageData input = {};
22 WriteErrorCode expected_errc = {};
23 std::string expected_path = {};
24 WriteOptions 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"({"field1":[],"field2":[],"field3":[]})",
38 {.always_print_fields_with_no_presence = true}
39 },
40 RepeatedToJsonSuccessTestParam{RepeatedMessageData{.field1 = {1, 2, 3}}, R"({"field1":[1,2,3]})"},
41 RepeatedToJsonSuccessTestParam{
42 RepeatedMessageData{.field2 = {{true}, {false}, {true}, {true}}},
43 R"({"field2":[{"field1":true},{},{"field1":true},{"field1":true}]})"
44 },
45 RepeatedToJsonSuccessTestParam{
46 RepeatedMessageData{.field3 = {{.seconds = 123, .nanos = 987000000}}},
47 R"({"field3":["123.987s"]})"
48 },
49 RepeatedToJsonSuccessTestParam{
50 RepeatedMessageData{.field1 = {0}, .field2 = {{false}}, .field3 = {{.seconds = 0, .nanos = 0}}},
51 R"({"field1":[0],"field2":[{}],"field3":["0s"]})"
52 }
53 )
54);
55
56INSTANTIATE_TEST_SUITE_P(
57 ,
58 RepeatedToJsonFailureTest,
59 ::testing::Values(RepeatedToJsonFailureTestParam{
60 RepeatedMessageData{
61 .field3 = {{.seconds = 1, .nanos = 1}, {.seconds = 1, .nanos = -1}, {.seconds = 0, .nanos = 1}}
62 },
63 WriteErrorCode::kInvalidValue,
64 "field3[1]"
65 })
66);
67
68TEST_P(RepeatedToJsonSuccessTest, Test) {
69 const auto& param = GetParam();
70
71 auto input = PrepareTestData(param.input);
72 formats::json::Value json, expected_json, sample_json;
73
74 UASSERT_NO_THROW((json = MessageToJson(input, param.options)));
75 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
76 UASSERT_NO_THROW((sample_json = CreateSampleJson(input, param.options)));
77
78 EXPECT_EQ(json, expected_json);
79 EXPECT_EQ(expected_json, sample_json);
80}
81
82TEST_P(RepeatedToJsonFailureTest, Test) {
83 const auto& param = GetParam();
84 auto input = PrepareTestData(param.input);
85
86 EXPECT_WRITE_ERROR((void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
87 UEXPECT_THROW((void)CreateSampleJson(input, param.options), SampleError);
88}
89
90} // namespace protobuf::json::tests
91
92USERVER_NAMESPACE_END