This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-cli.git
The following commit(s) were added to refs/heads/master by this push: new fbd0194 CLI-320: Awkward behavior of Option.builder() for multiple optional args (#206) fbd0194 is described below commit fbd01940d2e675fb1fd2a5b526f831bd0853ce55 Author: Paul King <pa...@asert.com.au> AuthorDate: Tue Feb 20 01:21:23 2024 +1100 CLI-320: Awkward behavior of Option.builder() for multiple optional args (#206) --- src/main/java/org/apache/commons/cli/Option.java | 4 +- .../apache/commons/cli/AbstractParserTestCase.java | 49 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/cli/Option.java b/src/main/java/org/apache/commons/cli/Option.java index 1904809..0e7a36b 100644 --- a/src/main/java/org/apache/commons/cli/Option.java +++ b/src/main/java/org/apache/commons/cli/Option.java @@ -216,7 +216,9 @@ public class Option implements Cloneable, Serializable { * @return this builder, to allow method chaining */ public Builder optionalArg(final boolean optionalArg) { - this.argCount = optionalArg ? 1 : UNINITIALIZED; + if (optionalArg && this.argCount == UNINITIALIZED) { + this.argCount = 1; + } this.optionalArg = optionalArg; return this; } diff --git a/src/test/java/org/apache/commons/cli/AbstractParserTestCase.java b/src/test/java/org/apache/commons/cli/AbstractParserTestCase.java index 9f0b23e..2965787 100644 --- a/src/test/java/org/apache/commons/cli/AbstractParserTestCase.java +++ b/src/test/java/org/apache/commons/cli/AbstractParserTestCase.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -737,6 +738,54 @@ public abstract class AbstractParserTestCase { assertFalse(cmd.hasOption("fake")); } + @Test + public void testOptionalArgsOptionBuilder() throws Exception { + final Options opts = new Options(); + opts.addOption(OptionBuilder.hasOptionalArgs(2).create('i')); + final Properties properties = new Properties(); + + CommandLine cmd = parse(parser, opts, new String[]{"-i"}, properties); + assertTrue(cmd.hasOption("i")); + assertNull(null, cmd.getOptionValues("i")); + + cmd = parse(parser, opts, new String[]{"-i", "paper"}, properties); + assertTrue(cmd.hasOption("i")); + assertArrayEquals(new String[]{"paper"}, cmd.getOptionValues("i")); + + cmd = parse(parser, opts, new String[]{"-i", "paper", "scissors"}, properties); + assertTrue(cmd.hasOption("i")); + assertArrayEquals(new String[]{"paper", "scissors"}, cmd.getOptionValues("i")); + + cmd = parse(parser, opts, new String[]{"-i", "paper", "scissors", "rock"}, properties); + assertTrue(cmd.hasOption("i")); + assertArrayEquals(new String[]{"paper", "scissors"}, cmd.getOptionValues("i")); + assertArrayEquals(new String[]{"rock"}, cmd.getArgs()); + } + + @Test + public void testOptionalArgsOptionDotBuilder() throws Exception { + final Options opts = new Options(); + opts.addOption(Option.builder("i").numberOfArgs(2).optionalArg(true).build()); + final Properties properties = new Properties(); + + CommandLine cmd = parse(parser, opts, new String[]{"-i"}, properties); + assertTrue(cmd.hasOption("i")); + assertNull(null, cmd.getOptionValues("i")); + + cmd = parse(parser, opts, new String[]{"-i", "paper"}, properties); + assertTrue(cmd.hasOption("i")); + assertArrayEquals(new String[]{"paper"}, cmd.getOptionValues("i")); + + cmd = parse(parser, opts, new String[]{"-i", "paper", "scissors"}, properties); + assertTrue(cmd.hasOption("i")); + assertArrayEquals(new String[]{"paper", "scissors"}, cmd.getOptionValues("i")); + + cmd = parse(parser, opts, new String[]{"-i", "paper", "scissors", "rock"}, properties); + assertTrue(cmd.hasOption("i")); + assertArrayEquals(new String[]{"paper", "scissors"}, cmd.getOptionValues("i")); + assertArrayEquals(new String[]{"rock"}, cmd.getArgs()); + } + @Test public void testReuseOptionsTwice() throws Exception { final Options opts = new Options();