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 12124d4  [CLI-336] Deprecation not always reported (#284)
12124d4 is described below

commit 12124d41bebd799db75815c4696ade73534cb1b7
Author: Claude Warren <cla...@xenei.com>
AuthorDate: Sat Jun 22 14:44:36 2024 +0200

    [CLI-336] Deprecation not always reported (#284)
    
    * added methods with OptionGroup args + tests
    
    * Updated OptionGroup documentation to indicate where deprecation is no 
reported
    
    * Added tests
    
    * added tests + cleaned up checkstyle
    
    * added more tests
---
 .../java/org/apache/commons/cli/CommandLine.java   | 133 +++-
 .../java/org/apache/commons/cli/OptionGroup.java   |   3 +
 .../org/apache/commons/cli/CommandLineTest.java    | 875 +++++++++++++++++----
 3 files changed, 856 insertions(+), 155 deletions(-)

diff --git a/src/main/java/org/apache/commons/cli/CommandLine.java 
b/src/main/java/org/apache/commons/cli/CommandLine.java
index fdf5e57..8ca7eb8 100644
--- a/src/main/java/org/apache/commons/cli/CommandLine.java
+++ b/src/main/java/org/apache/commons/cli/CommandLine.java
@@ -314,7 +314,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets the first argument, if any, of this option.
      *
-     * @param option the name of the option.
+     * @param option the option.
      * @return Value of the argument if option is set, and has an argument, 
otherwise null.
      * @since 1.5.0
      */
@@ -326,7 +326,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets the first argument, if any, of an option.
      *
-     * @param option name of the option.
+     * @param option the option.
      * @param defaultValue is the default value to be returned if the option 
is not specified.
      * @return Value of the argument if option is set, and has an argument, 
otherwise {@code defaultValue}.
      * @since 1.5.0
@@ -338,7 +338,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets the first argument, if any, of an option.
      *
-     * @param option name of the option.
+     * @param option the option.
      * @param defaultValue is a supplier for the default value to be returned 
if the option is not specified.
      * @return Value of the argument if option is set, and has an argument, 
otherwise {@code defaultValue}.
      * @since 1.7.0
@@ -348,6 +348,44 @@ public class CommandLine implements Serializable {
         return answer != null ? answer : get(defaultValue);
     }
 
+    /**
+     * Gets the first argument, if any, of this option group.
+     *
+     * @param optionGroup the option group.
+     * @return Value of the argument if option group is selected, and has an 
argument, otherwise null.
+     * @since 1.9.0
+     */
+    public String getOptionValue(final OptionGroup optionGroup) {
+        final String[] values = getOptionValues(optionGroup);
+        return values == null ? null : values[0];
+    }
+
+    /**
+     * Gets the first argument, if any, of an option group.
+     *
+     * @param optionGroup the option group.
+     * @param defaultValue is the default value to be returned if the option 
group is not selected.
+     * @return Value of the argument if option group is selected, and has an 
argument, otherwise {@code defaultValue}.
+     * @since 1.9.0
+     */
+    public String getOptionValue(final OptionGroup optionGroup, final String 
defaultValue) {
+        return getOptionValue(optionGroup, () -> defaultValue);
+    }
+
+    /**
+     * Gets the first argument, if any, of an option group.
+     *
+     * @param optionGroup the option group..
+     * @param defaultValue is a supplier for the default value to be returned 
if the option group is not selected.
+     * @return Value of the argument if option group is selected, and has an 
argument, otherwise {@code defaultValue}.
+     * @since 1.9.0
+     */
+    public String getOptionValue(final OptionGroup optionGroup, final 
Supplier<String> defaultValue) {
+        final String answer = getOptionValue(optionGroup);
+        return answer != null ? answer : get(defaultValue);
+    }
+
+
     /**
      * Gets the first argument, if any, of this option.
      *
@@ -395,7 +433,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets the array of values, if any, of an option.
      *
-     * @param option string name of the option.
+     * @param option the option.
      * @return Values of the argument if option is set, and has an argument, 
otherwise null.
      * @since 1.5.0
      */
@@ -403,18 +441,32 @@ public class CommandLine implements Serializable {
         if (option == null) {
             return null;
         }
-        if (option.isDeprecated()) {
-            handleDeprecated(option);
-        }
         final List<String> values = new ArrayList<>();
         for (final Option processedOption : options) {
             if (processedOption.equals(option)) {
+                if (option.isDeprecated()) {
+                    handleDeprecated(option);
+                }
                 values.addAll(processedOption.getValuesList());
             }
         }
         return values.isEmpty() ? null : 
values.toArray(Util.EMPTY_STRING_ARRAY);
     }
 
+    /**
+     * Gets the array of values, if any, of an option group.
+     *
+     * @param optionGroup the option group.
+     * @return Values of the argument if option group is selected, and has an 
argument, otherwise null.
+     * @since 1.9.0
+     */
+    public String[] getOptionValues(final OptionGroup optionGroup) {
+        if (optionGroup == null || !optionGroup.isSelected()) {
+            return null;
+        }
+        return getOptionValues(optionGroup.getSelected());
+    }
+
     /**
      * Gets the array of values, if any, of an option.
      *
@@ -472,7 +524,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets a version of this {@code Option} converted to a particular type.
      *
-     * @param option the name of the option.
+     * @param option the option.
      * @param <T> The return type for the method.
      * @return the value parsed into a particular object.
      * @throws ParseException if there are problems turning the option value 
into the desired type
@@ -486,7 +538,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets a version of this {@code Option} converted to a particular type.
      *
-     * @param option the name of the option.
+     * @param option the option.
      * @param defaultValue the default value to return if opt is not set.
      * @param <T> The return type for the method.
      * @return the value parsed into a particular object.
@@ -513,7 +565,7 @@ public class CommandLine implements Serializable {
     /**
      * Gets a version of this {@code Option} converted to a particular type.
      *
-     * @param option the name of the option.
+     * @param option the option.
      * @param defaultValue the default value to return if opt is not set.
      * @param <T> The return type for the method.
      * @return the value parsed into a particular object.
@@ -525,6 +577,53 @@ public class CommandLine implements Serializable {
         return getParsedOptionValue(option, () -> defaultValue);
     }
 
+    /**
+     * Gets a version of this {@code OptionGroup} converted to a particular 
type.
+     *
+     * @param optionGroup the option group.
+     * @param <T> The return type for the method.
+     * @return the value parsed into a particular object.
+     * @throws ParseException if there are problems turning the selected 
option value into the desired type
+     * @see PatternOptionBuilder
+     * @since 1.9.0
+     */
+    public <T> T getParsedOptionValue(final OptionGroup optionGroup) throws 
ParseException {
+        return getParsedOptionValue(optionGroup, () -> null);
+    }
+
+    /**
+     * Gets a version of this {@code OptionGroup} converted to a particular 
type.
+     *
+     * @param optionGroup the option group.
+     * @param defaultValue the default value to return if opt is not set.
+     * @param <T> The return type for the method.
+     * @return the value parsed into a particular object.
+     * @throws ParseException if there are problems turning the selected 
option value into the desired type
+     * @see PatternOptionBuilder
+     * @since 1.9.0
+     */
+    public <T> T getParsedOptionValue(final OptionGroup optionGroup, final 
Supplier<T> defaultValue) throws ParseException {
+        if (optionGroup == null || !optionGroup.isSelected()) {
+            return get(defaultValue);
+        }
+        return getParsedOptionValue(optionGroup.getSelected(), defaultValue);
+    }
+
+    /**
+     * Gets a version of this {@code OptionGroup} converted to a particular 
type.
+     *
+     * @param optionGroup the option group.
+     * @param defaultValue the default value to return if an option is not 
selected.
+     * @param <T> The return type for the method.
+     * @return the value parsed into a particular object.
+     * @throws ParseException if there are problems turning the option value 
into the desired type
+     * @see PatternOptionBuilder
+     * @since 1.9.0
+     */
+    public <T> T getParsedOptionValue(final OptionGroup optionGroup, final T 
defaultValue) throws ParseException {
+        return getParsedOptionValue(optionGroup, () -> defaultValue);
+    }
+
     /**
      * Gets a version of this {@code Option} converted to a particular type.
      *
@@ -623,6 +722,20 @@ public class CommandLine implements Serializable {
         return result;
     }
 
+    /**
+     * Tests to see if an option has been set.
+     *
+     * @param optionGroup the option group to check.
+     * @return true if set, false if not.
+     * @since 1.9.0
+     */
+    public boolean hasOption(final OptionGroup optionGroup) {
+        if (optionGroup == null || !optionGroup.isSelected()) {
+            return false;
+        }
+        return hasOption(optionGroup.getSelected());
+    }
+
     /**
      * Tests to see if an option has been set.
      *
diff --git a/src/main/java/org/apache/commons/cli/OptionGroup.java 
b/src/main/java/org/apache/commons/cli/OptionGroup.java
index 51f75e9..0685179 100644
--- a/src/main/java/org/apache/commons/cli/OptionGroup.java
+++ b/src/main/java/org/apache/commons/cli/OptionGroup.java
@@ -76,6 +76,7 @@ public class OptionGroup implements Serializable {
     /**
      * Gets the selected option name.
      *
+     * If the selected option is deprecated <em>no warning is logged</em>.
      * @return the selected option name.
      */
     public String getSelected() {
@@ -94,6 +95,7 @@ public class OptionGroup implements Serializable {
     /**
      * Tests whether an option is selected.
      *
+     *  If an option is selected and is deprecated <em>no warning is 
logged</em>.
      * @return whether whether an option is selected.
      * @since 1.9.0
      */
@@ -113,6 +115,7 @@ public class OptionGroup implements Serializable {
     /**
      * Sets the selected option of this group to {@code name}.
      *
+     * If the selected option is deprecated <em>no warning is logged</em>.
      * @param option the option that is selected
      * @throws AlreadySelectedException if an option from this group has 
already been selected.
      */
diff --git a/src/test/java/org/apache/commons/cli/CommandLineTest.java 
b/src/test/java/org/apache/commons/cli/CommandLineTest.java
index f0fe20f..f0edf21 100644
--- a/src/test/java/org/apache/commons/cli/CommandLineTest.java
+++ b/src/test/java/org/apache/commons/cli/CommandLineTest.java
@@ -17,22 +17,30 @@
 
 package org.apache.commons.cli;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
+import java.util.stream.Stream;
 
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
-@SuppressWarnings("deprecation") // tests some deprecated classes
 public class CommandLineTest {
 
+    private enum Count { ONE, TWO, THREE };
+
     @Test
     public void testBuilder() {
         final CommandLine.Builder builder = new CommandLine.Builder();
@@ -70,93 +78,13 @@ public class CommandLineTest {
         assertEquals(0, cmd.getOptions().length);
     }
 
-    @Test
-    public void testDeprecatedDefaultOption() {
-        final CommandLine.Builder builder = new CommandLine.Builder();
-        builder.addArg("foo").addArg("bar");
-        final Option opt = Option.builder().option("T").deprecated().build();
-        builder.addOption(opt);
-        final AtomicReference<Option> handler = new AtomicReference<>();
-        final CommandLine cmd = builder.build();
-        cmd.getOptionValue(opt.getOpt());
-        handler.set(null);
-        cmd.getOptionValue("Nope");
-        assertNull(handler.get());
-    }
-
-    @Test
-    public void testDeprecatedOption() {
-        final CommandLine.Builder builder = new CommandLine.Builder();
-        builder.addArg("foo").addArg("bar");
-        final Option opt = 
Option.builder().option("T").longOpt("tee").deprecated().build();
-        builder.addOption(opt);
-        // verify one and only one call
-        final List<Option> handler = new ArrayList<>();
-        final CommandLine cmd = 
builder.setDeprecatedHandler(handler::add).build();
-        // test short option arg
-        cmd.getOptionValue(opt.getOpt());
-        assertEquals(1, handler.size());
-        assertSame(opt, handler.get(0));
-        handler.clear();
-
-        // test long option arg
-        cmd.getOptionValue(opt.getLongOpt());
-        assertEquals(1, handler.size());
-        assertSame(opt, handler.get(0));
-        handler.clear();
-
-        // test Option arg
-        cmd.getOptionValue(opt);
-        assertEquals(1, handler.size());
-        assertSame(opt, handler.get(0));
-        handler.clear();
-
-        // test not an option
-        cmd.getOptionValue("Nope");
-        assertEquals(0, handler.size());
-    }
-
-    @Test
-    public void testDeprecatedParsedOptionValue() throws ParseException {
-        final CommandLine.Builder builder = new CommandLine.Builder();
-        builder.addArg("foo").addArg("bar");
-        final Option opt = 
Option.builder().option("T").longOpt("tee").deprecated().build();
-        builder.addOption(opt);
-        // verify one and only one call
-        final List<Option> handler = new ArrayList<>();
-        final CommandLine cmd = 
builder.setDeprecatedHandler(handler::add).build();
-
-        // test short option arg
-        cmd.getParsedOptionValue(opt.getOpt());
-        assertEquals(1, handler.size());
-        assertSame(opt, handler.get(0));
-        handler.clear();
-
-        // test long option arg
-        cmd.getParsedOptionValue(opt.getLongOpt());
-        assertEquals(1, handler.size());
-        assertSame(opt, handler.get(0));
-        handler.clear();
-
-        // test option arg
-        cmd.getParsedOptionValue(opt);
-        assertEquals(1, handler.size());
-        assertSame(opt, handler.get(0));
-        handler.clear();
-
-
-        // test not an option
-        cmd.getParsedOptionValue("Nope");
-        assertEquals(0, handler.size());
-    }
-
     @Test
     public void testGetOptionProperties() throws Exception {
         final String[] args = {"-Dparam1=value1", "-Dparam2=value2", 
"-Dparam3", "-Dparam4=value4", "-D", "--property", "foo=bar"};
 
         final Options options = new Options();
-        
options.addOption(OptionBuilder.withValueSeparator().hasOptionalArgs(2).create('D'));
-        
options.addOption(OptionBuilder.withValueSeparator().hasArgs(2).withLongOpt("property").create());
+        
options.addOption(Option.builder("D").valueSeparator().optionalArg(true).numberOfArgs(2).build());
+        
options.addOption(Option.builder().valueSeparator().numberOfArgs(2).longOpt("property").build());
 
         final Parser parser = new GnuParser();
         final CommandLine cl = parser.parse(options, args);
@@ -177,8 +105,8 @@ public class CommandLineTest {
         final String[] args = {"-Dparam1=value1", "-Dparam2=value2", 
"-Dparam3", "-Dparam4=value4", "-D", "--property", "foo=bar"};
 
         final Options options = new Options();
-        final Option optionD = 
OptionBuilder.withValueSeparator().hasOptionalArgs(2).create('D');
-        final Option optionProperty = 
OptionBuilder.withValueSeparator().hasArgs(2).withLongOpt("property").create();
+        final Option optionD = 
Option.builder("D").valueSeparator().numberOfArgs(2).optionalArg(true).build();
+        final Option optionProperty = 
Option.builder().valueSeparator().numberOfArgs(2).longOpt("property").build();
         options.addOption(optionD);
         options.addOption(optionProperty);
 
@@ -225,89 +153,746 @@ public class CommandLineTest {
     }
 
     @Test
-    public void testGetParsedOptionValue() throws Exception {
+    public void testBadGetParsedOptionValue() throws Exception {
+
         final Options options = new Options();
-        
options.addOption(OptionBuilder.hasArg().withType(Number.class).create("i"));
-        options.addOption(OptionBuilder.hasArg().create("f"));
+        
options.addOption(Option.builder("i").hasArg().type(Number.class).build());
+        options.addOption(Option.builder("c").hasArg().converter(s -> 
Count.valueOf(s.toUpperCase())).build());
+
 
         final CommandLineParser parser = new DefaultParser();
-        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"123", "-f", "foo"});
+        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"foo", "-c", "bar"});
 
-        assertEquals(123, ((Number) cmd.getParsedOptionValue("i")).intValue());
-        assertEquals("foo", cmd.getParsedOptionValue("f"));
+        assertEquals(NumberFormatException.class, 
assertThrows(ParseException.class, () -> 
cmd.getParsedOptionValue("i")).getCause().getClass());
+        assertEquals(IllegalArgumentException.class, 
assertThrows(ParseException.class, () -> 
cmd.getParsedOptionValue("c")).getCause().getClass());
     }
 
     @Test
-    public void testGetParsedOptionValueUsingDefault() throws Exception {
+    public void testNullOption() throws Exception {
         final Options options = new Options();
         final Option optI = 
Option.builder("i").hasArg().type(Number.class).build();
         final Option optF = Option.builder("f").hasArg().build();
         options.addOption(optI);
         options.addOption(optF);
-
         final CommandLineParser parser = new DefaultParser();
-        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"123"});
+        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"123", "-f", "foo"});
+        assertNull(cmd.getOptionValue((Option) null));
+        assertNull(cmd.getParsedOptionValue((Option) null));
+        assertNull(cmd.getOptionValue((OptionGroup) null));
+        assertNull(cmd.getParsedOptionValue((OptionGroup) null));
+    }
+
+    private void assertWritten(final boolean optDep, final 
ByteArrayOutputStream baos) {
+        System.out.flush();
+        if (optDep) {
+            assertEquals("Option 'T''tee': Deprecated", 
baos.toString().trim());
+        } else {
+            assertEquals("", baos.toString());
+        }
+        baos.reset();
+    }
+
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createOptionValueParameters")
+    public void noDeprecationHandlerTest(final String[] args, final Option 
opt, final OptionGroup optionGroup, final boolean optDep,
+                                   final String optValue, final boolean 
grpDep, final String grpValue, final Option grpOpt) throws ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final CommandLine commandLine = 
DefaultParser.builder().build().parse(options, args);
+        final Supplier<String> thinger = () -> {
+            return "thing";
+        };
         final Supplier<String> nullSupplier = null;
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream ps = System.out;
+        try {
+            System.setOut(new PrintStream(baos));
+
+            OptionGroup otherGroup = new 
OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
+                    
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
+            OptionGroup nullGroup = null;
+
+            // test char option
+            assertEquals(optValue, commandLine.getOptionValue(asChar(opt)));
+            assertWritten(optDep, baos);
 
-        assertEquals(123, ((Number) 
cmd.getParsedOptionValue(optI)).intValue());
-        assertEquals("foo", cmd.getParsedOptionValue(optF, "foo"));
-        assertEquals("foo", cmd.getParsedOptionValue(optF, () -> "foo"));
-        assertNull(cmd.getParsedOptionValue(optF, null));
-        assertNull(cmd.getParsedOptionValue(optF, nullSupplier));
-        assertNull(cmd.getParsedOptionValue(optF, () -> null));
-
-        assertEquals("foo", cmd.getParsedOptionValue("f", "foo"));
-        assertEquals("foo", cmd.getParsedOptionValue("f", () -> "foo"));
-        assertNull(cmd.getParsedOptionValue("f", null));
-        assertNull(cmd.getParsedOptionValue("f", nullSupplier));
-        assertNull(cmd.getParsedOptionValue("f", () -> null));
-
-        assertEquals("foo", cmd.getParsedOptionValue('f', "foo"));
-        assertEquals("foo", cmd.getParsedOptionValue('f', () -> "foo"));
-        assertNull(cmd.getParsedOptionValue('f', null));
-        assertNull(cmd.getParsedOptionValue('f', nullSupplier));
-        assertNull(cmd.getParsedOptionValue('f', () -> null));
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(asChar(opt), "thing"));
+            assertWritten(optDep, baos);
 
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(asChar(opt), thinger));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue, commandLine.getOptionValue(asChar(opt), 
nullSupplier));
+            assertWritten(optDep, baos);
+
+            // test short option arg
+            assertEquals(optValue, commandLine.getOptionValue(opt.getOpt()));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getOpt(), "thing"));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getOpt(), thinger));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue, commandLine.getOptionValue(opt.getOpt(), 
nullSupplier));
+            assertWritten(optDep, baos);
+
+            // test long option arg
+            assertEquals(optValue, 
commandLine.getOptionValue(opt.getLongOpt()));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getLongOpt(), "thing"));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getLongOpt(), thinger));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue, 
commandLine.getOptionValue(opt.getLongOpt(), nullSupplier));
+            assertWritten(optDep, baos);
+
+            // test Option arg
+            assertEquals(optValue, commandLine.getOptionValue(opt));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt, "thing"));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt, thinger));
+            assertWritten(optDep, baos);
+
+            assertEquals(optValue, commandLine.getOptionValue(opt, 
nullSupplier));
+            assertWritten(optDep, baos);
+
+            // test optionGroup  arg
+            assertEquals(grpValue, commandLine.getOptionValue(optionGroup));
+            assertWritten(grpDep, baos);
+
+            assertEquals(grpValue == null ? "thing" : grpValue, 
commandLine.getOptionValue(optionGroup, "thing"));
+            assertWritten(grpDep, baos);
+
+            assertEquals(grpValue == null ? "thing" : grpValue, 
commandLine.getOptionValue(optionGroup, thinger));
+            assertWritten(grpDep, baos);
+
+            assertEquals(grpValue, commandLine.getOptionValue(optionGroup, 
nullSupplier));
+            assertWritten(grpDep, baos);
+
+            // test other group arg
+            assertNull(commandLine.getOptionValue(otherGroup));
+            assertWritten(false, baos);
+
+            assertEquals("thing", commandLine.getOptionValue(otherGroup, 
"thing"));
+            assertWritten(false, baos);
+
+            assertEquals("thing", commandLine.getOptionValue(otherGroup, 
thinger));
+            assertWritten(false, baos);
+
+            assertNull(commandLine.getOptionValue(otherGroup, nullSupplier));
+            assertWritten(false, baos);
+
+            // test null Group arg
+            assertNull(commandLine.getOptionValue(nullGroup));
+            assertWritten(false, baos);
+
+            assertEquals("thing", commandLine.getOptionValue(nullGroup, 
"thing"));
+            assertWritten(false, baos);
+
+            assertEquals("thing", commandLine.getOptionValue(nullGroup, 
thinger));
+            assertWritten(false, baos);
+
+            assertNull(commandLine.getOptionValue(nullGroup, nullSupplier));
+            assertWritten(false, baos);
+
+            // test not an option
+            assertNull(commandLine.getOptionValue("Nope"));
+            assertWritten(false, baos);
+
+            assertEquals("thing", commandLine.getOptionValue("Nope", "thing"));
+            assertWritten(false, baos);
+
+            assertEquals("thing", commandLine.getOptionValue("Nope", thinger));
+            assertWritten(false, baos);
+
+            assertNull(commandLine.getOptionValue("Nope", nullSupplier));
+            assertWritten(false, baos);
+        } finally {
+            System.setOut(ps);
+        }
     }
 
-    @Test
-    public void testGetParsedOptionValueWithChar() throws Exception {
-        final Options options = new Options();
-        
options.addOption(Option.builder("i").hasArg().type(Number.class).build());
-        options.addOption(Option.builder("f").hasArg().build());
+    /**
+     * verifies that the deprecation handler has been called only once or not 
at all.
+     * @param optDep {@code true} if the dependency should have been logged.
+     * @param handler The list that the deprecation is logged to.
+     * @param opt The option that triggered the logging. May be (@code null} 
if {@code optDep} is {@code false}.
+     */
+    void checkHandler(final boolean optDep, final List<Option> handler, final 
Option opt) {
+        if (optDep) {
+            assertEquals(1, handler.size());
+            assertEquals(opt, handler.get(0));
+        } else {
+            assertEquals(0, handler.size());
+        }
+        handler.clear();
+    }
 
-        final CommandLineParser parser = new DefaultParser();
-        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"123", "-f", "foo"});
+    char asChar(final Option opt) {
+        return opt.getOpt().charAt(0);
+    }
+
+    /**
+     * Test for get option value with and without default values.  Verifies 
that deprecated options only report as
+     * deprecated once.
+     * @param args the argument strings to parse.
+     * @param opt the option to check for values with.
+     * @param optionGroup the option group to check for values with.
+     * @param optDep {@code true} if the opt is deprecated.
+     * @param optValue  The value expected from opt.
+     * @param grpDep {@code true} if the group is deprecated.
+     * @param grpValue the value expected from the group.
+     * @param grpOpt the option that is expected to be processed by the group.
+     * @throws ParseException on parse error.
+     */
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createOptionValueParameters")
+    public void getOptionValueTest(final String[] args, final Option opt, 
final OptionGroup optionGroup, final boolean optDep,
+                                   final String optValue, final boolean 
grpDep, final String grpValue, final Option grpOpt) throws ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final List<Option> handler = new ArrayList<>();
+        final CommandLine commandLine = 
DefaultParser.builder().setDeprecatedHandler(handler::add).build().parse(options,
 args);
+        final Supplier<String> thinger = () -> {
+            return "thing";
+        };
+        OptionGroup otherGroup = new 
OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
+                
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
+        OptionGroup nullGroup = null;
+
+        // test char option
+        assertEquals(optValue, commandLine.getOptionValue(asChar(opt)));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(asChar(opt), "thing"));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(asChar(opt), thinger));
+        checkHandler(optDep, handler, opt);
+
+        // test short option arg
+        assertEquals(optValue, commandLine.getOptionValue(opt.getOpt()));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getOpt(), "thing"));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getOpt(), thinger));
+        checkHandler(optDep, handler, opt);
+
+        // test long option arg
+        assertEquals(optValue, commandLine.getOptionValue(opt.getLongOpt()));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getLongOpt(), "thing"));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt.getLongOpt(), thinger));
+        checkHandler(optDep, handler, opt);
+
+        // test Option arg
+        assertEquals(optValue, commandLine.getOptionValue(opt));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt, "thing"));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? "thing" : optValue, 
commandLine.getOptionValue(opt, thinger));
+        checkHandler(optDep, handler, opt);
 
-        assertEquals(123, ((Number) cmd.getParsedOptionValue('i')).intValue());
-        assertEquals("foo", cmd.getParsedOptionValue('f'));
+        // test option group  arg
+        assertEquals(grpValue, commandLine.getOptionValue(optionGroup));
+        checkHandler(grpDep, handler, grpOpt);
+
+        assertEquals(grpValue == null ? "thing" : grpValue, 
commandLine.getOptionValue(optionGroup, "thing"));
+        checkHandler(grpDep, handler, grpOpt);
+
+        assertEquals(grpValue == null ? "thing" : grpValue, 
commandLine.getOptionValue(optionGroup, thinger));
+        checkHandler(grpDep, handler, grpOpt);
+
+        // test other group arg
+        assertNull(commandLine.getOptionValue(otherGroup));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals("thing", commandLine.getOptionValue(otherGroup, "thing"));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals("thing", commandLine.getOptionValue(otherGroup, thinger));
+        checkHandler(false, handler, grpOpt);
+
+        // test null Group arg
+        assertNull(commandLine.getOptionValue(nullGroup));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals("thing", commandLine.getOptionValue(nullGroup, "thing"));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals("thing", commandLine.getOptionValue(nullGroup, thinger));
+        checkHandler(false, handler, grpOpt);
+
+        // test not an option
+        assertNull(commandLine.getOptionValue("Nope"));
+        checkHandler(false, handler, opt);
+
+        assertEquals("thing", commandLine.getOptionValue("Nope", "thing"));
+        checkHandler(false, handler, opt);
+
+        assertEquals("thing", commandLine.getOptionValue("Nope", thinger));
+        checkHandler(false, handler, opt);
     }
 
-    @Test
-    public void testGetParsedOptionValueWithOption() throws Exception {
-        final Options options = new Options();
-        final Option optI = 
Option.builder("i").hasArg().type(Number.class).build();
-        final Option optF = Option.builder("f").hasArg().build();
-        options.addOption(optI);
-        options.addOption(optF);
+    private static Stream<Arguments> createOptionValueParameters() throws 
ParseException {
+        List<Arguments> lst = new ArrayList<>();
+        final Option optT = 
Option.builder().option("T").longOpt("tee").deprecated().optionalArg(true).build();
+        final Option optU = 
Option.builder("U").longOpt("you").optionalArg(true).build();
+        OptionGroup optionGroup = new 
OptionGroup().addOption(optT).addOption(optU);
 
-        final CommandLineParser parser = new DefaultParser();
-        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"123", "-f", "foo"});
+        // T set
+        lst.add(Arguments.of(new String[] {"-T"}, optT, optionGroup, true, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"-T", "foo"}, optT, optionGroup, 
true, "foo", true, "foo", optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optT, optionGroup, true, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "foo"}, optT, optionGroup, 
true, "foo", true, "foo", optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optT, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"-U", "foo"}, optT, optionGroup, 
false, null, false, "foo", optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optT, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"--you", "foo"}, optT, optionGroup, 
false, null, false, "foo", optU));
 
-        assertEquals(123, ((Number) 
cmd.getParsedOptionValue(optI)).intValue());
-        assertEquals("foo", cmd.getParsedOptionValue(optF));
+
+        // U set
+        lst.add(Arguments.of(new String[] {"-T"}, optU, optionGroup, false, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"-T", "foo"}, optU, optionGroup, 
false, null, true, "foo", optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optU, optionGroup, false, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "foo"}, optU, optionGroup, 
false, null, true, "foo", optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optU, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"-U", "foo"}, optU, optionGroup, 
false, "foo", false, "foo", optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optU, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"--you", "foo"},  optU, 
optionGroup, false, "foo", false, "foo", optU));
+
+        return lst.stream();
     }
 
-    @Test
-    public void testNullOption() throws Exception {
-        final Options options = new Options();
-        final Option optI = 
Option.builder("i").hasArg().type(Number.class).build();
-        final Option optF = Option.builder("f").hasArg().build();
-        options.addOption(optI);
-        options.addOption(optF);
-        final CommandLineParser parser = new DefaultParser();
-        final CommandLine cmd = parser.parse(options, new String[] {"-i", 
"123", "-f", "foo"});
-        assertNull(cmd.getOptionValue((Option) null));
-        assertNull(cmd.getParsedOptionValue((Option) null));
+
+    /**
+     * Test for get option values with and without default values.  Verifies 
that deprecated options only report as
+     * deprecated once.
+     * @param args the argument strings to parse.
+     * @param opt the option to check for values with.
+     * @param optionGroup the option group to check for values with.
+     * @param optDep {@code true} if the opt is deprecated.
+     * @param optValue  The value expected from opt.
+     * @param grpDep {@code true} if the group is deprecated.
+     * @param grpValue the value expected from the group.
+     * @param grpOpt the option that is expected to be processed by the group.
+     * @throws ParseException on parse error.
+     */
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createOptionValuesParameters")
+    public void getOptionValuesTest(final String[] args, final Option opt, 
final OptionGroup optionGroup, final boolean optDep,
+                                    final String[] optValue, final boolean 
grpDep, final String[] grpValue, final Option grpOpt) throws ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final List<Option> handler = new ArrayList<>();
+        final CommandLine commandLine = 
DefaultParser.builder().setDeprecatedHandler(handler::add).build().parse(options,
 args);
+        OptionGroup otherGroup = new 
OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
+                
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
+        OptionGroup nullGroup = null;
+
+        // test char option arg
+        assertArrayEquals(optValue, commandLine.getOptionValues(asChar(opt)));
+        checkHandler(optDep, handler, opt);
+
+        // test short option arg
+        assertArrayEquals(optValue, commandLine.getOptionValues(opt.getOpt()));
+        checkHandler(optDep, handler, opt);
+
+        // test long option arg
+        assertArrayEquals(optValue, 
commandLine.getOptionValues(opt.getLongOpt()));
+        checkHandler(optDep, handler, opt);
+
+        // test Option arg
+        assertArrayEquals(optValue, commandLine.getOptionValues(opt));
+        checkHandler(optDep, handler, opt);
+
+
+        // test OptionGroup arg
+        assertArrayEquals(grpValue, commandLine.getOptionValues(optionGroup));
+        checkHandler(grpDep, handler, grpOpt);
+
+        // test not an option
+        assertNull(commandLine.getOptionValues("Nope"));
+        checkHandler(false, handler, opt);
+
+        // test other group arg
+        assertNull(commandLine.getOptionValues(otherGroup));
+        checkHandler(false, handler, grpOpt);
+
+        // test null group arg
+        assertNull(commandLine.getOptionValues(nullGroup));
+        checkHandler(false, handler, grpOpt);
+    }
+
+    private static Stream<Arguments> createOptionValuesParameters() throws 
ParseException {
+        List<Arguments> lst = new ArrayList<>();
+        final Option optT = 
Option.builder().option("T").longOpt("tee").numberOfArgs(2).deprecated().optionalArg(true).build();
+        final Option optU = 
Option.builder("U").longOpt("you").numberOfArgs(2).optionalArg(true).build();
+        final OptionGroup optionGroup = new 
OptionGroup().addOption(optT).addOption(optU);
+
+        String[] foobar = { "foo", "bar" };
+        // T set
+        lst.add(Arguments.of(new String[] {"-T"}, optT, optionGroup, true, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"-T", "foo", "bar"}, optT, 
optionGroup, true, foobar, true, foobar, optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optT, optionGroup, true, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "foo", "bar"}, optT, 
optionGroup, true, foobar, true, foobar, optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optT, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"-U", "foo", "bar"}, optT, 
optionGroup, false, null, false, foobar, optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optT, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"--you", "foo", "bar"}, optT, 
optionGroup, false, null, false, foobar, optU));
+
+
+        // U set
+        lst.add(Arguments.of(new String[] {"-T"}, optU, optionGroup, false, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"-T", "foo", "bar"}, optU, 
optionGroup, false, null, true, foobar, optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optU, optionGroup, false, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "foo", "bar"}, optU, 
optionGroup, false, null, true, foobar, optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optU, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"-U", "foo", "bar"}, optU, 
optionGroup, false, foobar, false, foobar, optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optU, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"--you", "foo", "bar"},  optU, 
optionGroup, false, foobar, false, foobar, optU));
+
+        return lst.stream();
+    }
+
+    /**
+     * Tests the hasOption calls.
+     * @param args the argument strings to parse.
+     * @param opt the option to check for values with.
+     * @param optionGroup the option group to check for values with.
+     * @param optDep {@code true} if the opt is deprecated.
+     * @param has {@code true} if the opt is present.
+     * @param grpDep {@code true} if the group is deprecated.
+     * @param hasGrp {@code true} if the group is present.
+     * @param grpOpt the option that is expected to be processed by the group.
+     * @throws ParseException on parsing error.
+     */
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createHasOptionParameters")
+    public void hasOptionTest(final String[] args, final Option opt, final 
OptionGroup optionGroup, final boolean optDep,
+                              final boolean has, final boolean grpDep, final 
boolean hasGrp, final Option grpOpt) throws ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final List<Option> handler = new ArrayList<>();
+        final CommandLine commandLine = 
DefaultParser.builder().setDeprecatedHandler(handler::add).build().parse(options,
 args);
+        final OptionGroup otherGroup = new 
OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
+                
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
+        final OptionGroup nullGroup = null;
+
+        // test char option arg
+        assertEquals(has, commandLine.hasOption(asChar(opt)));
+        checkHandler(optDep, handler, opt);
+
+        // test short option arg
+        assertEquals(has, commandLine.hasOption(opt.getOpt()));
+        checkHandler(optDep, handler, opt);
+
+        // test long option arg
+        assertEquals(has, commandLine.hasOption(opt.getLongOpt()));
+        checkHandler(optDep, handler, opt);
+
+        // test Option arg
+        assertEquals(has, commandLine.hasOption(opt));
+        checkHandler(optDep, handler, opt);
+
+        // test OptionGroup arg
+        assertEquals(hasGrp, commandLine.hasOption(optionGroup));
+        checkHandler(grpDep, handler, grpOpt);
+
+        // test other group arg
+        assertFalse(commandLine.hasOption(otherGroup));
+        checkHandler(false, handler, grpOpt);
+
+
+        // test null group arg
+        assertFalse(commandLine.hasOption(nullGroup));
+        checkHandler(false, handler, grpOpt);
+
+        // test not an option
+        assertFalse(commandLine.hasOption("Nope"));
+        checkHandler(false, handler, opt);
+    }
+
+    /**
+     * Tests the hasOption calls.
+     * @param args the argument strings to parse.
+     * @param opt the option to check for values with.
+     * @param optionGroup the option group to check for values with.
+     * @param optDep {@code true} if the opt is deprecated.
+     * @param has {@code true} if the opt is present.
+     * @param grpDep {@code true} if the group is deprecated.
+     * @param hasGrp {@code true} if the group is present.
+     * @param grpOpt the option that is expected to be processed by the group.
+     * @throws ParseException on parsing error.
+     */
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createHasOptionParameters")
+    public void hasOptionNoDeprecationHandlerTest(final String[] args, final 
Option opt, final OptionGroup optionGroup, final boolean optDep,
+                              final boolean has, final boolean grpDep, final 
boolean hasGrp, final Option grpOpt) throws ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final CommandLine commandLine = 
DefaultParser.builder().build().parse(options, args);
+        PrintStream ps = System.out;
+        try {
+            System.setOut(new PrintStream(baos));
+
+            // test char option arg
+            assertEquals(has, commandLine.hasOption(asChar(opt)));
+            assertWritten(optDep, baos);
+
+
+            // test short option arg
+            assertEquals(has, commandLine.hasOption(opt.getOpt()));
+            assertWritten(optDep, baos);
+
+            // test long option arg
+            assertEquals(has, commandLine.hasOption(opt.getLongOpt()));
+            assertWritten(optDep, baos);
+
+            // test Option arg
+            assertEquals(has, commandLine.hasOption(opt));
+            assertWritten(optDep, baos);
+
+            // test OptionGroup arg
+            assertEquals(hasGrp, commandLine.hasOption(optionGroup));
+            assertWritten(grpDep, baos);
+
+            // test not an option
+            assertFalse(commandLine.hasOption("Nope"));
+            assertWritten(false, baos);
+        } finally {
+            System.setOut(ps);
+        }
+    }
+
+    /**
+     * Tests the hasOption calls.
+     * @param args the argument strings to parse.
+     * @param opt the option to check for values with.
+     * @param optionGroup the option group to check for values with.
+     * @param optDep {@code true} if the opt is deprecated.
+     * @param has {@code true} if the opt is present.
+     * @param grpDep {@code true} if the group is deprecated.
+     * @param hasGrp {@code true} if the group is present.
+     * @param grpOpt the option that is expected to be processed by the group.
+     * @throws ParseException on parsing error.
+     */
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createHasOptionParameters")
+    public void hasOptionNullDeprecationHandlerTest(final String[] args, final 
Option opt, final OptionGroup optionGroup, final boolean optDep,
+                                                  final boolean has, final 
boolean grpDep, final boolean hasGrp, final Option grpOpt) throws 
ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final CommandLine commandLine = 
DefaultParser.builder().setDeprecatedHandler(null).build().parse(options, args);
+        PrintStream ps = System.out;
+        try {
+            System.setOut(new PrintStream(baos));
+
+            // test char option arg
+            assertEquals(has, commandLine.hasOption(asChar(opt)));
+            assertWritten(false, baos);
+
+
+            // test short option arg
+            assertEquals(has, commandLine.hasOption(opt.getOpt()));
+            assertWritten(false, baos);
+
+            // test long option arg
+            assertEquals(has, commandLine.hasOption(opt.getLongOpt()));
+            assertWritten(false, baos);
+
+            // test Option arg
+            assertEquals(has, commandLine.hasOption(opt));
+            assertWritten(false, baos);
+
+            // test OptionGroup arg
+            assertEquals(hasGrp, commandLine.hasOption(optionGroup));
+            assertWritten(false, baos);
+
+            // test not an option
+            assertFalse(commandLine.hasOption("Nope"));
+            assertWritten(false, baos);
+        } finally {
+            System.setOut(ps);
+        }
+    }
+
+    private static Stream<Arguments> createHasOptionParameters() throws 
ParseException {
+        List<Arguments> lst = new ArrayList<>();
+        final Option optT = 
Option.builder().option("T").longOpt("tee").deprecated().optionalArg(true).build();
+        final Option optU = 
Option.builder("U").longOpt("you").optionalArg(true).build();
+        final OptionGroup optionGroup = new 
OptionGroup().addOption(optT).addOption(optU);
+
+        String[] foobar = { "foo", "bar" };
+        // T set
+        lst.add(Arguments.of(new String[] {"-T"}, optT, optionGroup, true, 
true, true, true, optT));
+        lst.add(Arguments.of(new String[] {"-T", "foo"}, optT, optionGroup, 
true, true, true, true, optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optT, optionGroup, true, 
true, true, true, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "foo"}, optT, optionGroup, 
true, true, true, true, optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optT, optionGroup, false, 
false, false, true, optU));
+        lst.add(Arguments.of(new String[] {"-U", "foo", "bar"}, optT, 
optionGroup, false, false, false, true, optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optT, optionGroup, false, 
false, false, true, optU));
+        lst.add(Arguments.of(new String[] {"--you", "foo", "bar"}, optT, 
optionGroup, false, false, false, true, optU));
+
+
+        // U set
+        lst.add(Arguments.of(new String[] {"-T"}, optU, optionGroup, false, 
false, true, true, optT));
+        lst.add(Arguments.of(new String[] {"-T", "foo", "bar"}, optU, 
optionGroup, false, false, true, true, optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optU, optionGroup, false, 
false, true, true, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "foo", "bar"}, optU, 
optionGroup, false, false, true, true, optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optU, optionGroup, false, 
true, false, true, optU));
+        lst.add(Arguments.of(new String[] {"-U", "foo", "bar"}, optU, 
optionGroup, false, true, false, true, optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optU, optionGroup, false, 
true, false, true, optU));
+        lst.add(Arguments.of(new String[] {"--you", "foo", "bar"},  optU, 
optionGroup, false, true, false, true, optU));
+
+        return lst.stream();
+    }
+
+    @ParameterizedTest(name = "{0}, {1}")
+    @MethodSource("createParsedOptionValueParameters")
+    public void getParsedOptionValueTest(final String[] args, final Option 
opt, final OptionGroup optionGroup, final boolean optDep,
+                                         final Integer optValue, final boolean 
grpDep, final Integer grpValue, final Option grpOpt) throws ParseException {
+        final Options options = new Options().addOptionGroup(optionGroup);
+        final List<Option> handler = new ArrayList<>();
+        final CommandLine commandLine = 
DefaultParser.builder().setDeprecatedHandler(handler::add).build().parse(options,
 args);
+        final Supplier<Integer> thinger = () -> {
+            return 2;
+        };
+        OptionGroup otherGroup = new 
OptionGroup().addOption(Option.builder("o").longOpt("other").hasArg().build())
+                
.addOption(Option.builder().option("p").longOpt("part").hasArg().build());
+        OptionGroup nullGroup = null;
+        Integer thing = 2;
+
+        // test char option arg
+        assertEquals(optValue, commandLine.getParsedOptionValue(asChar(opt)));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(asChar(opt), thing));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(asChar(opt), thinger));
+        checkHandler(optDep, handler, opt);
+
+        // test short option arg
+        assertEquals(optValue, commandLine.getParsedOptionValue(opt.getOpt()));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(opt.getOpt(), thing));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(opt.getOpt(), thinger));
+        checkHandler(optDep, handler, opt);
+
+        // test long option arg
+        assertEquals(optValue, 
commandLine.getParsedOptionValue(opt.getLongOpt()));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(opt.getLongOpt(), thing));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(opt.getLongOpt(), thinger));
+        checkHandler(optDep, handler, opt);
+
+
+        // test Option arg
+        assertEquals(optValue, commandLine.getParsedOptionValue(opt));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(opt, thing));
+        checkHandler(optDep, handler, opt);
+
+        assertEquals(optValue == null ? thing : optValue, 
commandLine.getParsedOptionValue(opt, thinger));
+        checkHandler(optDep, handler, opt);
+
+        // test OptionGroup arg
+        assertEquals(grpValue, commandLine.getParsedOptionValue(optionGroup));
+        checkHandler(grpDep, handler, grpOpt);
+
+        assertEquals(grpValue == null ? thing : grpValue, 
commandLine.getParsedOptionValue(optionGroup, thing));
+        checkHandler(grpDep, handler, grpOpt);
+
+        assertEquals(grpValue == null ? thing : grpValue, 
commandLine.getParsedOptionValue(optionGroup, thinger));
+        checkHandler(grpDep, handler, grpOpt);
+
+        // test other Group arg
+        assertNull(commandLine.getParsedOptionValue(otherGroup));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals(thing, commandLine.getParsedOptionValue(otherGroup, 
thing));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals(thing, commandLine.getParsedOptionValue(otherGroup, 
thinger));
+        checkHandler(false, handler, grpOpt);
+
+        // test null Group arg
+        assertNull(commandLine.getParsedOptionValue(nullGroup));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals(thing, commandLine.getParsedOptionValue(nullGroup, 
thing));
+        checkHandler(false, handler, grpOpt);
+
+        assertEquals(thing, commandLine.getParsedOptionValue(nullGroup, 
thinger));
+        checkHandler(false, handler, grpOpt);
+
+
+        // test not an option
+        assertNull(commandLine.getParsedOptionValue("Nope"));
+        checkHandler(false, handler, opt);
+
+        assertEquals(thing, commandLine.getParsedOptionValue("Nope", thing));
+        checkHandler(false, handler, opt);
+
+        assertEquals(thing, commandLine.getParsedOptionValue("Nope", thinger));
+        checkHandler(false, handler, opt);
+    }
+
+    private static Stream<Arguments> createParsedOptionValueParameters() 
throws ParseException {
+        List<Arguments> lst = new ArrayList<>();
+        Option optT = 
Option.builder().option("T").longOpt("tee").deprecated().type(Integer.class).optionalArg(true).build();
+        Option optU = 
Option.builder("U").longOpt("you").type(Integer.class).optionalArg(true).build();
+        OptionGroup optionGroup = new 
OptionGroup().addOption(optT).addOption(optU);
+        Integer expected = Integer.valueOf(1);
+
+        // T set
+        lst.add(Arguments.of(new String[] {"-T"}, optT, optionGroup, true, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"-T", "1"}, optT, optionGroup, 
true, expected, true, expected, optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optT, optionGroup, true, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "1"}, optT, optionGroup, 
true, expected, true, expected, optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optT, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"-U", "1"}, optT, optionGroup, 
false, null, false, expected, optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optT, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"--you", "1"}, optT, optionGroup, 
false, null, false, expected, optU));
+
+
+        // U set
+        lst.add(Arguments.of(new String[] {"-T"}, optU, optionGroup, false, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"-T", "1"}, optU, optionGroup, 
false, null, true, expected, optT));
+        lst.add(Arguments.of(new String[] {"--tee"}, optU, optionGroup, false, 
null, true, null, optT));
+        lst.add(Arguments.of(new String[] {"--tee", "1"}, optU, optionGroup, 
false, null, true, expected, optT));
+
+        lst.add(Arguments.of(new String[] {"-U"}, optU, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"-U", "1"}, optU, optionGroup, 
false, expected, false, expected, optU));
+        lst.add(Arguments.of(new String[] {"--you"}, optU, optionGroup, false, 
null, false, null, optU));
+        lst.add(Arguments.of(new String[] {"--you", "1"},  optU, optionGroup, 
false, expected, false, expected, optU));
+
+        return lst.stream();
     }
 }

Reply via email to