blob: dec9cd00d0e2df8383df97174cbee53ebaedc894 [file] [log] [blame]
#include "helpers.hpp"
#include "utils/labeled_tuple.hpp"
#include <limits>
#include <gmock/gmock.h>
using namespace testing;
struct TestingLabelDouble
{
static std::string str()
{
return "DoubleValue";
}
};
struct TestingLabelString
{
static std::string str()
{
return "StringValue";
}
};
using LabeledTestingTuple =
utils::LabeledTuple<std::tuple<double, std::string>, TestingLabelDouble,
TestingLabelString>;
class TestLabeledTupleDoubleSpecialization :
public Test,
public WithParamInterface<
std::tuple<double, std::variant<double, std::string>>>
{
public:
const std::string string_value = "Some value";
};
TEST_P(TestLabeledTupleDoubleSpecialization,
serializeAndDeserializeMakesSameTuple)
{
auto [double_value, expected_serialized_value] = GetParam();
LabeledTestingTuple initial(double_value, string_value);
nlohmann::json serialized(initial);
EXPECT_EQ(serialized["StringValue"], string_value);
auto& actual_serialized_value = serialized["DoubleValue"];
if (std::holds_alternative<std::string>(expected_serialized_value))
{
EXPECT_TRUE(actual_serialized_value.is_string());
EXPECT_EQ(actual_serialized_value.get<std::string>(),
std::get<std::string>(expected_serialized_value));
}
else
{
EXPECT_TRUE(actual_serialized_value.is_number());
EXPECT_EQ(actual_serialized_value.get<double>(),
std::get<double>(expected_serialized_value));
}
LabeledTestingTuple deserialized = serialized.get<LabeledTestingTuple>();
EXPECT_EQ(initial, deserialized);
}
INSTANTIATE_TEST_SUITE_P(
_, TestLabeledTupleDoubleSpecialization,
Values(std::make_tuple(10.0, std::variant<double, std::string>(10.0)),
std::make_tuple(std::numeric_limits<double>::infinity(),
std::variant<double, std::string>("inf")),
std::make_tuple(-std::numeric_limits<double>::infinity(),
std::variant<double, std::string>("-inf")),
std::make_tuple(std::numeric_limits<double>::quiet_NaN(),
std::variant<double, std::string>("NaN"))));
TEST(TestLabeledTupleDoubleSpecializationNegative,
ThrowsWhenUnknownLiteralDuringDeserialization)
{
nlohmann::json data = nlohmann::json{{"DoubleValue", "FooBar"},
{"StringValue", "Some Text Val"}};
EXPECT_THROW(data.get<LabeledTestingTuple>(), std::invalid_argument);
}