From e5c3630eba2144c1dc770f452689a1269363e639 Mon Sep 17 00:00:00 2001 From: Pranav Srinivas Kumar Date: Mon, 1 Apr 2019 20:06:54 -0400 Subject: [PATCH] Checking if i < argc on edge case. New tests added --- src/argparse.hpp | 8 +++++--- tests/test_compound_arguments.hpp | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/argparse.hpp b/src/argparse.hpp index b25847e..5abfbea 100644 --- a/src/argparse.hpp +++ b/src/argparse.hpp @@ -478,10 +478,12 @@ class ArgumentParser { tNumArgs = tArgumentObject->mNumArgs; } std::vector tArgumentsForRecursiveParsing = { "", "-" + tArgument }; - while (tNumArgs > 0) { + while (tNumArgs > 0 && i < argc) { i += 1; - tArgumentsForRecursiveParsing.push_back(argv[i]); - tNumArgs -= 1; + if (i < argc) { + tArgumentsForRecursiveParsing.push_back(argv[i]); + tNumArgs -= 1; + } } parse_args_internal(tArgumentsForRecursiveParsing); } diff --git a/tests/test_compound_arguments.hpp b/tests/test_compound_arguments.hpp index a2c7b5d..88bbb85 100644 --- a/tests/test_compound_arguments.hpp +++ b/tests/test_compound_arguments.hpp @@ -122,4 +122,31 @@ TEST_CASE("Parse out-of-order compound arguments", "[compound_arguments]") { auto a = program.get("-a"); // true auto b = program.get("-b"); // true auto c = program.get>("-c"); // {3.14f, 2.718f} +} + +TEST_CASE("Parse out-of-order compound arguments. Second variation", "[compound_arguments]") { + argparse::ArgumentParser program("test"); + + program.add_argument("-a") + .default_value(false) + .implicit_value(true); + + program.add_argument("-b") + .default_value(false) + .implicit_value(true); + + program.add_argument("-c") + .nargs(2) + .default_value(std::vector{0.0f, 0.0f}) + .action([](const std::string& value) { return std::stof(value); }); + + program.parse_args({"./main", "-cb"}); + + auto a = program.get("-a"); + auto b = program.get("-b"); + auto c = program.get>("-c"); + + REQUIRE(a == false); + REQUIRE(b == true); + REQUIRE(program["-c"] == std::vector{0.0f, 0.0f}); } \ No newline at end of file