1#include <gtest/gtest.h>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
16namespace protobuf::json::tests {
18constexpr float kMax = std::numeric_limits<
float>::max();
19constexpr float kMin = std::numeric_limits<
float>::min();
21struct FloatFromJsonSuccessTestParam {
22 std::string input = {};
24 ParseOptions options = {};
27struct FloatFromJsonFailureTestParam {
28 std::string input = {};
29 ParseErrorCode expected_errc = {};
30 std::string expected_path = {};
31 ParseOptions 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,
56 FloatFromJsonSuccessTestParam{R"({"field1":"-0.0e0"})",
FloatMessageData{0}},
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":[]})", ParseErrorCode::kInvalidType,
"field1"},
83 FloatFromJsonFailureTestParam{R"({"field1":{}})", ParseErrorCode::kInvalidType,
"field1"},
84 FloatFromJsonFailureTestParam{R"({"field1":true})", ParseErrorCode::kInvalidType,
"field1"},
85 FloatFromJsonFailureTestParam{R"({"field1":3.403e+38})", ParseErrorCode::kInvalidValue,
"field1"},
86 FloatFromJsonFailureTestParam{R"({"field1":"3.403e+38"})", ParseErrorCode::kInvalidValue,
"field1"},
87 FloatFromJsonFailureTestParam{R"({"field1":-3.403e+38})", ParseErrorCode::kInvalidValue,
"field1"},
88 FloatFromJsonFailureTestParam{R"({"field1":"-3.403e+38"})", ParseErrorCode::kInvalidValue,
"field1"},
89 FloatFromJsonFailureTestParam{R"({"field1":" 123"})", ParseErrorCode::kInvalidValue,
"field1", {},
true},
90 FloatFromJsonFailureTestParam{R"({"field1":"123 "})", ParseErrorCode::kInvalidValue,
"field1", {},
true},
91 FloatFromJsonFailureTestParam{R"({"field1":"1a3"})", ParseErrorCode::kInvalidValue,
"field1"}
95TEST_P(FloatFromJsonSuccessTest, Test) {
96 const auto& param = GetParam();
98 proto_json::messages::FloatMessage message, expected_message, sample_message;
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, sample_message, param.options));
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;
118 (
void)JsonToMessage<proto_json::messages::FloatMessage>(input, param.options),
123 if (!param.skip_native_check) {
124 UEXPECT_THROW(InitSampleMessage(param.input, sample_message, param.options), SampleError);