/* * Copyright (C) 2019-present ScyllaDB */ /* * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0 */ #define BOOST_TEST_MODULE core #include #include #include #include #include #include #include #include "utils/enum_option.hh" namespace po = boost::program_options; namespace { struct days { enum enumeration : uint8_t { Mo, Tu, We, Th, Fr, Sa, Su }; static std::unordered_map map() { return {{"Mon", Mo}, {"Tue", Tu}, {"Wed", We}, {"Thu", Th}, {"Fri", Fr}, {"Sat", Sa}, {"Sun", Su}}; } }; template enum_option parse(const char* value) { po::options_description desc("Allowed options"); desc.add_options()("opt", po::value>(), "Option"); po::variables_map vm; const char* argv[] = {"$0", "--opt", value}; po::store(po::parse_command_line(3, argv, desc), vm); return vm["opt"].as>(); } template std::string format(typename T::enumeration d) { std::ostringstream os; os << enum_option(d); return os.str(); } } // anonymous namespace BOOST_AUTO_TEST_CASE(test_parsing) { BOOST_CHECK_EQUAL(parse("Sun"), days::Su); BOOST_CHECK_EQUAL(parse("Mon"), days::Mo); BOOST_CHECK_EQUAL(parse("Tue"), days::Tu); BOOST_CHECK_EQUAL(parse("Wed"), days::We); BOOST_CHECK_EQUAL(parse("Thu"), days::Th); BOOST_CHECK_EQUAL(parse("Fri"), days::Fr); BOOST_CHECK_EQUAL(parse("Sat"), days::Sa); } BOOST_AUTO_TEST_CASE(test_parsing_error) { BOOST_REQUIRE_THROW(parse("Sunday"), po::invalid_option_value); BOOST_REQUIRE_THROW(parse(""), po::invalid_option_value); BOOST_REQUIRE_THROW(parse(" "), po::invalid_option_value); BOOST_REQUIRE_THROW(parse(" Sun"), po::invalid_option_value); } BOOST_AUTO_TEST_CASE(test_formatting) { BOOST_CHECK_EQUAL(format(days::Mo), "Mon"); BOOST_CHECK_EQUAL(format(days::Tu), "Tue"); BOOST_CHECK_EQUAL(format(days::We), "Wed"); BOOST_CHECK_EQUAL(format(days::Th), "Thu"); BOOST_CHECK_EQUAL(format(days::Fr), "Fri"); BOOST_CHECK_EQUAL(format(days::Sa), "Sat"); BOOST_CHECK_EQUAL(format(days::Su), "Sun"); } BOOST_AUTO_TEST_CASE(test_formatting_unknown) { BOOST_CHECK_EQUAL(format(static_cast(77)), "?unknown"); } namespace { struct names { enum enumeration : uint8_t { John, Jane, Jim }; static std::map map() { return {{"John", John}, {"Jane", Jane}, {"James", Jim}}; } }; } // anonymous namespace BOOST_AUTO_TEST_CASE(test_ordered_map) { BOOST_CHECK_EQUAL(parse("James"), names::Jim); BOOST_CHECK_EQUAL(format(names::Jim), "James"); BOOST_CHECK_EQUAL(parse("John"), names::John); BOOST_CHECK_EQUAL(format(names::John), "John"); BOOST_CHECK_EQUAL(parse("Jane"), names::Jane); BOOST_CHECK_EQUAL(format(names::Jane), "Jane"); BOOST_CHECK_THROW(parse("Jimbo"), po::invalid_option_value); BOOST_CHECK_EQUAL(format(static_cast(77)), "?unknown"); } namespace { struct cities { enum enumeration { SF, TO, NY }; static std::unordered_map map() { return { {"SanFrancisco", SF}, {"SF", SF}, {"SFO", SF}, {"Frisco", SF}, {"Toronto", TO}, {"TO", TO}, {"YYZ", TO}, {"TheSix", TO}, {"NewYork", NY}, {"NY", NY}, {"NYC", NY}, {"BigApple", NY}, }; } }; } // anonymous namespace BOOST_AUTO_TEST_CASE(test_multiple_parse) { BOOST_CHECK_EQUAL(parse("SanFrancisco"), cities::SF); BOOST_CHECK_EQUAL(parse("SF"), cities::SF); BOOST_CHECK_EQUAL(parse("SFO"), cities::SF); BOOST_CHECK_EQUAL(parse("Frisco"), cities::SF); BOOST_CHECK_EQUAL(parse("Toronto"), cities::TO); BOOST_CHECK_EQUAL(parse("TO"), cities::TO); BOOST_CHECK_EQUAL(parse("YYZ"), cities::TO); BOOST_CHECK_EQUAL(parse("TheSix"), cities::TO); BOOST_CHECK_EQUAL(parse("NewYork"), cities::NY); BOOST_CHECK_EQUAL(parse("NY"), cities::NY); BOOST_CHECK_EQUAL(parse("NYC"), cities::NY); BOOST_CHECK_EQUAL(parse("BigApple"), cities::NY); } BOOST_AUTO_TEST_CASE(test_multiple_format) { BOOST_CHECK((std::set{"SanFrancisco", "SF", "SFO", "Frisco"}).contains(format(cities::SF))); BOOST_CHECK((std::set{"Toronto", "TO", "YYZ", "TheSix"}).contains(format(cities::TO))); BOOST_CHECK((std::set{"NewYork", "NY", "NYC", "BigApple"}).contains(format(cities::NY))); } namespace { struct numbers { enum enumeration : uint8_t { ONE, TWO }; static std::unordered_map map() { return {{1, ONE}, {2, TWO}}; } }; } // anonymous namespace BOOST_AUTO_TEST_CASE(test_non_string) { BOOST_CHECK_EQUAL(parse("1"), numbers::ONE); BOOST_CHECK_EQUAL(parse("2"), numbers::TWO); BOOST_CHECK_THROW(parse("3"), po::invalid_option_value); BOOST_CHECK_THROW(parse("xx"), po::invalid_option_value); BOOST_CHECK_THROW(parse(""), po::invalid_option_value); BOOST_CHECK_EQUAL(format(numbers::ONE), "1"); BOOST_CHECK_EQUAL(format(numbers::TWO), "2"); BOOST_CHECK_EQUAL(format(static_cast(77)), "?unknown"); }