From 24b51abfbadd9b051dda3904301ab590c695660b Mon Sep 17 00:00:00 2001 From: "Maarten L. Hekkelman" Date: Wed, 6 Mar 2024 14:33:12 +0100 Subject: [PATCH] replace boost test with catch2 --- test/CMakeLists.txt | 12 ++- test/unit-test.cpp | 221 ++++++++++++++++++++++++-------------------- 2 files changed, 129 insertions(+), 104 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d3be65b..4905563 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,8 +1,14 @@ -find_package(Boost REQUIRED) +find_package(Catch2 REQUIRED) add_executable(mcfp-unit-test ${CMAKE_CURRENT_SOURCE_DIR}/unit-test.cpp) -target_link_libraries(mcfp-unit-test mcfp::mcfp Boost::boost) +target_link_libraries(mcfp-unit-test mcfp::mcfp) + +if(${Catch2_VERSION} VERSION_GREATER_EQUAL 3.0.0) + target_compile_definitions(mcfp-unit-test PUBLIC CATCH22=0) +else() + target_compile_definitions(mcfp-unit-test PUBLIC CATCH22=1) +endif() if(MSVC) # Specify unwind semantics so that MSVC knowns how to handle exceptions @@ -10,4 +16,4 @@ if(MSVC) endif() add_test(NAME mcfp-unit-test - COMMAND $ -- ${CMAKE_CURRENT_SOURCE_DIR}) + COMMAND $ --data-dir ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/test/unit-test.cpp b/test/unit-test.cpp index 557f737..f33f006 100644 --- a/test/unit-test.cpp +++ b/test/unit-test.cpp @@ -24,33 +24,53 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#define BOOST_TEST_ALTERNATIVE_INIT_API -#include +#define CATCH_CONFIG_RUNNER + +#if CATCH22 +# include +#else +# include +#endif #include #include -namespace tt = boost::test_tools; -namespace utf = boost::unit_test; namespace fs = std::filesystem; -fs::path gTestDir = fs::current_path(); - -// -------------------------------------------------------------------- +std::filesystem::path gTestDir = std::filesystem::current_path(); -bool init_unit_test() +int main(int argc, char *argv[]) { - // not a test, just initialize test dir - if (boost::unit_test::framework::master_test_suite().argc == 2) - gTestDir = boost::unit_test::framework::master_test_suite().argv[1]; - - return true; + Catch::Session session; // There must be exactly one instance + + // Build a new parser on top of Catch2's +#if CATCH22 + using namespace Catch::clara; +#else + // Build a new parser on top of Catch2's + using namespace Catch::Clara; +#endif + + auto cli = session.cli() // Get Catch2's command line parser + | Opt(gTestDir, "data-dir") // bind variable to a new option, with a hint string + ["-D"]["--data-dir"] // the option names it will respond to + ("The directory containing the data files"); // description string for the help output + + // Now pass the new composite back to Catch2 so it uses that + session.cli(cli); + + // Let Catch2 (using Clara) parse the command line + int returnCode = session.applyCommandLine(argc, argv); + if (returnCode != 0) // Indicates a command line error + return returnCode; + + return session.run(); } // -------------------------------------------------------------------- -BOOST_AUTO_TEST_CASE(t_1, * utf::tolerance(0.001)) +TEST_CASE("t_1, * utf::tolerance(0.001)") { int argc = 3; const char *const argv[] = { @@ -69,19 +89,19 @@ BOOST_AUTO_TEST_CASE(t_1, * utf::tolerance(0.001)) config.parse(argc, argv); - BOOST_CHECK(config.has("flag")); - BOOST_CHECK(not config.has("flag2")); + CHECK(config.has("flag")); + CHECK(not config.has("flag2")); - BOOST_CHECK_EQUAL(config.get("param_int_2"), 1); - BOOST_CHECK_THROW(config.get("param_int_2"), std::system_error); - BOOST_CHECK_THROW(config.get("param_int"), std::system_error); + CHECK(config.get("param_int_2") == 1); + CHECK_THROWS_AS(config.get("param_int_2"), std::system_error); + CHECK_THROWS_AS(config.get("param_int"), std::system_error); - BOOST_TEST(config.get("param_float_2") == 3.14); - BOOST_CHECK_THROW(config.get("param_float_2"), std::system_error); - BOOST_CHECK_THROW(config.get("param_float"), std::system_error); + CHECK(std::to_string(config.get("param_float_2")) == std::to_string(3.14)); + CHECK_THROWS_AS(config.get("param_float_2"), std::system_error); + CHECK_THROWS_AS(config.get("param_float"), std::system_error); } -BOOST_AUTO_TEST_CASE(t_2) +TEST_CASE("t_2") { int argc = 3; const char *const argv[] = { @@ -96,10 +116,10 @@ BOOST_AUTO_TEST_CASE(t_2) config.parse(argc, argv); - BOOST_CHECK_EQUAL(config.count("verbose"), 5); + CHECK(config.count("verbose") == 5); } -BOOST_AUTO_TEST_CASE(t_3) +TEST_CASE("t_3") { int argc = 2; const char *const argv[] = { @@ -114,11 +134,10 @@ BOOST_AUTO_TEST_CASE(t_3) config.parse(argc, argv); - BOOST_CHECK(config.has("param_int")); - BOOST_CHECK_EQUAL(config.get("param_int"), 42); + CHECK(config.has("param_int")); + CHECK(config.get("param_int") == 42); } - -BOOST_AUTO_TEST_CASE(t_4) +TEST_CASE("t_4") { int argc = 3; const char *const argv[] = { @@ -133,11 +152,11 @@ BOOST_AUTO_TEST_CASE(t_4) config.parse(argc, argv); - BOOST_CHECK(config.has("param_int")); - BOOST_CHECK_EQUAL(config.get("param_int"), 42); + CHECK(config.has("param_int")); + CHECK(config.get("param_int") == 42); } -BOOST_AUTO_TEST_CASE(t_5) +TEST_CASE("t_5") { const char *const argv[] = { "test", "-i", "42", "-j43", nullptr @@ -153,14 +172,14 @@ BOOST_AUTO_TEST_CASE(t_5) config.parse(argc, argv); - BOOST_CHECK(config.has("nr1")); - BOOST_CHECK(config.has("nr2")); + CHECK(config.has("nr1")); + CHECK(config.has("nr2")); - BOOST_CHECK_EQUAL(config.get("nr1"), 42); - BOOST_CHECK_EQUAL(config.get("nr2"), 43); + CHECK(config.get("nr1") == 42); + CHECK(config.get("nr2") == 43); } -BOOST_AUTO_TEST_CASE(t_6) +TEST_CASE("t_6") { const char *const argv[] = { "test", "-i", "42", "-j43", "foo", "bar", nullptr @@ -176,18 +195,18 @@ BOOST_AUTO_TEST_CASE(t_6) config.parse(argc, argv); - BOOST_CHECK(config.has("nr1")); - BOOST_CHECK(config.has("nr2")); + CHECK(config.has("nr1")); + CHECK(config.has("nr2")); - BOOST_CHECK_EQUAL(config.get("nr1"), 42); - BOOST_CHECK_EQUAL(config.get("nr2"), 43); + CHECK(config.get("nr1") == 42); + CHECK(config.get("nr2") == 43); - BOOST_CHECK_EQUAL(config.operands().size(), 2); - BOOST_CHECK_EQUAL(config.operands().front(), "foo"); - BOOST_CHECK_EQUAL(config.operands().back(), "bar"); + CHECK(config.operands().size() == 2); + CHECK(config.operands().front() == "foo"); + CHECK(config.operands().back() == "bar"); } -BOOST_AUTO_TEST_CASE(t_7) +TEST_CASE("t_7") { const char *const argv[] = { "test", "--", "-i", "42", "-j43", "foo", "bar", nullptr @@ -203,16 +222,16 @@ BOOST_AUTO_TEST_CASE(t_7) config.parse(argc, argv); - BOOST_CHECK(not config.has("nr1")); - BOOST_CHECK(not config.has("nr2")); + CHECK(not config.has("nr1")); + CHECK(not config.has("nr2")); - BOOST_CHECK_EQUAL(config.operands().size(), 5); + CHECK(config.operands().size() == 5); auto compare = std::vector{ argv[2], argv[3], argv[4], argv[5], argv[6] }; - BOOST_CHECK(config.operands() == compare); + CHECK(config.operands() == compare); } -BOOST_AUTO_TEST_CASE(t_8) +TEST_CASE("t_8") { const char *const argv[] = { "test", "-i", "foo", "-jbar", nullptr @@ -229,16 +248,16 @@ BOOST_AUTO_TEST_CASE(t_8) config.parse(argc, argv); - BOOST_CHECK(config.has("i")); - BOOST_CHECK_EQUAL(config.get("i"), "foo"); - BOOST_CHECK(config.has("j")); - BOOST_CHECK_EQUAL(config.get("j"), "bar"); + CHECK(config.has("i")); + CHECK(config.get("i") == "foo"); + CHECK(config.has("j")); + CHECK(config.get("j") == "bar"); - BOOST_CHECK(config.has("k")); - BOOST_CHECK_EQUAL(config.get("k"), "baz"); + CHECK(config.has("k")); + CHECK(config.get("k") == "baz"); } -BOOST_AUTO_TEST_CASE(t_9) +TEST_CASE("t_9") { auto &config = mcfp::config::instance(); @@ -269,10 +288,10 @@ BOOST_AUTO_TEST_CASE(t_9) // std::cerr << '>' << kExpected << '<' << std::endl; // std::cerr << '>' << ss.str() << '<' << std::endl; -// BOOST_CHECK_EQUAL(ss.str(), kExpected); +// CHECK_EQUAL(ss.str(), kExpected); } -BOOST_AUTO_TEST_CASE(t_10) +TEST_CASE("t_10") { std::string s1 = R"(SPDX-License-Identifier: BSD-2-Clause @@ -293,7 +312,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND for (auto line : ww) os << line << std::endl; - BOOST_CHECK_EQUAL(os.str(), R"(SPDX-License-Identifier: BSD-2-Clause + CHECK(os.str() == R"(SPDX-License-Identifier: BSD-2-Clause Copyright (c) 2022 Maarten L. Hekkelman @@ -320,7 +339,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. )"); } -BOOST_AUTO_TEST_CASE(t_11) +TEST_CASE("t_11") { const char *const argv[] = { "test", "-faap", "-fnoot", "-fmies", nullptr @@ -335,16 +354,16 @@ BOOST_AUTO_TEST_CASE(t_11) config.parse(argc, argv); - BOOST_CHECK_EQUAL(config.count("file"), 3); + CHECK(config.count("file") == 3); std::vector files = config.get>("file"); - BOOST_CHECK_EQUAL(files.size(), 3); - BOOST_CHECK_EQUAL(files[0], "aap"); - BOOST_CHECK_EQUAL(files[1], "noot"); - BOOST_CHECK_EQUAL(files[2], "mies"); + CHECK(files.size() == 3); + CHECK(files[0] == "aap"); + CHECK(files[1] == "noot"); + CHECK(files[2] == "mies"); } -BOOST_AUTO_TEST_CASE(t_12) +TEST_CASE("t_12") { const char *const argv[] = { "test", "--aap", nullptr @@ -359,16 +378,16 @@ BOOST_AUTO_TEST_CASE(t_12) std::error_code ec; config.parse(argc, argv, ec); - BOOST_CHECK(ec == mcfp::config_error::unknown_option); + CHECK(ec == mcfp::config_error::unknown_option); config.set_ignore_unknown(true); ec = {}; config.parse(argc, argv, ec); - BOOST_CHECK(not ec); + CHECK(not ec); } -BOOST_AUTO_TEST_CASE(t_13) +TEST_CASE("t_13") { const char *const argv[] = { "test", "--test=bla", nullptr @@ -381,13 +400,13 @@ BOOST_AUTO_TEST_CASE(t_13) "test [options]", mcfp::make_option("test", "")); - BOOST_CHECK_NO_THROW(config.parse(argc, argv)); + CHECK_NOTHROW(config.parse(argc, argv)); - BOOST_TEST(config.has("test")); - BOOST_TEST(config.get("test") == "bla"); + CHECK(config.has("test")); + CHECK(config.get("test") == "bla"); } -BOOST_AUTO_TEST_CASE(t_14) +TEST_CASE("t_14") { const char *const argv[] = { "test", "-test=bla", nullptr @@ -400,12 +419,12 @@ BOOST_AUTO_TEST_CASE(t_14) "test [options]", mcfp::make_option("test", "")); - BOOST_CHECK_THROW(config.parse(argc, argv), std::system_error); + CHECK_THROWS_AS(config.parse(argc, argv), std::system_error); } // -------------------------------------------------------------------- -BOOST_AUTO_TEST_CASE(file_1, * utf::tolerance(0.001)) +TEST_CASE("file_1, * utf::tolerance(0.001)") { const std::string_view config_file{ R"( # This is a test configuration @@ -442,24 +461,24 @@ verbose config.parse_config_file(is, ec); - BOOST_CHECK(not ec); + CHECK(not ec); - BOOST_CHECK(config.has("aap")); - BOOST_CHECK_EQUAL(config.get("aap"), "1"); + CHECK(config.has("aap")); + CHECK(config.get("aap") == "1"); - BOOST_CHECK(config.has("noot")); - BOOST_CHECK_EQUAL(config.get("noot"), 2); + CHECK(config.has("noot")); + CHECK(config.get("noot") == 2); - BOOST_CHECK(config.has("pi")); - BOOST_TEST(config.get("pi") == 3.14); + CHECK(config.has("pi")); + CHECK(std::to_string(config.get("pi")) == std::to_string(3.14)); - BOOST_CHECK(config.has("s")); - BOOST_CHECK_EQUAL(config.get("s"), "hello, world!"); + CHECK(config.has("s")); + CHECK(config.get("s") == "hello, world!"); - BOOST_CHECK(config.has("verbose")); + CHECK(config.has("verbose")); } -BOOST_AUTO_TEST_CASE(file_2) +TEST_CASE("file_2") { auto &config = mcfp::config::instance(); @@ -494,14 +513,14 @@ BOOST_AUTO_TEST_CASE(file_2) config.parse_config_file(is, ec); - BOOST_CHECK(ec == err); + CHECK(ec == err); if (ec == std::errc()) - BOOST_CHECK(config.has(option)); + CHECK(config.has(option)); } } -BOOST_AUTO_TEST_CASE(file_3) +TEST_CASE("file_3") { auto &config = mcfp::config::instance(); @@ -522,16 +541,16 @@ BOOST_AUTO_TEST_CASE(file_3) config.parse_config_file("config", "bla-bla.conf", { gTestDir.string() }, ec); - BOOST_CHECK(not ec); + CHECK(not ec); - BOOST_CHECK(config.has("aap")); - BOOST_CHECK_EQUAL(config.get("aap"), "aap"); + CHECK(config.has("aap")); + CHECK(config.get("aap") == "aap"); - BOOST_CHECK(config.has("noot")); - BOOST_CHECK_EQUAL(config.get("noot"), 42); + CHECK(config.has("noot")); + CHECK(config.get("noot") == 42); } -BOOST_AUTO_TEST_CASE(file_4) + TEST_CASE("file_4") { auto &config = mcfp::config::instance(); @@ -552,11 +571,11 @@ BOOST_AUTO_TEST_CASE(file_4) config.parse_config_file("config", "unit-test.conf", { gTestDir.string() }, ec); - BOOST_CHECK(not ec); + CHECK(not ec); - BOOST_CHECK(config.has("aap")); - BOOST_CHECK_EQUAL(config.get("aap"), "aap"); + CHECK(config.has("aap")); + CHECK(config.get("aap") == "aap"); - BOOST_CHECK(config.has("noot")); - BOOST_CHECK_EQUAL(config.get("noot"), 3); + CHECK(config.has("noot")); + CHECK(config.get("noot") == 3); } \ No newline at end of file