1#include <gtest/gtest.h>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
18constexpr float kMax = std::numeric_limits<
float>::max();
19constexpr float kMin = std::numeric_limits<
float>::min();
21struct FloatFromJsonSuccessTestParam {
22 std::string input = {};
24 ReadOptions options = {};
27struct FloatFromJsonFailureTestParam {
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 FloatFromJsonSuccessTestParam& param, std::ostream* os) {
39 *os << fmt::format(
"{{ input = '{}' }}", param.input);
42void PrintTo(
const FloatFromJsonFailureTestParam& param, std::ostream* os) {
43 *os << fmt::format(
"{{ input = '{}' }}", param.input);
46class FloatFromJsonSuccessTest :
public ::testing::TestWithParam<FloatFromJsonSuccessTestParam> {};
47class FloatFromJsonFailureTest :
public ::testing::TestWithParam<FloatFromJsonFailureTestParam> {};
49INSTANTIATE_TEST_SUITE_P(
51 FloatFromJsonSuccessTest,
53 FloatFromJsonSuccessTestParam{R"({})", FloatMessageData{0}},
54 FloatFromJsonSuccessTestParam{R"({"field1":null})", FloatMessageData{0}},
55 FloatFromJsonSuccessTestParam{R"({"field1":-0.0e0})", FloatMessageData{0}},
56 FloatFromJsonSuccessTestParam{R"({"field1":"-0.0e0"})", FloatMessageData{0}},
57 FloatFromJsonSuccessTestParam{R"({"field1":123})", FloatMessageData{123}},
58 FloatFromJsonSuccessTestParam{R"({"field1":"-123"})", FloatMessageData{-123}},
59 FloatFromJsonSuccessTestParam{R"({"field1":100.123567})", FloatMessageData{100.123567}},
60 FloatFromJsonSuccessTestParam{R"({"field1":"100.123567"})", FloatMessageData{100.123567}},
61 FloatFromJsonSuccessTestParam{R"({"field1":-100.123567})", FloatMessageData{-100.123567}},
62 FloatFromJsonSuccessTestParam{R"({"field1":"-100.123567"})", FloatMessageData{-100.123567}},
63 FloatFromJsonSuccessTestParam{R"({"field1":100.123e-2})", FloatMessageData{1.00123}},
64 FloatFromJsonSuccessTestParam{R"({"field1":"-100.123567E2"})", FloatMessageData{-10012.3567}},
65 FloatFromJsonSuccessTestParam{R"({"field1":100.123e-2})", FloatMessageData{1.00123}},
66 FloatFromJsonSuccessTestParam{R"({"field1":"-100.123567E2"})", FloatMessageData{-10012.3567}},
67 FloatFromJsonSuccessTestParam{R"({"field1":3.40282347e+38})", FloatMessageData{kMax}},
68 FloatFromJsonSuccessTestParam{R"({"field1":"3.40282347E38"})", FloatMessageData{kMax}},
69 FloatFromJsonSuccessTestParam{R"({"field1":-3.40282347E+38})", FloatMessageData{-kMax}},
70 FloatFromJsonSuccessTestParam{R"({"field1":"-3.40282347e38"})", FloatMessageData{-kMax}},
71 FloatFromJsonSuccessTestParam{R"({"field1":1.17549435e-38})", FloatMessageData{kMin}},
72 FloatFromJsonSuccessTestParam{R"({"field1":"1.17549435E-38"})", FloatMessageData{kMin}},
73 FloatFromJsonSuccessTestParam{R"({"field1":-1.17549435E-38})", FloatMessageData{-kMin}},
74 FloatFromJsonSuccessTestParam{R"({"field1":"-1.17549435e-38"})", FloatMessageData{-kMin}}
78INSTANTIATE_TEST_SUITE_P(
80 FloatFromJsonFailureTest,
82 FloatFromJsonFailureTestParam{R"({"field1":[]})", ReadErrorCode::kInvalidType,
"field1"},
83 FloatFromJsonFailureTestParam{R"({"field1":{}})", ReadErrorCode::kInvalidType,
"field1"},
84 FloatFromJsonFailureTestParam{R"({"field1":true})", ReadErrorCode::kInvalidType,
"field1"},
85 FloatFromJsonFailureTestParam{R"({"field1":3.403e+38})", ReadErrorCode::kInvalidValue,
"field1"},
86 FloatFromJsonFailureTestParam{R"({"field1":"3.403e+38"})", ReadErrorCode::kInvalidValue,
"field1"},
87 FloatFromJsonFailureTestParam{R"({"field1":-3.403e+38})", ReadErrorCode::kInvalidValue,
"field1"},
88 FloatFromJsonFailureTestParam{R"({"field1":"-3.403e+38"})", ReadErrorCode::kInvalidValue,
"field1"},
89 FloatFromJsonFailureTestParam{R"({"field1":" 123"})", ReadErrorCode::kInvalidValue,
"field1", {},
true},
90 FloatFromJsonFailureTestParam{R"({"field1":"123 "})", ReadErrorCode::kInvalidValue,
"field1", {},
true},
91 FloatFromJsonFailureTestParam{R"({"field1":"1a3"})", ReadErrorCode::kInvalidValue,
"field1"}
95TEST_P(FloatFromJsonSuccessTest, Test) {
96 const auto& param = GetParam();
98 proto_json::messages::FloatMessage message, expected_message, sample_message;
99 formats::json::Value input = PrepareJsonTestData(param.input);
100 expected_message = PrepareTestData(param.expected_message);
102 message.set_field1(100.001);
104 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::FloatMessage>(input, param.options)));
105 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
107 CheckMessageEqual(message, sample_message);
108 CheckMessageEqual(message, expected_message);
111TEST_P(FloatFromJsonFailureTest, Test) {
112 const auto& param = GetParam();
114 proto_json::messages::FloatMessage sample_message;
115 formats::json::Value input = PrepareJsonTestData(param.input);
118 (
void)JsonToMessage<proto_json::messages::FloatMessage>(input, param.options),
123 if (!param.skip_native_check) {
124 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);