#define BOOST_TEST_MODULE test_enumDetails #include "enumDetailsData.h" #include "testHelpers.h" #include #include #include #include constexpr std::array INVALID_NAMES {"", "missing", "GlobalScoped::Aa", "GlobalScoped", "ns::Aa", "A", "Bb"}; constexpr std::array VALID_NAMES {"Aa", "B", "C"}; template constexpr std::array VALID_VALUES {E::Aa, E::B, E::C}; // Not a template, else Boost test framework throws printing the context constexpr std::array INVALID_VALUES {-1, 3, 20}; #define TESTS_FOR_TYPE(TYPE) \ BOOST_DATA_TEST_CASE(invalid_check_##TYPE, INVALID_VALUES, input) \ { \ BOOST_CHECK(!EnumDetails::isValid(static_cast(input))); \ } \ BOOST_DATA_TEST_CASE(invalid_parse_##TYPE, INVALID_NAMES, input) \ { \ BOOST_CHECK(!EnumDetails::parse(input).has_value()); \ } \ BOOST_DATA_TEST_CASE(invalid_to_string_##TYPE, INVALID_VALUES, input) \ { \ BOOST_CHECK(!EnumDetails::toString(static_cast(input)).has_value()); \ } \ BOOST_DATA_TEST_CASE(valid_check_##TYPE, VALID_VALUES, input) \ { \ BOOST_CHECK(EnumDetails::isValid(input)); \ } \ BOOST_DATA_TEST_CASE(valid_parse_##TYPE, VALID_NAMES ^ VALID_VALUES, input, output) \ { \ const auto parsed = EnumDetails::parse(input); \ BOOST_CHECK_IF(parsedOK, parsed.has_value()) { \ BOOST_CHECK_EQUAL(parsed.value(), output); \ } \ } \ BOOST_DATA_TEST_CASE(valid_to_string_##TYPE, VALID_VALUES ^ VALID_NAMES, input, output) \ { \ const auto parsed = EnumDetails::toString(input); \ BOOST_CHECK_IF(parsedOK, parsed.has_value()) { \ BOOST_CHECK_EQUAL(parsed.value(), output); \ } \ } TESTS_FOR_TYPE(GlobalScoped) TESTS_FOR_TYPE(GlobalUnscoped) using NsUnscoped = ns::Unscoped; using NsScoped = ns::Scoped; TESTS_FOR_TYPE(NsUnscoped) TESTS_FOR_TYPE(NsScoped)