From f48afa8a6a21bd947d22689921ea5c3c25468de3 Mon Sep 17 00:00:00 2001 From: David Larochette Date: Thu, 18 Sep 2025 19:51:04 +0200 Subject: [PATCH] feat: add option counting functions Fixes: CLI-350 --- .../org/apache/commons/cli/CommandLine.java | 39 ++++++++++++ .../apache/commons/cli/OptionCountTest.java | 59 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/test/java/org/apache/commons/cli/OptionCountTest.java diff --git a/src/main/java/org/apache/commons/cli/CommandLine.java b/src/main/java/org/apache/commons/cli/CommandLine.java index 332b38936..50313b616 100644 --- a/src/main/java/org/apache/commons/cli/CommandLine.java +++ b/src/main/java/org/apache/commons/cli/CommandLine.java @@ -300,6 +300,45 @@ public Option[] getOptions() { return options.toArray(Option.EMPTY_ARRAY); } + /** + * Gets the number of times this option appears in the command line. + * + * @param option the option. + * @return Number of times the option is present + * @since 1.11.0 + */ + public int getOptionCount(final Option option) { + int result = 0; + for (Option opt : options) { + if (Objects.equals(opt, option)) { + ++result; + } + } + return result; + } + + /** + * Gets the number of times this option appears in the command line + * + * @param optionChar the character name of the option. + * @return Number of times the option is present + * @since 1.11.0 + */ + public int getOptionCount(final char optionChar) { + return getOptionCount(String.valueOf(optionChar)); + } + + /** + * Gets the number of times this option appears in the command line + * + * @param optionName the name of the option. + * @return Number of times the option is present + * @since 1.11.0 + */ + public int getOptionCount(final String optionName) { + return getOptionCount(resolveOption(optionName)); + } + /** * Gets the first argument, if any, of this option. * diff --git a/src/test/java/org/apache/commons/cli/OptionCountTest.java b/src/test/java/org/apache/commons/cli/OptionCountTest.java new file mode 100644 index 000000000..a12f91ba1 --- /dev/null +++ b/src/test/java/org/apache/commons/cli/OptionCountTest.java @@ -0,0 +1,59 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package org.apache.commons.cli; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class OptionCountTest { + private static final Option VERBOSITY = new Option("v", "verbosity: use multiple times for more"); + private static final Options OPTIONS = new Options().addOption(VERBOSITY); + + @Test + void testNoSwitch() throws ParseException { + final CommandLine cmdLine = new DefaultParser().parse(OPTIONS, new String[]{}); + assertEquals(0, cmdLine.getOptionCount(VERBOSITY)); + } + + @Test + void testOneSwitch() throws ParseException { + final CommandLine cmdLine = new DefaultParser().parse(OPTIONS, new String[]{"-v"}); + assertEquals(1, cmdLine.getOptionCount(VERBOSITY)); + assertEquals(1, cmdLine.getOptionCount("v")); + assertEquals(1, cmdLine.getOptionCount('v')); + } + + @Test + void testThreeSwitches() throws ParseException { + final CommandLine cmdLine = new DefaultParser().parse(OPTIONS, new String[]{"-v", "-v", "-v"}); + assertEquals(3, cmdLine.getOptionCount(VERBOSITY)); + } + + @Test + void testThreeSwitchesCompact() throws ParseException { + final CommandLine cmdLine = new DefaultParser().parse(OPTIONS, new String[]{"-vvv"}); + assertEquals(3, cmdLine.getOptionCount(VERBOSITY)); + } + + @Test + void testFiveSwitchesMixed() throws ParseException { + final CommandLine cmdLine = new DefaultParser().parse(OPTIONS, new String[]{"-v", "-vvv", "-v"}); + assertEquals(5, cmdLine.getOptionCount(VERBOSITY)); + } +}