[ 
https://issues.apache.org/jira/browse/CLI-343?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gary D. Gregory updated CLI-343:
--------------------------------
    Affects Version/s: Nightly Builds
                           (was: 1.10.0)

> OptionFormatter.getBothOpt() lacks validation for Options without opt or 
> longOpt
> --------------------------------------------------------------------------------
>
>                 Key: CLI-343
>                 URL: https://issues.apache.org/jira/browse/CLI-343
>             Project: Commons CLI
>          Issue Type: Bug
>    Affects Versions: Nightly Builds
>            Reporter: Ruiqi Dong
>            Priority: Minor
>         Attachments: OptionFormatter.java, OptionFormatterTest.java
>
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
> *Description:*
> The {{OptionFormatter.getBothOpt()}} method contains a comment stating 
> "Option requires at least one of opt or longOpt", but the method itself does 
> not validate this constraint. Instead, it relies entirely on the {{Option}} 
> class validation.
>  
> *Current Behavior:* The {{getBothOpt()}} method would return an empty string 
> if called with an Option that has neither opt nor longOpt. The method 
> includes a comment acknowledging the constraint but doesn't enforce it. 
> *Expected Behavior:* {{OptionFormatter}} should validate the Option 
> constraint independently, either in its constructor or in the 
> {{getBothOpt()}} method
>  
> *Unit Test Cases:*
> public class OptionFormatterTest {
> @Test
> @DisplayName("getBothOpt() should throw exception when both opt and longOpt 
> are null")
> publicvoidtestGetBothOptWithNullShortAndLongOptShouldThrowException(){
> // Create an Option with both opt and longOpt as null
> // This violates the constraint mentioned in the comment:
> // "Option requires at least one of opt or longOpt"
> Optionoption = Option.builder()
> .required(false)
> .build();
>  
> // This should throw an exception but doesn't in the current implementation
> assertThrows(IllegalArgumentException.class, () -> {
> OptionFormatterformatter = OptionFormatter.builder().build(option);
> formatter.getBothOpt();
> }, "OptionFormatter should throw exception when Option has neither opt nor 
> longOpt");
> }
>  
> @Test
> @DisplayName("OptionFormatter construction should fail when Option has 
> neither opt nor longOpt")
> publicvoidtestOptionFormatterConstructionWithInvalidOption(){
> // Create an Option without any opt or longOpt
> OptioninvalidOption = Option.builder()
> .desc("This option has no way to be specified")
> .build();
>  
> // The builder.build() method should validate and throw exception
> OptionFormatter.Builderbuilder = OptionFormatter.builder();
>  
> assertThrows(IllegalArgumentException.class, () -> {
> builder.build(invalidOption);
> }, "OptionFormatter.Builder.build() should reject Options without opt or 
> longOpt");
> }
> }
>  
> *Test Results:*
> [*INFO*] Running org.apache.commons.cli.help.{*}OptionFormatterTest{*}{*}{*}
> [*ERROR*] *Tests* {*}run: 2{*}, Failures: 0, *Errors: 2*, Skipped: 0, Time 
> elapsed: 0.001 s *<<< FAILURE!* -- in 
> org.apache.commons.cli.help.{*}OptionFormatterTest{*}{*}{*}
> [*ERROR*] 
> org.apache.commons.cli.help.OptionFormatterTest.testGetBothOptWithNullShortAndLongOptShouldThrowException
>  -- Time elapsed: 0 s <<< ERROR!
> java.lang.IllegalArgumentException: Either opt or longOpt must be specified
>  at org.apache.commons.cli.Option$Builder.build(Option.java:134)
>  at 
> org.apache.commons.cli.help.OptionFormatterTest.testGetBothOptWithNullShortAndLongOptShouldThrowException(OptionFormatterTest.java:36)
>  at java.lang.reflect.Method.invoke(Method.java:498)
>  at java.util.ArrayList.forEach(ArrayList.java:1259)
>  at java.util.ArrayList.forEach(ArrayList.java:1259)
>  
> *Suggested Fix:* 
> Add validation in the {{OptionFormatter}} constructor
> private OptionFormatter(final Option option, final Builder builder) {
>     if (Util.isEmpty(option.getOpt()) && Util.isEmpty(option.getLongOpt())) {
>         throw new IllegalArgumentException("Option must have at least one of 
> opt or longOpt");
>     }
>     // ... rest of constructor
> }



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to