From 9037b0845443d867795dc503d7e295eed24895fe Mon Sep 17 00:00:00 2001 From: Pranav Srinivas Kumar Date: Mon, 1 Apr 2019 20:41:14 -0400 Subject: [PATCH] Added support for parent parsers. Some basic unit tests --- src/argparse.hpp | 25 +++++++++++++++++++++++++ tests/main.cpp | 3 ++- tests/test_parent_parsers.hpp | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/test_parent_parsers.hpp diff --git a/src/argparse.hpp b/src/argparse.hpp index 5abfbea..054aa0e 100644 --- a/src/argparse.hpp +++ b/src/argparse.hpp @@ -274,6 +274,30 @@ class ArgumentParser { return *tArgument; } + void add_parents() { + for (size_t i = 0; i < mParentParsers.size(); i++) { + auto tParentParser = mParentParsers[i]; + auto tPositionalArguments = tParentParser.mPositionalArguments; + for (auto& tArgument : tPositionalArguments) { + mPositionalArguments.push_back(tArgument); + } + auto tOptionalArguments = tParentParser.mOptionalArguments; + for (auto& tArgument : tOptionalArguments) { + mOptionalArguments.push_back(tArgument); + } + auto tArgumentMap = tParentParser.mArgumentMap; + for (auto&[tKey, tValue] : tArgumentMap) { + upsert(mArgumentMap, tKey, tValue); + } + } + } + + template + void add_parents(T aArgumentParser, Targs... Fargs) { + mParentParsers.push_back(aArgumentParser); + add_parents(Fargs...); + } + void parse_args(const std::vector& aArguments) { parse_args_internal(aArguments); parse_args_validate(); @@ -563,6 +587,7 @@ class ArgumentParser { } std::string mProgramName; + std::vector mParentParsers; std::vector> mPositionalArguments; std::vector> mOptionalArguments; size_t mNextPositionalArgument; diff --git a/tests/main.cpp b/tests/main.cpp index 8892744..98c2408 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -6,4 +6,5 @@ #include #include #include -#include \ No newline at end of file +#include +#include \ No newline at end of file diff --git a/tests/test_parent_parsers.hpp b/tests/test_parent_parsers.hpp new file mode 100644 index 0000000..79a6d5c --- /dev/null +++ b/tests/test_parent_parsers.hpp @@ -0,0 +1,34 @@ +#pragma once +#include +#include + +TEST_CASE("Add parent parsers", "[parent_parsers]") { + argparse::ArgumentParser parent_parser("main"); + parent_parser.add_argument("--verbose") + .default_value(false) + .implicit_value(true); + + argparse::ArgumentParser child_parser("foo"); + child_parser.add_parents(parent_parser); + child_parser.parse_args({ "./main", "--verbose"}); + REQUIRE(child_parser["--verbose"] == true); +} + +TEST_CASE("Add parent to multiple parent parsers", "[parent_parsers]") { + argparse::ArgumentParser parent_parser("main"); + parent_parser.add_argument("--parent") + .default_value(0) + .action([](const std::string& value) { return std::stoi(value); }); + + argparse::ArgumentParser foo_parser("foo"); + foo_parser.add_argument("foo"); + foo_parser.add_parents(parent_parser); + foo_parser.parse_args({ "./main", "--parent", "2", "XXX" }); + REQUIRE(foo_parser["--parent"] == 2); + REQUIRE(foo_parser["foo"] == std::string("XXX")); + + argparse::ArgumentParser bar_parser("bar"); + bar_parser.add_argument("--bar"); + bar_parser.parse_args({ "./main", "--bar", "YYY" }); + REQUIRE(bar_parser["--bar"] == std::string("YYY")); +} \ No newline at end of file