1#include <gtest/gtest.h>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
18constexpr std::int64_t kMax = std::numeric_limits<std::int64_t>::max();
19constexpr std::int64_t kMin = std::numeric_limits<std::int64_t>::min();
21struct Int64FromJsonSuccessTestParam {
22 std::string input = {};
24 ReadOptions options = {};
28 bool skip_native_parsing_for_older_versions =
false;
31struct Int64FromJsonFailureTestParam {
32 std::string input = {};
33 ReadErrorCode expected_errc = {};
34 std::string expected_path = {};
35 ReadOptions options = {};
38void PrintTo(
const Int64FromJsonSuccessTestParam& param, std::ostream* os) {
39 *os << fmt::format(
"{{ input = '{}' }}", param.input);
42void PrintTo(
const Int64FromJsonFailureTestParam& param, std::ostream* os) {
43 *os << fmt::format(
"{{ input = '{}' }}", param.input);
46class Int64FromJsonSuccessTest :
public ::testing::TestWithParam<Int64FromJsonSuccessTestParam> {};
47class Int64FromJsonFailureTest :
public ::testing::TestWithParam<Int64FromJsonFailureTestParam> {};
49INSTANTIATE_TEST_SUITE_P(
51 Int64FromJsonSuccessTest,
53 Int64FromJsonSuccessTestParam{R"({})", Int64MessageData{0, 0, 0}},
54 Int64FromJsonSuccessTestParam{R"({"field1":0,"field2":null,"field3":"0"})", Int64MessageData{0, 0, 0}},
55 Int64FromJsonSuccessTestParam{R"({"field1":1,"field2":-2,"field3":3})", Int64MessageData{1, -2, 3}},
56 Int64FromJsonSuccessTestParam{R"({"field1":"1","field2":"-2","field3":"3"})", Int64MessageData{1, -2, 3}},
57 Int64FromJsonSuccessTestParam{
58 R"({"field1":9223372036854775807,"field2":"9223372036854775807","field3":-9223372036854775808})",
59 Int64MessageData{kMax, kMax, kMin}
61 Int64FromJsonSuccessTestParam{
62 R"({"field1":-9223372036854775808,"field2":"-9223372036854775808","field3":9223372036854775807})",
63 Int64MessageData{kMin, kMin, kMax}
65 Int64FromJsonSuccessTestParam{
66 R"({"field1":10e2,"field2":-5e3,"field3":3e0})",
67 Int64MessageData{1000, -5000, 3}
69 Int64FromJsonSuccessTestParam{
70 R"({"field1":"10e2","field2":"-5e3","field3":"3e0"})",
71 Int64MessageData{1000, -5000, 3},
75 Int64FromJsonSuccessTestParam{
76 R"({"field1":8500E-2,"field2":-1.8E+2,"field3":6.0E0})",
77 Int64MessageData{85, -180, 6}
79 Int64FromJsonSuccessTestParam{
80 R"({"field1":"8500E-2","field2":"-1.8E+2","field3":"6.0E0"})",
81 Int64MessageData{85, -180, 6},
88INSTANTIATE_TEST_SUITE_P(
90 Int64FromJsonFailureTest,
92 Int64FromJsonFailureTestParam{R"({"field1":[],"field2":1,"field3":1})", ReadErrorCode::kInvalidType,
"field1"},
93 Int64FromJsonFailureTestParam{R"({"field1":1,"field2":{},"field3":1})", ReadErrorCode::kInvalidType,
"field2"},
94 Int64FromJsonFailureTestParam{
95 R"({"field1":1,"field2":1,"field3":true})",
96 ReadErrorCode::kInvalidType,
99 Int64FromJsonFailureTestParam{
100 R"({"field1":9223372036854775808,"field2":1,"field3":1})",
101 ReadErrorCode::kInvalidValue,
104 Int64FromJsonFailureTestParam{
105 R"({"field1":1,"field2":-9223372036854775809,"field3":1})",
106 ReadErrorCode::kInvalidValue,
109 Int64FromJsonFailureTestParam{
110 R"({"field1":1,"field2":1,"field3":"9223372036854775808"})",
111 ReadErrorCode::kInvalidValue,
114 Int64FromJsonFailureTestParam{
115 R"({"field1":"-9223372036854775809","field2":1,"field3":1})",
116 ReadErrorCode::kInvalidValue,
119 Int64FromJsonFailureTestParam{
120 R"({"field1":1,"field2":1e50,"field3":1})",
121 ReadErrorCode::kInvalidValue,
124 Int64FromJsonFailureTestParam{
125 R"({"field1":1,"field2":1,"field3":-1e50})",
126 ReadErrorCode::kInvalidValue,
129 Int64FromJsonFailureTestParam{
130 R"({"field1":" 123","field2":1,"field3":1})",
131 ReadErrorCode::kInvalidValue,
134 Int64FromJsonFailureTestParam{
135 R"({"field1":1,"field2":"-123 ","field3":1})",
136 ReadErrorCode::kInvalidValue,
139 Int64FromJsonFailureTestParam{
140 R"({"field1":1,"field2":1,"field3":"1a3"})",
141 ReadErrorCode::kInvalidValue,
144 Int64FromJsonFailureTestParam{
145 R"({"field1":"1.1","field2":1,"field3":1})",
146 ReadErrorCode::kInvalidValue,
149 Int64FromJsonFailureTestParam{
150 R"({"field1":1,"field2":"1e50","field3":1})",
151 ReadErrorCode::kInvalidValue,
154 Int64FromJsonFailureTestParam{
155 R"({"field1":1,"field2":1,"field3":"-1e50"})",
156 ReadErrorCode::kInvalidValue,
162TEST_P(Int64FromJsonSuccessTest, Test) {
163 const auto& param = GetParam();
165 proto_json::messages::Int64Message message, expected_message, sample_message;
166 formats::json::Value input = PrepareJsonTestData(param.input);
167 expected_message = PrepareTestData(param.expected_message);
169 message.set_field1(100001);
170 message.set_field2(200002);
171 message.set_field3(300003);
173 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::Int64Message>(input, param.options)));
175#if GOOGLE_PROTOBUF_VERSION >= 6030000
176 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
177 CheckMessageEqual(message, sample_message);
179 if (!param.skip_native_parsing_for_older_versions) {
180 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
181 CheckMessageEqual(message, sample_message);
185 CheckMessageEqual(message, expected_message);
188TEST_P(Int64FromJsonFailureTest, Test) {
189 const auto& param = GetParam();
191 proto_json::messages::Int64Message sample_message;
192 formats::json::Value input = PrepareJsonTestData(param.input);
195 (
void)JsonToMessage<proto_json::messages::Int64Message>(input, param.options),
199 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);