#include #include #include #include "json-utils.hh" namespace nix { /* Test `to_json` and `from_json` with `std::optional` types. * We are specifically interested in whether we can _nest_ optionals in STL * containers so we that we can leverage existing adl_serializer templates. */ TEST(to_json, optionalInt) { std::optional val = std::make_optional(420); ASSERT_EQ(nlohmann::json(val), nlohmann::json(420)); val = std::nullopt; ASSERT_EQ(nlohmann::json(val), nlohmann::json(nullptr)); } TEST(to_json, vectorOfOptionalInts) { std::vector> vals = { std::make_optional(420), std::nullopt, }; ASSERT_EQ(nlohmann::json(vals), nlohmann::json::parse("[420,null]")); } TEST(to_json, optionalVectorOfInts) { std::optional> val = std::make_optional(std::vector { -420, 420, }); ASSERT_EQ(nlohmann::json(val), nlohmann::json::parse("[-420,420]")); val = std::nullopt; ASSERT_EQ(nlohmann::json(val), nlohmann::json(nullptr)); } TEST(from_json, optionalInt) { nlohmann::json json = 420; std::optional val = json; ASSERT_TRUE(val.has_value()); ASSERT_EQ(*val, 420); json = nullptr; json.get_to(val); ASSERT_FALSE(val.has_value()); } TEST(from_json, vectorOfOptionalInts) { nlohmann::json json = { 420, nullptr }; std::vector> vals = json; ASSERT_EQ(vals.size(), 2); ASSERT_TRUE(vals.at(0).has_value()); ASSERT_EQ(*vals.at(0), 420); ASSERT_FALSE(vals.at(1).has_value()); } } /* namespace nix */