userver: /data/code/userver/libraries/protobuf/tests/json/float_from_json_test.cpp Source File
Loading...
Searching...
No Matches
float_from_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <limits>
4#include <ostream>
5#include <string>
6
7#include <fmt/format.h>
8
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
11
12#include "utils.hpp"
13
14USERVER_NAMESPACE_BEGIN
15
16namespace protobuf::json::tests {
17
18constexpr float kMax = std::numeric_limits<float>::max();
19constexpr float kMin = std::numeric_limits<float>::min();
20
21struct FloatFromJsonSuccessTestParam {
22 std::string input = {};
23 FloatMessageData expected_message = {};
24 ReadOptions options = {};
25};
26
27struct FloatFromJsonFailureTestParam {
28 std::string input = {};
29 ReadErrorCode expected_errc = {};
30 std::string expected_path = {};
31 ReadOptions options = {};
32
33 // Native implementation does not emit error on some expected cases which we want to detect.
34 // This variable turns off checks for native implementation.
35 bool skip_native_check = false;
36};
37
38void PrintTo(const FloatFromJsonSuccessTestParam& param, std::ostream* os) {
39 *os << fmt::format("{{ input = '{}' }}", param.input);
40}
41
42void PrintTo(const FloatFromJsonFailureTestParam& param, std::ostream* os) {
43 *os << fmt::format("{{ input = '{}' }}", param.input);
44}
45
46class FloatFromJsonSuccessTest : public ::testing::TestWithParam<FloatFromJsonSuccessTestParam> {};
47class FloatFromJsonFailureTest : public ::testing::TestWithParam<FloatFromJsonFailureTestParam> {};
48
49INSTANTIATE_TEST_SUITE_P(
50 ,
51 FloatFromJsonSuccessTest,
52 ::testing::Values(
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}}
75 )
76);
77
78INSTANTIATE_TEST_SUITE_P(
79 ,
80 FloatFromJsonFailureTest,
81 ::testing::Values(
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"}
92 )
93);
94
95TEST_P(FloatFromJsonSuccessTest, Test) {
96 const auto& param = GetParam();
97
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);
101
102 message.set_field1(100.001);
103
104 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::FloatMessage>(input, param.options)));
105 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
106
107 CheckMessageEqual(message, sample_message);
108 CheckMessageEqual(message, expected_message);
109}
110
111TEST_P(FloatFromJsonFailureTest, Test) {
112 const auto& param = GetParam();
113
114 proto_json::messages::FloatMessage sample_message;
115 formats::json::Value input = PrepareJsonTestData(param.input);
116
117 EXPECT_READ_ERROR(
118 (void)JsonToMessage<proto_json::messages::FloatMessage>(input, param.options),
119 param.expected_errc,
120 param.expected_path
121 );
122
123 if (!param.skip_native_check) {
124 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);
125 }
126}
127
128} // namespace protobuf::json::tests
129
130USERVER_NAMESPACE_END