userver: /data/code/userver/libraries/protobuf/tests/json/double_from_json_test.cpp Source File
Loading...
Searching...
No Matches
double_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 double kMax = std::numeric_limits<double>::max();
19constexpr double kMin = std::numeric_limits<double>::min();
20
21struct DoubleFromJsonSuccessTestParam {
22 std::string input = {};
23 DoubleMessageData expected_message = {};
24 ReadOptions options = {};
25};
26
27struct DoubleFromJsonFailureTestParam {
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 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 DoubleFromJsonSuccessTestParam& param, std::ostream* os) {
39 *os << fmt::format("{{ input = '{}' }}", param.input);
40}
41
42void PrintTo(const DoubleFromJsonFailureTestParam& param, std::ostream* os) {
43 *os << fmt::format("{{ input = '{}' }}", param.input);
44}
45
46class DoubleFromJsonSuccessTest : public ::testing::TestWithParam<DoubleFromJsonSuccessTestParam> {};
47class DoubleFromJsonFailureTest : public ::testing::TestWithParam<DoubleFromJsonFailureTestParam> {};
48
49INSTANTIATE_TEST_SUITE_P(
50 ,
51 DoubleFromJsonSuccessTest,
52 ::testing::Values(
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}}
75 )
76);
77
78INSTANTIATE_TEST_SUITE_P(
79 ,
80 DoubleFromJsonFailureTest,
81 ::testing::Values(
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"}
88 )
89);
90
91TEST_P(DoubleFromJsonSuccessTest, Test) {
92 const auto& param = GetParam();
93
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);
97
98 message.set_field1(100.001);
99
100 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::DoubleMessage>(input, param.options)));
101 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
102
103 CheckMessageEqual(message, sample_message);
104 CheckMessageEqual(message, expected_message);
105}
106
107TEST_P(DoubleFromJsonFailureTest, Test) {
108 const auto& param = GetParam();
109
110 proto_json::messages::DoubleMessage sample_message;
111 formats::json::Value input = PrepareJsonTestData(param.input);
112
113 EXPECT_READ_ERROR(
114 (void)JsonToMessage<proto_json::messages::DoubleMessage>(input, param.options),
115 param.expected_errc,
116 param.expected_path
117 );
118
119 if (!param.skip_native_check) {
120 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);
121 }
122}
123
124} // namespace protobuf::json::tests
125
126USERVER_NAMESPACE_END