Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions include/argparse.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -1960,6 +1958,10 @@ namespace argparse

auto dest(std::string dest) -> ArgumentBuilder &
{
if (is_positional())
{
throw option_error("'dest' is an invalid argument for positionals");
}
m_options.dest = std::move(dest);
return *this;
}
Expand Down
14 changes: 14 additions & 0 deletions test/unittest/test_argument_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,20 @@ 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_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();
Expand Down
10 changes: 0 additions & 10 deletions test/unittest/test_parsing_positional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down