1#include <gtest/gtest.h>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
18constexpr double kMax = std::numeric_limits<
double>::max();
19constexpr double kMin = std::numeric_limits<
double>::min();
21struct DoubleFromJsonSuccessTestParam {
22 std::string input = {};
24 ReadOptions options = {};
27struct DoubleFromJsonFailureTestParam {
28 std::string input = {};
29 ReadErrorCode expected_errc = {};
30 std::string expected_path = {};
31 ReadOptions options = {};
35 bool skip_native_check =
false;
38void PrintTo(
const DoubleFromJsonSuccessTestParam& param, std::ostream* os) {
39 *os << fmt::format(
"{{ input = '{}' }}", param.input);
42void PrintTo(
const DoubleFromJsonFailureTestParam& param, std::ostream* os) {
43 *os << fmt::format(
"{{ input = '{}' }}", param.input);
46class DoubleFromJsonSuccessTest :
public ::testing::TestWithParam<DoubleFromJsonSuccessTestParam> {};
47class DoubleFromJsonFailureTest :
public ::testing::TestWithParam<DoubleFromJsonFailureTestParam> {};
49INSTANTIATE_TEST_SUITE_P(
51 DoubleFromJsonSuccessTest,
53 DoubleFromJsonSuccessTestParam{R"({})", DoubleMessageData{0}},
54 DoubleFromJsonSuccessTestParam{R"({"field1":null})", DoubleMessageData{0}},
55 DoubleFromJsonSuccessTestParam{R"({"field1":-0.0e0})", DoubleMessageData{0}},
56 DoubleFromJsonSuccessTestParam{R"({"field1":"-0.0e0"})", DoubleMessageData{0}},
57 DoubleFromJsonSuccessTestParam{R"({"field1":123})", DoubleMessageData{123}},
58 DoubleFromJsonSuccessTestParam{R"({"field1":"-123"})", DoubleMessageData{-123}},
59 DoubleFromJsonSuccessTestParam{R"({"field1":100.123567})", DoubleMessageData{100.123567}},
60 DoubleFromJsonSuccessTestParam{R"({"field1":"100.123567"})", DoubleMessageData{100.123567}},
61 DoubleFromJsonSuccessTestParam{R"({"field1":-100.123567})", DoubleMessageData{-100.123567}},
62 DoubleFromJsonSuccessTestParam{R"({"field1":"-100.123567"})", DoubleMessageData{-100.123567}},
63 DoubleFromJsonSuccessTestParam{R"({"field1":100.123e-2})", DoubleMessageData{1.00123}},
64 DoubleFromJsonSuccessTestParam{R"({"field1":"-100.123567E2"})", DoubleMessageData{-10012.3567}},
65 DoubleFromJsonSuccessTestParam{R"({"field1":100.123e-2})", DoubleMessageData{1.00123}},
66 DoubleFromJsonSuccessTestParam{R"({"field1":"-100.123567E2"})", DoubleMessageData{-10012.3567}},
67 DoubleFromJsonSuccessTestParam{R"({"field1":1.7976931348623157e+308})", DoubleMessageData{kMax}},
68 DoubleFromJsonSuccessTestParam{R"({"field1":"1.7976931348623157E308"})", DoubleMessageData{kMax}},
69 DoubleFromJsonSuccessTestParam{R"({"field1":-1.7976931348623157E+308})", DoubleMessageData{-kMax}},
70 DoubleFromJsonSuccessTestParam{R"({"field1":"-1.7976931348623157e308"})", DoubleMessageData{-kMax}},
71 DoubleFromJsonSuccessTestParam{R"({"field1":2.2250738585072014e-308})", DoubleMessageData{kMin}},
72 DoubleFromJsonSuccessTestParam{R"({"field1":"2.2250738585072014E-308"})", DoubleMessageData{kMin}},
73 DoubleFromJsonSuccessTestParam{R"({"field1":-2.2250738585072014E-308})", DoubleMessageData{-kMin}},
74 DoubleFromJsonSuccessTestParam{R"({"field1":"-2.2250738585072014e-308"})", DoubleMessageData{-kMin}}
78INSTANTIATE_TEST_SUITE_P(
80 DoubleFromJsonFailureTest,
82 DoubleFromJsonFailureTestParam{R"({"field1":[]})", ReadErrorCode::kInvalidType,
"field1"},
83 DoubleFromJsonFailureTestParam{R"({"field1":{}})", ReadErrorCode::kInvalidType,
"field1"},
84 DoubleFromJsonFailureTestParam{R"({"field1":true})", ReadErrorCode::kInvalidType,
"field1"},
85 DoubleFromJsonFailureTestParam{R"({"field1":" 123"})", ReadErrorCode::kInvalidValue,
"field1", {},
true},
86 DoubleFromJsonFailureTestParam{R"({"field1":"123 "})", ReadErrorCode::kInvalidValue,
"field1", {},
true},
87 DoubleFromJsonFailureTestParam{R"({"field1":"1a3"})", ReadErrorCode::kInvalidValue,
"field1"}
91TEST_P(DoubleFromJsonSuccessTest, Test) {
92 const auto& param = GetParam();
94 proto_json::messages::DoubleMessage message, expected_message, sample_message;
95 formats::json::Value input = PrepareJsonTestData(param.input);
96 expected_message = PrepareTestData(param.expected_message);
98 message.set_field1(100.001);
100 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::DoubleMessage>(input, param.options)));
101 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
103 CheckMessageEqual(message, sample_message);
104 CheckMessageEqual(message, expected_message);
107TEST_P(DoubleFromJsonFailureTest, Test) {
108 const auto& param = GetParam();
110 proto_json::messages::DoubleMessage sample_message;
111 formats::json::Value input = PrepareJsonTestData(param.input);
114 (
void)JsonToMessage<proto_json::messages::DoubleMessage>(input, param.options),
119 if (!param.skip_native_check) {
120 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);