From 5f258387a734fbc720743a4c5bca1976868cdbe7 Mon Sep 17 00:00:00 2001 From: Jarryd Beck Date: Sat, 13 Aug 2022 07:39:14 +1000 Subject: [PATCH] Fix values attached to short options Fixes #357. --- include/cxxopts.hpp | 2 +- test/options.cpp | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp index d9ecca8..2895890 100644 --- a/include/cxxopts.hpp +++ b/include/cxxopts.hpp @@ -754,7 +754,7 @@ std::basic_regex falsy_pattern ("(f|F)(alse)?|0"); std::basic_regex option_matcher - ("--([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]]+)"); + ("--([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]].*)"); std::basic_regex option_specifier ("([[:alnum:]][-_[:alnum:]]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*"); std::basic_regex option_specifier_separator(", *"); diff --git a/test/options.cpp b/test/options.cpp index df6a2e7..6da106e 100644 --- a/test/options.cpp +++ b/test/options.cpp @@ -118,9 +118,11 @@ TEST_CASE("Short options", "[options]") cxxopts::Options options("test_short", " - test short options"); options.add_options() - ("a", "a short option", cxxopts::value()); + ("a", "a short option", cxxopts::value()) + ("b", "b option") + ("c", "c option", cxxopts::value()); - Argv argv({"test_short", "-a", "value"}); + Argv argv({"test_short", "-a", "value", "-bcfoo=something"}); auto actual_argv = argv.argv(); auto argc = argv.argc(); @@ -131,10 +133,15 @@ TEST_CASE("Short options", "[options]") CHECK(result["a"].as() == "value"); auto& arguments = result.arguments(); - REQUIRE(arguments.size() == 1); + REQUIRE(arguments.size() == 3); CHECK(arguments[0].key() == "a"); CHECK(arguments[0].value() == "value"); + CHECK(result.count("b") == 1); + CHECK(result.count("c") == 1); + + CHECK(result["c"].as() == "foo=something"); + REQUIRE_THROWS_AS(options.add_options()("", "nothing option"), cxxopts::exceptions::invalid_option_format&); } @@ -703,8 +710,8 @@ TEST_CASE("Allow bad short syntax", "[options]") { ("s,short", "a short option"); Argv av({ - "unknown_options", - "-some_bad_short", + "--ab?", + "-?b?#@" }); auto** argv = av.argv(); @@ -718,7 +725,7 @@ TEST_CASE("Allow bad short syntax", "[options]") { options.allow_unrecognised_options(); CHECK_NOTHROW(options.parse(argc, argv)); REQUIRE(argc == 2); - CHECK_THAT(argv[1], Catch::Equals("-some_bad_short")); + CHECK_THAT(argv[1], Catch::Equals("-?b?#@")); } }