From b177c29a17bab7e2e8151e13f468366e0ef1e84a Mon Sep 17 00:00:00 2001 From: Pavel Belikov Date: Sat, 4 Nov 2017 13:18:05 +0300 Subject: add subparsers --- test.cxx | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'test.cxx') diff --git a/test.cxx b/test.cxx index 2d36ff8..eddf7fd 100644 --- a/test.cxx +++ b/test.cxx @@ -599,7 +599,7 @@ TEST_CASE("Hidden options are excluded from help", "[args]") args::ValueFlag foo1(group, "foo", "foo", {'f', "foo"}, args::Options::Hidden); args::ValueFlag bar2(group, "bar", "bar", {'b'}); - auto desc = parser1.GetChildDescriptions("", "", "", ""); + auto desc = parser1.GetDescription("", "", "", "", 0); REQUIRE(desc.size() == 3); REQUIRE(std::get<0>(desc[0]) == "b[bar]"); REQUIRE(std::get<0>(desc[1]) == "group"); @@ -678,6 +678,74 @@ TEST_CASE("Nargs work as expected", "[args]") REQUIRE(args::get(f) == false); } +TEST_CASE("Simple commands work as expected", "[args]") +{ + args::ArgumentParser p("git-like parser"); + args::ValueFlag gitdir(p, "path", "", {"git-dir"}, args::Options::Global); + args::HelpFlag h(p, "help", "help", {"help"}, args::Options::Global); + args::PositionalList pathsList(p, "paths", "files to commit", args::Options::Global); + args::Command add(p, "add", "Add file contents to the index"); + args::Command commit(p, "commit", "record changes to the repository"); + + p.RequireCommand(true); + p.ParseArgs(std::vector{"add", "--git-dir", "A", "B", "C", "D"}); + REQUIRE(add); + REQUIRE(!commit); + REQUIRE((args::get(pathsList) == std::vector{"B", "C", "D"})); + REQUIRE(args::get(gitdir) == "A"); +} + +TEST_CASE("Subparser commands work as expected", "[args]") +{ + args::Group globals; + args::ValueFlag gitdir(globals, "path", "", {"git-dir"}); + args::HelpFlag h(globals, "help", "help", {"help"}); + + args::ArgumentParser p("git-like parser"); + args::GlobalOptions g(p, globals); + + std::vector paths; + + args::Command add(p, "add", "Add file contents to the index", [&](args::Subparser &c) + { + args::PositionalList pathsList(c, "paths", "files to add"); + c.Parse(); + paths.assign(std::begin(pathsList), std::end(pathsList)); + }); + + args::Command commit(p, "commit", "record changes to the repository", [&](args::Subparser &c) + { + args::PositionalList pathsList(c, "paths", "files to commit"); + c.Parse(); + paths.assign(std::begin(pathsList), std::end(pathsList)); + }); + + p.RequireCommand(true); + p.ParseArgs(std::vector{"add", "--git-dir", "A", "B", "C", "D"}); + REQUIRE(add); + REQUIRE(!commit); + REQUIRE((paths == std::vector{"B", "C", "D"})); + REQUIRE(args::get(gitdir) == "A"); +} + +TEST_CASE("Subparser commands with kick-out flags work as expected", "[args]") +{ + args::ArgumentParser p("git-like parser"); + + std::vector kickedOut; + args::Command add(p, "add", "Add file contents to the index", [&](args::Subparser &c) + { + args::Flag kickoutFlag(c, "kick-out", "kick-out flag", {'k'}, args::Options::KickOut); + c.Parse(); + REQUIRE(kickoutFlag); + kickedOut = c.KickedOut(); + }); + + p.ParseArgs(std::vector{"add", "-k", "A", "B", "C", "D"}); + REQUIRE(add); + REQUIRE((kickedOut == std::vector{"A", "B", "C", "D"})); +} + #undef ARGS_HXX #define ARGS_TESTNAMESPACE #define ARGS_NOEXCEPT -- cgit v1.2.1