Skip to content

Commit 4c971f0

Browse files
committed
OptionGroup now selects properly an option with no short name (CLI-182)
OptionGroups no longer throw an AlreadySelectedException when reused for several parsings (CLI-183) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/cli/trunk@780163 13f79535-47bb-0310-9956-ffa450edef68
1 parent 6a99918 commit 4c971f0

4 files changed

Lines changed: 80 additions & 4 deletions

File tree

src/java/org/apache/commons/cli/OptionGroup.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,19 @@ public Collection getOptions()
8585
*/
8686
public void setSelected(Option option) throws AlreadySelectedException
8787
{
88+
if (option == null)
89+
{
90+
// reset the option previously selected
91+
selected = null;
92+
return;
93+
}
94+
8895
// if no option has already been selected or the
8996
// same option is being reselected then set the
9097
// selected member variable
91-
if (selected == null || selected.equals(option.getOpt()))
98+
if (selected == null || selected.equals(option.getKey()))
9299
{
93-
selected = option.getOpt();
100+
selected = option.getKey();
94101
}
95102
else
96103
{

src/java/org/apache/commons/cli/Parser.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ public CommandLine parse(Options options, String[] arguments, Properties propert
145145
Option opt = (Option) it.next();
146146
opt.clearValues();
147147
}
148+
149+
// clear the data from the groups
150+
for (Iterator it = options.getOptionGroups().iterator(); it.hasNext();)
151+
{
152+
OptionGroup group = (OptionGroup) it.next();
153+
group.setSelected(null);
154+
}
148155

149156
// initialise members
150157
setOptions(options);

src/test/org/apache/commons/cli/ParserTestCase.java

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public void testMissingArg() throws Exception
144144
assertTrue( "Confirm MissingArgumentException caught", caught );
145145
}
146146

147-
public void testDoubleDash() throws Exception
147+
public void testDoubleDash1() throws Exception
148148
{
149149
String[] args = new String[] { "--copt",
150150
"--",
@@ -574,7 +574,63 @@ public void testMissingRequiredOptions()
574574
fail("expected to catch MissingOptionException");
575575
}
576576
}
577+
578+
public void testMissingRequiredGroup() throws Exception
579+
{
580+
OptionGroup group = new OptionGroup();
581+
group.addOption(OptionBuilder.create("a"));
582+
group.addOption(OptionBuilder.create("b"));
583+
group.setRequired(true);
584+
585+
Options options = new Options();
586+
options.addOptionGroup(group);
587+
options.addOption(OptionBuilder.isRequired().create("c"));
588+
589+
try
590+
{
591+
parser.parse(options, new String[] { "-c" });
592+
fail("MissingOptionException not thrown");
593+
}
594+
catch (MissingOptionException e)
595+
{
596+
assertEquals(1, e.getMissingOptions().size());
597+
assertTrue(e.getMissingOptions().get(0) instanceof OptionGroup);
598+
}
599+
catch (ParseException e)
600+
{
601+
fail("Expected to catch MissingOptionException");
602+
}
603+
}
604+
605+
public void testOptionGroup() throws Exception
606+
{
607+
OptionGroup group = new OptionGroup();
608+
group.addOption(OptionBuilder.create("a"));
609+
group.addOption(OptionBuilder.create("b"));
610+
611+
Options options = new Options();
612+
options.addOptionGroup(group);
613+
614+
parser.parse(options, new String[] { "-b" });
615+
616+
assertEquals("selected option", "b", group.getSelected());
617+
}
577618

619+
public void testOptionGroupLong() throws Exception
620+
{
621+
OptionGroup group = new OptionGroup();
622+
group.addOption(OptionBuilder.withLongOpt("foo").create());
623+
group.addOption(OptionBuilder.withLongOpt("bar").create());
624+
625+
Options options = new Options();
626+
options.addOptionGroup(group);
627+
628+
CommandLine cl = parser.parse(options, new String[] { "--bar" });
629+
630+
assertTrue(cl.hasOption("bar"));
631+
assertEquals("selected option", "bar", group.getSelected());
632+
}
633+
578634
public void testReuseOptionsTwice() throws Exception
579635
{
580636
Options opts = new Options();

xdocs/changes.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,14 @@
2323
<body>
2424

2525
<release version="1.3" date="in SVN">
26+
<action type="fix" dev="ebourg" issue="CLI-183">
27+
OptionGroups no longer throw an AlreadySelectedException when reused for several parsings.
28+
</action>
29+
<action type="fix" dev="ebourg" issue="CLI-182">
30+
OptionGroup now selects properly an option with no short name.
31+
</action>
2632
<action type="add" dev="ebourg" issue="CLI-160">
27-
PosixParser now supports partial long options (--ver instead of --version)
33+
PosixParser now supports partial long options (--ver instead of --version).
2834
</action>
2935
</release>
3036

0 commit comments

Comments
 (0)