userver: /data/code/userver/libraries/protobuf/tests/json/float_special_to_json_test.cpp Source File
Loading...
Searching...
No Matches
float_special_to_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <cmath>
4#include <string>
5
6#include <userver/protobuf/json/convert.hpp>
7#include <userver/utest/assert_macros.hpp>
8
9#include "utils.hpp"
10
11USERVER_NAMESPACE_BEGIN
12
13namespace protobuf::json::tests {
14
15template <typename T>
16std::string GetFloatSpecialValue(const T val) {
17 if (std::isnan(val)) {
18 return "NaN";
19 } else if (std::isinf(val)) {
20 return val > 0 ? "Infinity" : "-Infinity";
21 } else {
22 throw std::runtime_error("not a special value");
23 }
24}
25
26template <typename T>
27class FloatSpecialToJsonTest : public ::testing::Test {
28public:
29 using Param = T;
30};
31
32using FpTypes = ::testing::Types<
33 FloatQuietNan,
34 FloatSignalingNan,
35 FloatPositiveInfinity,
36 FloatNegativeInfinity,
37 DoubleQuietNan,
38 DoubleSignalingNan,
39 DoublePositiveInfinity,
40 DoubleNegativeInfinity>;
41
42TYPED_TEST_SUITE(FloatSpecialToJsonTest, FpTypes);
43
44TYPED_TEST(FloatSpecialToJsonTest, Test) {
45 using Param = typename TestFixture::Param;
46
47 if constexpr (Param::kSkip) {
48 return;
49 }
50
51 const auto& value = Param::kValue;
52 auto input = PrepareTestData(value);
53 formats::json::Value json, sample_json;
54
55 UASSERT_NO_THROW((json = MessageToJson(input)));
56 UASSERT_NO_THROW((sample_json = CreateSampleJson(input)));
57
58 EXPECT_EQ(json["field1"].As<std::string>(), GetFloatSpecialValue(value.field1));
59 EXPECT_EQ(json["field1"].As<std::string>(), sample_json["field1"].As<std::string>());
60}
61
62} // namespace protobuf::json::tests
63
64USERVER_NAMESPACE_END