From 05df2f5adbff5105f9956cc1800a9cf3b3a7b992 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Nov 2025 22:54:07 +0100 Subject: [PATCH 1/5] Remove unit test --- test/unittest/test_parsing_positional.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/unittest/test_parsing_positional.cpp b/test/unittest/test_parsing_positional.cpp index a797ef3..b35ba9c 100644 --- a/test/unittest/test_parsing_positional.cpp +++ b/test/unittest/test_parsing_positional.cpp @@ -129,16 +129,6 @@ TEST_CASE("The resulting attribute name for positional argument is based on its CHECK(args.get("foo")); } -TEST_CASE("The resulting attribute name for positional argument is based on dest parameter") -{ - auto parser = argparse::ArgumentParser(); - parser.add_argument("foo").dest("bar"); - - auto const args = parser.parse_args(2, cstr_arr{"prog", "val"}); - - CHECK(args.get("bar")); -} - TEST_CASE_TEMPLATE("Parsing a positional argument with choices set accepts one of the values", T, char, signed char, unsigned char, short int, unsigned short int, int, unsigned int, long int, unsigned long int, long long int, unsigned long long int, float, double, long double, std::string, foo::Custom) { auto parser = argparse::ArgumentParser().handle(argparse::Handle::none); From f95d428d73b7130440ee65a5e81ceb3bded6c97b Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Nov 2025 22:58:11 +0100 Subject: [PATCH 2/5] Remove positional argument support for dest option --- include/argparse.hpp | 4 ++++ test/unittest/test_argument_parser.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/include/argparse.hpp b/include/argparse.hpp index 6319b91..707976a 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1960,6 +1960,10 @@ namespace argparse auto dest(std::string dest) -> ArgumentBuilder & { + if (is_positional()) + { + throw ""; + } m_options.dest = std::move(dest); return *this; } diff --git a/test/unittest/test_argument_parser.cpp b/test/unittest/test_argument_parser.cpp index bb08ab9..5e54dbe 100644 --- a/test/unittest/test_argument_parser.cpp +++ b/test/unittest/test_argument_parser.cpp @@ -313,6 +313,13 @@ TEST_CASE("ArgumentParser replaces '{prog}' with program name in usage text") CHECK(parser.format_help() == "usage: program [options]"s); } +TEST_CASE("Adding a positional argument with dest option set results in error") +{ + auto parser = argparse::ArgumentParser(); + + CHECK_THROWS(parser.add_argument("pos").dest("foo")); +} + TEST_CASE("Adding a positional argument with required option set results in error") { auto parser = argparse::ArgumentParser(); From 1a73db8d332caca8ce200cd808f64ed7902d6bea Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Nov 2025 23:06:59 +0100 Subject: [PATCH 3/5] Improve error message --- include/argparse.hpp | 2 +- test/unittest/test_argument_parser.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 707976a..ebc4219 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1962,7 +1962,7 @@ namespace argparse { if (is_positional()) { - throw ""; + throw option_error("'dest' is an invalid argument for positionals"); } m_options.dest = std::move(dest); return *this; diff --git a/test/unittest/test_argument_parser.cpp b/test/unittest/test_argument_parser.cpp index 5e54dbe..080385d 100644 --- a/test/unittest/test_argument_parser.cpp +++ b/test/unittest/test_argument_parser.cpp @@ -317,7 +317,7 @@ TEST_CASE("Adding a positional argument with dest option set results in error") { auto parser = argparse::ArgumentParser(); - CHECK_THROWS(parser.add_argument("pos").dest("foo")); + CHECK_THROWS_WITH_AS(parser.add_argument("pos").dest("foo"), "'dest' is an invalid argument for positionals", argparse::option_error); } TEST_CASE("Adding a positional argument with required option set results in error") From b68835218dbdcb3f6b96045c23ffcc679bb86140 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Nov 2025 23:09:28 +0100 Subject: [PATCH 4/5] Simplify code --- include/argparse.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index ebc4219..60665ae 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1213,9 +1213,7 @@ namespace argparse auto get_dest_name() const -> std::string override { - return m_impl.get_dest().empty() - ? get_name() - : m_impl.get_dest(); + return get_name(); } auto get_metavar_name() const -> std::string override From 509df8fa19814d599cb1492568184bff37af175d Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Nov 2025 23:12:06 +0100 Subject: [PATCH 5/5] Add unit test --- test/unittest/test_argument_parser.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/unittest/test_argument_parser.cpp b/test/unittest/test_argument_parser.cpp index 080385d..36fbd7f 100644 --- a/test/unittest/test_argument_parser.cpp +++ b/test/unittest/test_argument_parser.cpp @@ -320,6 +320,13 @@ TEST_CASE("Adding a positional argument with dest option set results in error") CHECK_THROWS_WITH_AS(parser.add_argument("pos").dest("foo"), "'dest' is an invalid argument for positionals", argparse::option_error); } +TEST_CASE("Adding an optional argument with dest option does not result in error") +{ + auto parser = argparse::ArgumentParser(); + + CHECK_NOTHROW(parser.add_argument("-o").dest("foo")); +} + TEST_CASE("Adding a positional argument with required option set results in error") { auto parser = argparse::ArgumentParser();