blob: dec9cd00d0e2df8383df97174cbee53ebaedc894 [file] [log] [blame]
Szymon Dompke0253f6d2022-09-15 23:18:19 +02001#include "helpers.hpp"
2#include "utils/labeled_tuple.hpp"
3
Szymon Dompke0253f6d2022-09-15 23:18:19 +02004#include <limits>
5
6#include <gmock/gmock.h>
7
8using namespace testing;
9
10struct TestingLabelDouble
11{
12 static std::string str()
13 {
14 return "DoubleValue";
15 }
16};
17
18struct TestingLabelString
19{
20 static std::string str()
21 {
22 return "StringValue";
23 }
24};
25
26using LabeledTestingTuple =
27 utils::LabeledTuple<std::tuple<double, std::string>, TestingLabelDouble,
28 TestingLabelString>;
29
30class 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
39TEST_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
66INSTANTIATE_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
76TEST(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}