diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index ad8d8bea..c0ab731b 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -925,7 +925,7 @@ class ArgumentParser { * @throws std::bad_any_cast if the option is not of type T */ template - auto present(std::string_view aArgumentName) -> std::optional { + auto present(std::string_view aArgumentName) const -> std::optional { return (*this)[aArgumentName].present(); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c981f893..b1e00bef 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,6 +28,7 @@ file(GLOB ARGPARSE_TEST_SOURCES test_append.cpp test_compound_arguments.cpp test_container_arguments.cpp + test_const_correct.cpp test_help.cpp test_invalid_arguments.cpp test_is_used.cpp diff --git a/test/test_const_correct.cpp b/test/test_const_correct.cpp new file mode 100644 index 00000000..1acfdd40 --- /dev/null +++ b/test/test_const_correct.cpp @@ -0,0 +1,27 @@ +#include +#include + +using doctest::test_suite; + +TEST_CASE("ArgumentParser is const-correct after construction and parsing" * + test_suite("value_semantics")) { + GIVEN("a parser") { + argparse::ArgumentParser parser("test"); + parser.add_argument("--foo", "-f").help("I am foo"); + parser.add_description("A description"); + parser.add_epilog("An epilog"); + + WHEN("becomes const-qualified") { + parser.parse_args({"./main", "--foo", "baz"}); + const auto const_parser = std::move(parser); + + THEN("only const methods are accessible") { + REQUIRE(const_parser.help().str().size() > 0); + REQUIRE(const_parser.present("--foo")); + REQUIRE(const_parser.is_used("-f")); + REQUIRE(const_parser.get("-f") == "baz"); + REQUIRE(const_parser["-f"] == std::string("baz")); + } + } + } +}