1 #include "helpers.hpp"
2 #include "utils/labeled_tuple.hpp"
3
4 #include <limits>
5
6 #include <gmock/gmock.h>
7
8 using namespace testing;
9
10 struct TestingLabelDouble
11 {
strTestingLabelDouble12 static std::string str()
13 {
14 return "DoubleValue";
15 }
16 };
17
18 struct TestingLabelString
19 {
strTestingLabelString20 static std::string str()
21 {
22 return "StringValue";
23 }
24 };
25
26 using LabeledTestingTuple =
27 utils::LabeledTuple<std::tuple<double, std::string>, TestingLabelDouble,
28 TestingLabelString>;
29
30 class TestLabeledTupleDoubleSpecialization :
31 public Test,
32 public WithParamInterface<
33 std::tuple<double, std::variant<double, std::string>>>
34 {
35 public:
36 const std::string string_value = "Some value";
37 };
38
TEST_P(TestLabeledTupleDoubleSpecialization,serializeAndDeserializeMakesSameTuple)39 TEST_P(TestLabeledTupleDoubleSpecialization,
40 serializeAndDeserializeMakesSameTuple)
41 {
42 auto [double_value, expected_serialized_value] = GetParam();
43 LabeledTestingTuple initial(double_value, string_value);
44 nlohmann::json serialized(initial);
45
46 EXPECT_EQ(serialized["StringValue"], string_value);
47
48 auto& actual_serialized_value = serialized["DoubleValue"];
49 if (std::holds_alternative<std::string>(expected_serialized_value))
50 {
51 EXPECT_TRUE(actual_serialized_value.is_string());
52 EXPECT_EQ(actual_serialized_value.get<std::string>(),
53 std::get<std::string>(expected_serialized_value));
54 }
55 else
56 {
57 EXPECT_TRUE(actual_serialized_value.is_number());
58 EXPECT_EQ(actual_serialized_value.get<double>(),
59 std::get<double>(expected_serialized_value));
60 }
61
62 LabeledTestingTuple deserialized = serialized.get<LabeledTestingTuple>();
63 EXPECT_EQ(initial, deserialized);
64 }
65
66 INSTANTIATE_TEST_SUITE_P(
67 _, TestLabeledTupleDoubleSpecialization,
68 Values(std::make_tuple(10.0, std::variant<double, std::string>(10.0)),
69 std::make_tuple(std::numeric_limits<double>::infinity(),
70 std::variant<double, std::string>("inf")),
71 std::make_tuple(-std::numeric_limits<double>::infinity(),
72 std::variant<double, std::string>("-inf")),
73 std::make_tuple(std::numeric_limits<double>::quiet_NaN(),
74 std::variant<double, std::string>("NaN"))));
75
TEST(TestLabeledTupleDoubleSpecializationNegative,ThrowsWhenUnknownLiteralDuringDeserialization)76 TEST(TestLabeledTupleDoubleSpecializationNegative,
77 ThrowsWhenUnknownLiteralDuringDeserialization)
78 {
79 nlohmann::json data = nlohmann::json{{"DoubleValue", "FooBar"},
80 {"StringValue", "Some Text Val"}};
81
82 EXPECT_THROW(data.get<LabeledTestingTuple>(), std::invalid_argument);
83 }
84