diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index ad8d8be..c0ab731 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -925,7 +925,7 @@ public: * @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/test_value_semantics.cpp b/test/test_value_semantics.cpp index 2cc0f88..72958cc 100644 --- a/test/test_value_semantics.cpp +++ b/test/test_value_semantics.cpp @@ -93,4 +93,27 @@ TEST_CASE("ArgumentParser is CopyConstructible and CopyAssignable" * } } } + + 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")); + } + } + } + } }