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();

Reply via email to