Skip to content

Commit 3d7c81e

Browse files
committed
Add test to handle unregistered subcommand option case.
1 parent ebdb5b8 commit 3d7c81e

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

llvm/unittests/Option/OptionSubCommandsTest.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,34 @@ TYPED_TEST(OptSubCommandTableTest, SubCommandParsing) {
164164
ErrMsg.find("Unregistered positionals passed"));
165165
EXPECT_NE(std::string::npos, ErrMsg.find("foobar"));
166166
}
167+
168+
{
169+
// Test case 6: Check invalid use of a valid subcommand which follows a
170+
// valid subcommand option but the option is not registered with the given
171+
// subcommand.
172+
const char *Args[] = {"-lowercase", "bar"};
173+
InputArgList AL = T.ParseArgs(Args, MAI, MAC);
174+
StringRef SC = AL.getSubCommand(
175+
T.getSubCommands(), HandleMultipleSubcommands, HandleOtherPositionals);
176+
auto HandleSubCommandArg = [&](ID OptionType) {
177+
if (!AL.hasArg(OptionType))
178+
return false;
179+
auto O = T.getOption(OptionType);
180+
if (!O.isRegisteredSC(SC)) {
181+
ErrMsg.clear();
182+
RSO1 << "Option [" << O.getName() << "] is not valid for SubCommand ["
183+
<< SC << "]\n";
184+
return false;
185+
}
186+
return true;
187+
};
188+
EXPECT_EQ(SC, "bar"); // valid subcommand
189+
EXPECT_TRUE(AL.hasArg(OPT_lowercase)); // valid option
190+
EXPECT_FALSE(HandleSubCommandArg(OPT_lowercase));
191+
EXPECT_NE(
192+
std::string::npos,
193+
ErrMsg.find("Option [lowercase] is not valid for SubCommand [bar]"));
194+
}
167195
}
168196

169197
TYPED_TEST(OptSubCommandTableTest, SubCommandHelp) {

0 commit comments

Comments
 (0)