diff --git a/include/CLI/impl/App_inl.hpp b/include/CLI/impl/App_inl.hpp index c17fa808..ceeca898 100644 --- a/include/CLI/impl/App_inl.hpp +++ b/include/CLI/impl/App_inl.hpp @@ -1731,7 +1731,7 @@ CLI11_INLINE bool App::_parse_positional(std::vector &args, bool ha for(const Option_p &opt : options_) { // Eat options, one by one, until done if(opt->get_positional() && - (static_cast(opt->count()) < opt->get_items_expected_min() || opt->get_allow_extra_args())) { + (static_cast(opt->count()) < opt->get_items_expected_max() || opt->get_allow_extra_args())) { if(validate_positionals_) { std::string pos = positional; pos = opt->_validate(pos, 0); diff --git a/tests/AppTest.cpp b/tests/AppTest.cpp index 6dc87828..877460b4 100644 --- a/tests/AppTest.cpp +++ b/tests/AppTest.cpp @@ -1236,6 +1236,56 @@ TEST_CASE_METHOD(TApp, "RequiredOptsDoubleNeg", "[app]") { CHECK(std::vector({"one", "two"}) == strs); } +TEST_CASE_METHOD(TApp, "ExpectedRangeParam", "[app]") { + + app.add_option("-s")->required()->expected(2, 4); + + args = {"-s", "one"}; + + CHECK_THROWS_AS(run(), CLI::ArgumentMismatch); + + args = {"-s", "one", "two"}; + + CHECK_NOTHROW(run()); + + args = {"-s", "one", "two", "three"}; + + CHECK_NOTHROW(run()); + + args = {"-s", "one", "two", "three", "four"}; + + CHECK_NOTHROW(run()); + + args = {"-s", "one", "two", "three", "four", "five"}; + + CHECK_THROWS_AS(run(), CLI::ExtrasError); +} + +TEST_CASE_METHOD(TApp, "ExpectedRangePositional", "[app]") { + + app.add_option("arg")->required()->expected(2, 4); + + args = {"one"}; + + CHECK_THROWS_AS(run(), CLI::ArgumentMismatch); + + args = {"one", "two"}; + + CHECK_NOTHROW(run()); + + args = {"one", "two", "three"}; + + CHECK_NOTHROW(run()); + + args = {"one", "two", "three", "four"}; + + CHECK_NOTHROW(run()); + + args = {"one", "two", "three", "four", "five"}; + + CHECK_THROWS_AS(run(), CLI::ExtrasError); +} + // This makes sure unlimited option priority is // correct for space vs. no space #90 TEST_CASE_METHOD(TApp, "PositionalNoSpace", "[app]") {