Author: roxspring Date: Thu Feb 24 10:07:00 2005 New Revision: 155218 URL: http://svn.apache.org/viewcvs?view=rev&rev=155218 Log: Nested group handling improved Applied the test from the bug and implemented an alternate fix PR: 32533 Submitted by: David Morris
Added: jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/Bug32533Test.java (with props) jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/option/NestedGroupTest.java (with props) Modified: jakarta/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java Modified: jakarta/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java?view=diff&r1=155217&r2=155218 ============================================================================== --- jakarta/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java (original) +++ jakarta/commons/proper/cli/trunk/src/java/org/apache/commons/cli2/option/GroupImpl.java Thu Feb 24 10:07:00 2005 @@ -178,13 +178,20 @@ // narrow the search final Collection values = optionMap.tailMap(arg).values(); - for (Iterator i = values.iterator(); i.hasNext();) { + boolean foundMemberOption = false; + for (Iterator i = values.iterator(); i.hasNext() && !foundMemberOption;) { final Option option = (Option) i.next(); if (option.canProcess(arg)) { + foundMemberOption = true; arguments.previous(); option.process(commandLine, arguments); } + } + // back track and abort this group if necessary + if(!foundMemberOption) { + arguments.previous(); + return; } } // [END argument may be anonymous Added: jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/Bug32533Test.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/Bug32533Test.java?view=auto&rev=155218 ============================================================================== --- jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/Bug32533Test.java (added) +++ jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/Bug32533Test.java Thu Feb 24 10:07:00 2005 @@ -0,0 +1,49 @@ +/** + * Copyright 2004 The Apache Software Foundation + * + * Licensed 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 + * + * http://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.cli2.bug; + +import org.apache.commons.cli2.Argument; +import org.apache.commons.cli2.Group; +import org.apache.commons.cli2.Option; +import org.apache.commons.cli2.OptionException; +import org.apache.commons.cli2.builder.ArgumentBuilder; +import org.apache.commons.cli2.builder.DefaultOptionBuilder; +import org.apache.commons.cli2.builder.GroupBuilder; +import org.apache.commons.cli2.commandline.Parser; + +import junit.framework.TestCase; + +/** + * @author roxspring + */ +public class Bug32533Test extends TestCase { + + public void testBlah() throws OptionException { + + Option a1 = new DefaultOptionBuilder().withLongName("a1").create(); + Option b1 = new DefaultOptionBuilder().withLongName("b1").create(); + Option c1 = new DefaultOptionBuilder().withLongName("c1").create(); + + Group b = new GroupBuilder().withOption(b1).create(); + Group c = new GroupBuilder().withOption(c1).create(); + Group a = new GroupBuilder().withOption(a1).withOption(b).withOption(c).create(); + + Parser parser = new Parser(); + parser.setGroup(a); + parser.parse(new String[]{"--a1","--b1"}); + } + +} Propchange: jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/bug/Bug32533Test.java ------------------------------------------------------------------------------ svn:eol-style = native Added: jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/option/NestedGroupTest.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/option/NestedGroupTest.java?view=auto&rev=155218 ============================================================================== --- jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/option/NestedGroupTest.java (added) +++ jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/option/NestedGroupTest.java Thu Feb 24 10:07:00 2005 @@ -0,0 +1,199 @@ +/** + * Copyright 2003-2004 The Apache Software Foundation + * + * Licensed 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 + * + * http://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.cli2.option; + +import org.apache.commons.cli2.CLITestCase; +import org.apache.commons.cli2.CommandLine; +import org.apache.commons.cli2.Group; +import org.apache.commons.cli2.OptionException; +import org.apache.commons.cli2.builder.ArgumentBuilder; +import org.apache.commons.cli2.builder.DefaultOptionBuilder; +import org.apache.commons.cli2.builder.GroupBuilder; +import org.apache.commons.cli2.commandline.Parser; +import org.apache.commons.cli2.util.HelpFormatter; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Test to exercise nested groups developed to demonstrate bug 32533 + */ +public class NestedGroupTest extends CLITestCase { + final static DefaultOptionBuilder obuilder = new DefaultOptionBuilder(); + final static ArgumentBuilder abuilder = new ArgumentBuilder(); + final static GroupBuilder gbuilder = new GroupBuilder(); + + static Group buildActionGroup() { + return gbuilder.withName("Action").withDescription("Action") + .withMinimum(1).withMaximum(1) + .withOption(obuilder.withId(5).withShortName("e") + .withLongName("encrypt") + .withDescription("Encrypt input") + .create()) + .withOption(obuilder.withId(6).withShortName("d") + .withLongName("decrypt") + .withDescription("Decrypt input") + .create()).create(); + } + + static Group buildAlgorithmGroup() { + return gbuilder.withName("Algorithm") + .withDescription("Encryption Algorithm").withMaximum(1) + .withOption(obuilder.withId(0).withShortName("b") + .withLongName("blowfish") + .withDescription("Blowfish").create()) + .withOption(obuilder.withId(1).withShortName("3") + .withLongName("3DES") + .withDescription("Triple DES") + .create()).create(); + } + + static Group buildInputGroup() { + return gbuilder.withName("Input").withDescription("Input").withMinimum(1) + .withMaximum(1) + .withOption(obuilder.withId(2).withShortName("f") + .withLongName("file") + .withDescription("Input file") + .withArgument(abuilder.withName( + "file").withMinimum(1).withMaximum(1).create()).create()) + .withOption(obuilder.withId(3).withShortName("s") + .withLongName("string") + .withDescription("Input string") + .withArgument(abuilder.withName( + "string").withMinimum(1).withMaximum(1).create()).create()) + .create(); + } + + static Group buildEncryptionServiceGroup(Group[] nestedGroups) { + gbuilder.withName("encryptionService") + .withOption(obuilder.withId(4).withShortName("h") + .withLongName("help") + .withDescription("Print this message") + .create()).withOption(obuilder.withShortName( + "k").withLongName("key").withDescription("Encryption key") + .create()); + + for (int i = 0; i < nestedGroups.length; i++) { + gbuilder.withOption(nestedGroups[i]); + } + + return gbuilder.create(); + } + + public void testNestedGroup() + throws OptionException { + final String[] args = { + "-eb", + "--file", + "/tmp/filename.txt" + }; + + Group[] nestedGroups = { + buildActionGroup(), + buildAlgorithmGroup(), + buildInputGroup() + }; + + Parser parser = new Parser(); + parser.setGroup(buildEncryptionServiceGroup(nestedGroups)); + + CommandLine commandLine = parser.parse(args); + + assertTrue("/tmp/filename.txt".equals( + (String) commandLine.getValue("-f"))); + assertTrue(commandLine.hasOption("-e")); + assertTrue(commandLine.hasOption("-b")); + assertFalse(commandLine.hasOption("-d")); + } + + public void testNestedGroupHelp() + throws OptionException { + final String[] args = { + "-eb", + "--file", + "/tmp/filename.txt" + }; + + Group[] nestedGroups = { + buildActionGroup(), + buildAlgorithmGroup(), + buildInputGroup() + }; + + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.setGroup(buildEncryptionServiceGroup(nestedGroups)); + + final StringWriter out = new StringWriter(); + helpFormatter.setPrintWriter(new PrintWriter(out)); + + try { + helpFormatter.print(); + + final BufferedReader bufferedReader = new BufferedReader(new StringReader( + out.toString())); + final String[] expected = new String[] { + "Usage: ", + " [-h -k -e|-d -b|-3 -f <file>|-s <string>] ", + "encryptionService ", + " -h (--help) Print this message ", + " -k (--key) Encryption key ", + " Action Action ", + " -e (--encrypt) Encrypt input ", + " -d (--decrypt) Decrypt input ", + " Algorithm Encryption Algorithm ", + " -b (--blowfish) Blowfish ", + " -3 (--3DES) Triple DES ", + " Input Input ", + " -f (--file) file Input file ", + " -s (--string) string Input string " + }; + + List actual = new ArrayList(expected.length); + String input; + + while ((input = bufferedReader.readLine()) != null) { + actual.add(input); + } + + // Show they are the same number of lines + assertEquals("Help text lines should be " + expected.length, + actual.size(), expected.length); + + for (int i = 0; i < expected.length; i++) { + if (!expected[i].equals(actual.get(i))) { + for (int x = 0; x < expected.length; i++) { + System.out.println(" " + expected[i]); + System.out.println((expected[i].equals(actual.get(i)) + ? "== " + : "!= ") + actual.get(i)); + } + } + + assertEquals(expected[i], actual.get(i)); + } + } + catch (IOException e) { + fail(e.getLocalizedMessage()); + } + } +} Propchange: jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/option/NestedGroupTest.java ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]