diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 06d30fd4..54d1aa14 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -2356,7 +2356,9 @@ class ArgumentParser { } auto end = std::end(arguments); auto positional_argument_it = std::begin(m_positional_arguments); - for (auto it = std::next(std::begin(arguments)); it != end;) { + for (auto it = arguments.empty() ? std::begin(arguments) + : std::next(std::begin(arguments)); + it != end;) { const auto ¤t_argument = *it; if (Argument::is_positional(current_argument, m_prefix_chars)) { if (positional_argument_it == std::end(m_positional_arguments)) { @@ -2473,7 +2475,9 @@ class ArgumentParser { } auto end = std::end(arguments); auto positional_argument_it = std::begin(m_positional_arguments); - for (auto it = std::next(std::begin(arguments)); it != end;) { + for (auto it = arguments.empty() ? std::begin(arguments) + : std::next(std::begin(arguments)); + it != end;) { const auto ¤t_argument = *it; if (Argument::is_positional(current_argument, m_prefix_chars)) { if (positional_argument_it == std::end(m_positional_arguments)) { diff --git a/test/test_parse_args.cpp b/test/test_parse_args.cpp index 6eb97bd6..0312957f 100644 --- a/test/test_parse_args.cpp +++ b/test/test_parse_args.cpp @@ -6,9 +6,25 @@ import argparse; #include #include +#include using doctest::test_suite; +TEST_CASE("Parse empty argument vector" * test_suite("parse_args")) { + argparse::ArgumentParser program("test"); + + REQUIRE_NOTHROW(program.parse_args(std::vector{})); +} + +TEST_CASE("Parse empty argument vector with required argument" * + test_suite("parse_args")) { + argparse::ArgumentParser program("test"); + program.add_argument("config"); + + REQUIRE_THROWS_AS(program.parse_args(std::vector{}), + std::runtime_error); +} + TEST_CASE("Missing argument" * test_suite("parse_args")) { argparse::ArgumentParser program("test"); program.add_argument("--config").nargs(1); diff --git a/test/test_parse_known_args.cpp b/test/test_parse_known_args.cpp index 909621f7..bf12e0b1 100644 --- a/test/test_parse_known_args.cpp +++ b/test/test_parse_known_args.cpp @@ -10,6 +10,14 @@ import argparse; using doctest::test_suite; +TEST_CASE("Parse empty argument vector without exceptions" * + test_suite("parse_known_args")) { + argparse::ArgumentParser program("test"); + + auto unknown_args = program.parse_known_args(std::vector{}); + REQUIRE(unknown_args.empty()); +} + TEST_CASE("Parse unknown optional and positional arguments without exceptions" * test_suite("parse_known_args")) { argparse::ArgumentParser program("test");