mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-28 16:58:51 +00:00
144 lines
4.2 KiB
C++
144 lines
4.2 KiB
C++
|
#include <memory>
|
||
|
#include <optional>
|
||
|
|
||
|
#include "../test_helpers.hxx"
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
enum colour
|
||
|
{
|
||
|
red,
|
||
|
green,
|
||
|
blue
|
||
|
};
|
||
|
enum class weather : short
|
||
|
{
|
||
|
hot,
|
||
|
cold,
|
||
|
wet
|
||
|
};
|
||
|
enum class many : unsigned long long
|
||
|
{
|
||
|
bottom = 0,
|
||
|
top = std::numeric_limits<unsigned long long>::max(),
|
||
|
};
|
||
|
} // namespace
|
||
|
|
||
|
namespace pqxx
|
||
|
{
|
||
|
PQXX_DECLARE_ENUM_CONVERSION(colour);
|
||
|
PQXX_DECLARE_ENUM_CONVERSION(weather);
|
||
|
PQXX_DECLARE_ENUM_CONVERSION(many);
|
||
|
} // namespace pqxx
|
||
|
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
void test_strconv_bool()
|
||
|
{
|
||
|
PQXX_CHECK_EQUAL(pqxx::to_string(false), "false", "Wrong to_string(false).");
|
||
|
PQXX_CHECK_EQUAL(pqxx::to_string(true), "true", "Wrong to_string(true).");
|
||
|
|
||
|
bool result;
|
||
|
pqxx::from_string("false", result);
|
||
|
PQXX_CHECK_EQUAL(result, false, "Wrong from_string('false').");
|
||
|
pqxx::from_string("FALSE", result);
|
||
|
PQXX_CHECK_EQUAL(result, false, "Wrong from_string('FALSE').");
|
||
|
pqxx::from_string("f", result);
|
||
|
PQXX_CHECK_EQUAL(result, false, "Wrong from_string('f').");
|
||
|
pqxx::from_string("F", result);
|
||
|
PQXX_CHECK_EQUAL(result, false, "Wrong from_string('F').");
|
||
|
pqxx::from_string("0", result);
|
||
|
PQXX_CHECK_EQUAL(result, false, "Wrong from_string('0').");
|
||
|
pqxx::from_string("true", result);
|
||
|
PQXX_CHECK_EQUAL(result, true, "Wrong from_string('true').");
|
||
|
pqxx::from_string("TRUE", result);
|
||
|
PQXX_CHECK_EQUAL(result, true, "Wrong from_string('TRUE').");
|
||
|
pqxx::from_string("t", result);
|
||
|
PQXX_CHECK_EQUAL(result, true, "Wrong from_string('t').");
|
||
|
pqxx::from_string("T", result);
|
||
|
PQXX_CHECK_EQUAL(result, true, "Wrong from_string('T').");
|
||
|
pqxx::from_string("1", result);
|
||
|
PQXX_CHECK_EQUAL(result, true, "Wrong from_string('1').");
|
||
|
}
|
||
|
|
||
|
|
||
|
void test_strconv_enum()
|
||
|
{
|
||
|
PQXX_CHECK_EQUAL(pqxx::to_string(red), "0", "Enum value did not convert.");
|
||
|
PQXX_CHECK_EQUAL(pqxx::to_string(green), "1", "Enum value did not convert.");
|
||
|
PQXX_CHECK_EQUAL(pqxx::to_string(blue), "2", "Enum value did not convert.");
|
||
|
|
||
|
colour col;
|
||
|
pqxx::from_string("2", col);
|
||
|
PQXX_CHECK_EQUAL(col, blue, "Could not recover enum value from string.");
|
||
|
}
|
||
|
|
||
|
|
||
|
void test_strconv_class_enum()
|
||
|
{
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(weather::hot), "0", "Class enum value did not convert.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(weather::wet), "2", "Enum value did not convert.");
|
||
|
|
||
|
weather w;
|
||
|
pqxx::from_string("2", w);
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
w, weather::wet, "Could not recover class enum value from string.");
|
||
|
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(many::bottom), "0",
|
||
|
"Small wide enum did not convert right.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(many::top),
|
||
|
pqxx::to_string(std::numeric_limits<unsigned long long>::max()),
|
||
|
"Large wide enum did not convert right.");
|
||
|
}
|
||
|
|
||
|
|
||
|
void test_strconv_optional()
|
||
|
{
|
||
|
PQXX_CHECK_THROWS(
|
||
|
pqxx::to_string(std::optional<int>{}), pqxx::conversion_error,
|
||
|
"Converting an empty optional did not throw conversion error.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(std::optional<int>{std::in_place, 10}), "10",
|
||
|
"std::optional<int> does not convert right.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(std::optional<int>{std::in_place, -10000}), "-10000",
|
||
|
"std::optional<int> does not convert right.");
|
||
|
}
|
||
|
|
||
|
|
||
|
void test_strconv_smart_pointer()
|
||
|
{
|
||
|
PQXX_CHECK_THROWS(
|
||
|
pqxx::to_string(std::unique_ptr<int>{}), pqxx::conversion_error,
|
||
|
"Converting an empty unique_ptr did not throw conversion error.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(std::make_unique<int>(10)), "10",
|
||
|
"std::unique_ptr<int> does not convert right.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(std::make_unique<int>(-10000)), "-10000",
|
||
|
"std::unique_ptr<int> does not convert right.");
|
||
|
|
||
|
PQXX_CHECK_THROWS(
|
||
|
pqxx::to_string(std::shared_ptr<int>{}), pqxx::conversion_error,
|
||
|
"Converting an empty shared_ptr did not throw conversion error.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(std::make_shared<int>(10)), "10",
|
||
|
"std::shared_ptr<int> does not convert right.");
|
||
|
PQXX_CHECK_EQUAL(
|
||
|
pqxx::to_string(std::make_shared<int>(-10000)), "-10000",
|
||
|
"std::shared_ptr<int> does not convert right.");
|
||
|
}
|
||
|
|
||
|
|
||
|
PQXX_REGISTER_TEST(test_strconv_bool);
|
||
|
PQXX_REGISTER_TEST(test_strconv_enum);
|
||
|
PQXX_REGISTER_TEST(test_strconv_class_enum);
|
||
|
PQXX_REGISTER_TEST(test_strconv_optional);
|
||
|
PQXX_REGISTER_TEST(test_strconv_smart_pointer);
|
||
|
} // namespace
|