Commit 51c32efb7c2bde913d202a3fa25b292d543a9063

Authored by Marcus Brinkmann
Committed by Henry Schreiner
1 parent 675e7536

Fix ExtrasError.

include/CLI/App.hpp
... ... @@ -954,7 +954,7 @@ class App {
954 954 if(recurse) {
955 955 for(const App_p &sub : subcommands_) {
956 956 std::vector<std::string> output = sub->remaining(recurse);
957   - miss_list.assign(std::begin(output), std::end(output));
  957 + std::copy(std::begin(output), std::end(output), std::back_inserter(miss_list));
958 958 }
959 959 }
960 960 return miss_list;
... ... @@ -1114,15 +1114,14 @@ class App {
1114 1114 throw RequiredError(std::to_string(require_subcommand_) + " subcommand(s) required");
1115 1115  
1116 1116 // Convert missing (pairs) to extras (string only)
1117   - if(parent_ == nullptr) {
1118   - args = remaining(true);
1119   - std::reverse(std::begin(args), std::end(args));
  1117 + if(!(allow_extras_ || prefix_command_)) {
  1118 + size_t num_left_over = remaining_size();
  1119 + if(num_left_over > 0) {
  1120 + args = remaining(false);
  1121 + std::reverse(std::begin(args), std::end(args));
  1122 + throw ExtrasError("[" + detail::rjoin(args, " ") + "]");
  1123 + }
1120 1124 }
1121   -
1122   - size_t num_left_over = remaining_size();
1123   -
1124   - if(num_left_over > 0 && !(allow_extras_ || prefix_command_))
1125   - throw ExtrasError("[" + detail::rjoin(args, " ") + "]");
1126 1125 }
1127 1126  
1128 1127 /// Parse one ini param, return false if not found in any subcommand, remove if it is
... ...
tests/SubcommandTest.cpp
... ... @@ -32,6 +32,23 @@ TEST_F(TApp, BasicSubcommands) {
32 32 app.reset();
33 33 args = {"SUb2"};
34 34 EXPECT_THROW(run(), CLI::ExtrasError);
  35 +
  36 + app.reset();
  37 + args = {"SUb2"};
  38 + try {
  39 + run();
  40 + } catch(const CLI::ExtrasError &e) {
  41 + EXPECT_THAT(e.what(), HasSubstr("SUb2"));
  42 + }
  43 +
  44 + app.reset();
  45 + args = {"sub1", "extra"};
  46 + try {
  47 + run();
  48 + } catch(const CLI::ExtrasError &e) {
  49 + EXPECT_THAT(e.what(), HasSubstr("extra"));
  50 + }
  51 +
35 52 }
36 53  
37 54 TEST_F(TApp, MultiSubFallthrough) {
... ... @@ -339,6 +356,14 @@ TEST_F(TApp, SubComExtras) {
339 356 run();
340 357 EXPECT_EQ(app.remaining(), std::vector<std::string>());
341 358 EXPECT_EQ(sub->remaining(), std::vector<std::string>({"extra1", "extra2"}));
  359 +
  360 + app.reset();
  361 +
  362 + args = {"extra1", "extra2", "sub", "extra3", "extra4"};
  363 + run();
  364 + EXPECT_EQ(app.remaining(), std::vector<std::string>({"extra1", "extra2"}));
  365 + EXPECT_EQ(app.remaining(true), std::vector<std::string>({"extra1", "extra2", "extra3", "extra4"}));
  366 + EXPECT_EQ(sub->remaining(), std::vector<std::string>({"extra3", "extra4"}));
342 367 }
343 368  
344 369 TEST_F(TApp, Required1SubCom) {
... ...