Make sure the command listing is triggered on wrong subcommand. Signed-off-by: Henner Zeller <hzeller@google.com>
diff --git a/common/util/subcommand.cc b/common/util/subcommand.cc index bc8fb1f..560bd58 100644 --- a/common/util/subcommand.cc +++ b/common/util/subcommand.cc
@@ -38,8 +38,9 @@ {"error", {[this](const SubcommandArgsRange& args, std::istream& ins, std::ostream& outs, std::ostream& errs) { - const auto unused_status = Help({}, ins, outs, errs); - return absl::InvalidArgumentError("Unknown subcommand."); + // Call with empty arguments to just get the command listing. + const auto unused_status = Help({}, ins, outs, errs); + return absl::InvalidArgumentError("Unknown subcommand."); }, "same as 'help', but exits non-zero to signal a wrong command.\n", false}},
diff --git a/common/util/subcommand_test.cc b/common/util/subcommand_test.cc index 85368c0..fffedd3 100644 --- a/common/util/subcommand_test.cc +++ b/common/util/subcommand_test.cc
@@ -92,26 +92,23 @@ EXPECT_EQ(outs.str(), "42"); } -TEST(SubcommandRegistryTest, ShowRegisteredCommandsInHelp) { +TEST(SubcommandRegistryTest, ShowRegisteredCommandsOnWrongCommandRequest) { SubcommandRegistry registry; { const auto status = registry.RegisterCommand("fizz", fizz_func); EXPECT_TRUE(absl::StrContains(registry.ListCommands(), "fizz")); } - std::vector<absl::string_view> args; - const SubcommandArgsRange range(args.begin(), args.end()); - const SubcommandEntry& help_entry(registry.GetSubcommandEntry("wrong_cmd")); + const SubcommandEntry& cmd(registry.GetSubcommandEntry("wrong_command")); + std::vector<absl::string_view> args{"foo", "bar"}; + const SubcommandArgsRange range(args.begin(), args.end()); std::istringstream ins; std::ostringstream outs, errs; - const auto status = help_entry.main(range, ins, outs, errs); + const auto status = cmd.main(range, ins, outs, errs); EXPECT_FALSE(status.ok()) << status.message(); - std::cerr << status.message() << "\n"; - std::cerr << outs.str() << "\n"; - std::cerr << errs.str() << "\n"; + EXPECT_TRUE(absl::StrContains(errs.str(), "available commands")); EXPECT_TRUE(absl::StrContains(errs.str(), "fizz")); - EXPECT_TRUE(absl::StrContains(errs.str(), "help")); } static const SubcommandEntry buzz_func{