From 7856de43caef44b89cb59f794b37e14dbf424acf Mon Sep 17 00:00:00 2001 From: Henry Fredrick Schreiner Date: Wed, 1 Mar 2017 16:01:29 -0500 Subject: [PATCH] Broken tests only because adding new desired behavior --- include/CLI/App.hpp | 4 +-- include/CLI/StringTools.hpp | 11 +++++++ tests/HelpersTest.cpp | 13 ++++++++ tests/SubcommandTest.cpp | 61 ++++++++++++++++++++++++++++++++++++- 4 files changed, 86 insertions(+), 3 deletions(-) diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index 9e366a5c..75c8d96a 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -830,7 +830,7 @@ protected: [](std::pair& val){return val.first != detail::Classifer::POSITIONAL_MARK;}); if(num_left_over>0 && !allow_extras_) - throw ExtrasError("[" + detail::join(args, " ") + "]"); + throw ExtrasError("[" + detail::rjoin(args, " ") + "]"); pre_callback(); run_callback(); @@ -916,7 +916,7 @@ protected: auto op_ptr = std::find_if(std::begin(options_), std::end(options_), [name](const Option_p &v){return v->check_lname(name);}); if(op_ptr == std::end(options_)) { - missing_.emplace_back(detail::Classifer::LONG, "--" + name); + missing_.emplace_back(detail::Classifer::LONG, current); return; } diff --git a/include/CLI/StringTools.hpp b/include/CLI/StringTools.hpp index 3ce6b2c2..937afdd5 100644 --- a/include/CLI/StringTools.hpp +++ b/include/CLI/StringTools.hpp @@ -27,6 +27,17 @@ std::string join(const T& v, std::string delim = ",") { return s.str(); } +template +std::string rjoin(const T& v, std::string delim = ",") { + std::ostringstream s; + for(size_t start=0; start 0) + s << delim; + s << v[v.size() - start - 1]; + } + return s.str(); +} + // Based on http://stackoverflow.com/questions/25829143/c-trim-whitespace-from-a-string /// Trim whitespace from left of string diff --git a/tests/HelpersTest.cpp b/tests/HelpersTest.cpp index 66048dea..436fb9a0 100644 --- a/tests/HelpersTest.cpp +++ b/tests/HelpersTest.cpp @@ -188,3 +188,16 @@ TEST(String, ToLower) { EXPECT_EQ("one and two", CLI::detail::to_lower("one And TWO")); } + +TEST(Join, Forward) { + std::vector val {{"one", "two", "three"}}; + EXPECT_EQ("one,two,three", CLI::detail::join(val)); + EXPECT_EQ("one;two;three", CLI::detail::join(val, ";")); +} + + +TEST(Join, Backward) { + std::vector val {{"three", "two", "one"}}; + EXPECT_EQ("one,two,three", CLI::detail::join(val)); + EXPECT_EQ("one;two;three", CLI::detail::join(val, ";")); +} diff --git a/tests/SubcommandTest.cpp b/tests/SubcommandTest.cpp index b7f5e121..af2da6c0 100644 --- a/tests/SubcommandTest.cpp +++ b/tests/SubcommandTest.cpp @@ -36,7 +36,6 @@ TEST_F(TApp, Callbacks) { val = true; }); - app.reset(); args = {"sub2"}; EXPECT_FALSE(val); EXPECT_NO_THROW(run()); @@ -44,6 +43,66 @@ TEST_F(TApp, Callbacks) { } +TEST_F(TApp, FallThroughRegular) { + int val = 1; + app.add_option("--val", val); + + auto sub = app.add_subcommand("sub"); + + args = {"sub", "--val", "2"}; + // Should not throw + run(); +} + +TEST_F(TApp, FallThroughEquals) { + int val = 1; + app.add_option("--val", val); + + auto sub = app.add_subcommand("sub"); + + args = {"sub", "--val=2"}; + // Should not throw + run(); +} + + +TEST_F(TApp, EvilParseFallthrough) { + int val1 = 0, val2 = 0; + app.add_option("--val1", val1); + + auto sub = app.add_subcommand("sub"); + sub->add_option("val2", val2); + + args = {"sub", "--val1", "1", "2"}; + // Should not throw + run(); + + EXPECT_EQ(1, val1); + EXPECT_EQ(2, val2); +} + +TEST_F(TApp, CallbackOrdering) { + int val = 1, sub_val = 0; + app.add_option("--val", val); + + auto sub = app.add_subcommand("sub"); + sub->set_callback([&val, &sub_val](){ + sub_val = val; + }); + + args = {"sub", "--val=2"}; + run(); + EXPECT_EQ(2, val); + EXPECT_EQ(2, sub_val); + + app.reset(); + args = {"--val=2", "sub"}; + run(); + EXPECT_EQ(2, val); + EXPECT_EQ(2, sub_val); + +} + TEST_F(TApp, RequiredSubCom) { app.add_subcommand("sub1"); app.add_subcommand("sub2");