You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2007/05/20 19:38:25 UTC
svn commit: r539898 - in /jakarta/jmeter/branches/rel-2-2:
src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
test/src/org/apache/commons/cli/avalon/ClutilTestCase.java xdocs/changes.xml
Author: sebb
Date: Sun May 20 10:38:24 2007
New Revision: 539898
URL: http://svn.apache.org/viewvc?view=rev&rev=539898
Log:
Fix CLI long optional argument to require "=" (as for short options)
Modified:
jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java
jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
Modified: jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java?view=diff&rev=539898&r1=539897&r2=539898
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/jorphan/org/apache/commons/cli/avalon/CLArgsParser.java Sun May 20 10:38:24 2007
@@ -34,7 +34,6 @@
* Note that CLArgs uses a backing hashtable for the options index and so
* duplicate arguments are only returned by getArguments().
*
- * @version $Revision$ $Date$
* @see ParserControl
* @see CLOption
* @see CLOptionDescriptor
@@ -371,14 +370,9 @@
m_stringLength = m_args[m_argIndex].length();
- // ch = peekAtChar();
-
while (true) {
m_ch = peekAtChar();
- // System.out.println( "Pre State=" + m_state );
- // System.out.println( "Pre Char=" + (char)ch + "/" + (int)ch );
-
if (m_argIndex >= m_args.length) {
break;
}
@@ -389,9 +383,6 @@
return;
}
- // System.out.println( "State=" + m_state );
- // System.out.println( "Char=" + (char)ch + "/" + (int)ch );
-
if (STATE_OPTION_MODE == m_state) {
// if get to an arg barrier then return to normal mode
// else continue accumulating options
@@ -406,14 +397,12 @@
} else if (STATE_NO_OPTIONS == m_state) {
// should never get to here when stringIndex != 0
addOption(new CLOption(m_args[m_argIndex++]));
- } else if (STATE_OPTIONAL_ARG == m_state && m_isLong && m_ch != 0) {
- m_state = STATE_NORMAL;
- addOption(m_option);
} else {
parseArguments();
}
}
+ // Reached end of input arguments - perform final processing
if (m_option != null) {
if (STATE_OPTIONAL_ARG == m_state) {
m_options.addElement(m_option);
@@ -482,10 +471,13 @@
return m_args[m_argIndex].charAt(m_stringIndex++);
}
+ private char m_tokesep; // Keep track of token separator
+
private final Token nextToken(final char[] separators) {
m_ch = getChar();
if (isSeparator(m_ch, separators)) {
+ m_tokesep=m_ch;
m_ch = getChar();
return new Token(TOKEN_SEPARATOR, null);
}
@@ -497,6 +489,7 @@
m_ch = getChar();
} while (!isSeparator(m_ch, separators));
+ m_tokesep=m_ch;
return new Token(TOKEN_STRING, sb.toString());
}
@@ -558,6 +551,12 @@
addOption(m_option);
m_state = STATE_NORMAL;
return;
+ }
+
+ if (m_isLong && '=' != m_tokesep){ // Long optional arg must have = as separator
+ addOption(m_option);
+ m_state = STATE_NORMAL;
+ return;
}
if ('=' == m_ch) {
Modified: jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java?view=diff&rev=539898&r1=539897&r2=539898
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java (original)
+++ jakarta/jmeter/branches/rel-2-2/test/src/org/apache/commons/cli/avalon/ClutilTestCase.java Sun May 20 10:38:24 2007
@@ -23,6 +23,7 @@
import java.util.List;
import junit.framework.TestCase;
+import junit.framework.TestSuite;
/**
*
@@ -91,15 +92,37 @@
private static final CLOptionDescriptor BLEE = new CLOptionDescriptor("blee",
CLOptionDescriptor.ARGUMENT_DISALLOWED, BLEE_OPT, "blee");
- private static final CLOptionDescriptor ALL = new CLOptionDescriptor("all", CLOptionDescriptor.ARGUMENT_DISALLOWED,
+ private static final CLOptionDescriptor ALL = new CLOptionDescriptor("all",
+ CLOptionDescriptor.ARGUMENT_DISALLOWED,
ALL_OPT, "all", new CLOptionDescriptor[] { BLEE });
- private static final CLOptionDescriptor FILE = new CLOptionDescriptor("file", CLOptionDescriptor.ARGUMENT_REQUIRED,
- FILE_OPT, "the build file.");
+ private static final CLOptionDescriptor FILE = new CLOptionDescriptor("file",
+ CLOptionDescriptor.ARGUMENT_REQUIRED, FILE_OPT, "the build file.");
private static final CLOptionDescriptor TAINT = new CLOptionDescriptor("taint",
CLOptionDescriptor.ARGUMENT_OPTIONAL, TAINT_OPT, "turn on tainting checks (optional level).");
+ private static final CLOptionDescriptor [] OPTIONS = new CLOptionDescriptor [] {
+ new CLOptionDescriptor("none",
+ CLOptionDescriptor.ARGUMENT_DISALLOWED | CLOptionDescriptor.DUPLICATES_ALLOWED,
+ '0', "no parameter"),
+
+ new CLOptionDescriptor("optional",
+ CLOptionDescriptor.ARGUMENT_OPTIONAL | CLOptionDescriptor.DUPLICATES_ALLOWED,
+ '?', "optional parameter"),
+
+ new CLOptionDescriptor("one",
+ CLOptionDescriptor.ARGUMENT_REQUIRED | CLOptionDescriptor.DUPLICATES_ALLOWED,
+ '1', "one parameter"),
+
+ new CLOptionDescriptor("two",
+ CLOptionDescriptor.ARGUMENTS_REQUIRED_2 | CLOptionDescriptor.DUPLICATES_ALLOWED,
+ '2', "two parameters")
+ };
+
+
+
+
public ClutilTestCase() {
this("Command Line Interpreter Test Case");
}
@@ -176,7 +199,7 @@
final List clOptions = parser.getArguments();
final int size = clOptions.size();
- assertEquals("Option count", 3, size);
+ assertEquals("Option count", 2, size);
final CLOption option0 = (CLOption) clOptions.get(0);
assertEquals("Option Code: " + option0.getDescriptor().getId(), TAINT_OPT, option0.getDescriptor().getId());
@@ -216,12 +239,8 @@
final String[] args = new String[] { "-T3", "-a" };
- // System.out.println("[before parsing]");
-
final CLArgsParser parser = new CLArgsParser(args, options);
- // System.out.println("[after parsing]");
-
assertNull(parser.getErrorString(), parser.getErrorString());
final List clOptions = parser.getArguments();
@@ -243,12 +262,8 @@
final String[] args = new String[] { "-T=3", "-a" };
- // System.out.println("[before parsing]");
-
final CLArgsParser parser = new CLArgsParser(args, options);
- // System.out.println("[after parsing]");
-
assertNull(parser.getErrorString(), parser.getErrorString());
final List clOptions = parser.getArguments();
@@ -270,11 +285,8 @@
final String[] args = new String[] { "-T", "-a" };
- // System.out.println("[before parsing]");
final CLArgsParser parser = new CLArgsParser(args, options);
- // System.out.println("[after parsing]");
-
assertNull(parser.getErrorString(), parser.getErrorString());
final List clOptions = parser.getArguments();
@@ -837,13 +849,17 @@
final CLOptionDescriptor[] options = { FILE };
final CLArgsParser parser = new CLArgsParser(args, options);
+ assertNull(parser.getErrorString(), parser.getErrorString());
+
CLOption optionById = parser.getArgumentById(FILE_OPT);
assertNotNull(optionById);
assertEquals(FILE_OPT, optionById.getDescriptor().getId());
+ assertEquals("testarg", optionById.getArgument());
CLOption optionByName = parser.getArgumentByName(FILE.getName());
assertNotNull(optionByName);
assertEquals(FILE_OPT, optionByName.getDescriptor().getId());
+ assertEquals("testarg", optionByName.getArgument());
}
/**
@@ -857,6 +873,8 @@
final CLOptionDescriptor[] options = { test };
final CLArgsParser parser = new CLArgsParser(args, options);
+ assertNull(parser.getErrorString(), parser.getErrorString());
+
final CLOption optionByID = parser.getArgumentById('n');
assertNotNull(optionByID);
assertEquals('n', optionByID.getDescriptor().getId());
@@ -876,6 +894,8 @@
final CLOptionDescriptor[] options = { test };
final CLArgsParser parser = new CLArgsParser(args, options);
+ assertNull(parser.getErrorString(), parser.getErrorString());
+
final CLOption optionByID = parser.getArgumentById('n');
assertNotNull(optionByID);
assertEquals('n', optionByID.getDescriptor().getId());
@@ -883,6 +903,57 @@
final StringBuffer sb = CLUtil.describeOptions(options);
final String lineSeparator = System.getProperty("line.separator");
assertEquals("Testing display of null description", "\t-n, --nulltest" + lineSeparator, sb.toString());
+ }
+
+ public void testCombinations() throws Exception {
+ check(new String [] {},"");
+ check(new String [] {"--none",
+ "-0"
+ },
+ "-0 -0"); // Canonical form
+ check(new String [] {"--one=a",
+ "--one","A",
+ "-1b",
+ "-1=c",
+ "-1","d"
+ },
+ "-1=[a] -1=[A] -1=[b] -1=[c] -1=[d]");
+ check(new String [] {"-2n=v",
+ "-2","N=V"
+ },
+ "-2=[n, v] -2=[N, V]");
+ check(new String [] {"--two=n=v",
+ "--two","N=V"
+ },
+ "-2=[n, v] -2=[N, V]");
+ // Test optional arguments
+ check(new String [] {"-?",
+ "A", // Separate argument
+ "-?=B",
+ "-?C",
+ "-?"
+ },
+ "-? [A] -?=[B] -?=[C] -?");
+ check(new String [] {"--optional=A", // OK
+ "--optional","B", // should treat B as separate
+ "--optional" // Should have no arg
+ },
+ "-?=[A] -? [B] -?");
+ }
+
+ private void check(String args[], String canon){
+ final CLArgsParser parser = new CLArgsParser(args, OPTIONS);
+
+ assertNull(parser.getErrorString(),parser.getErrorString());
+
+ final List clOptions = parser.getArguments();
+ final int size = clOptions.size();
+ StringBuffer sb = new StringBuffer();
+ for (int i=0; i< size; i++){
+ if (i>0) sb.append(" ");
+ sb.append(((CLOption)clOptions.get(i)).toShortString());
+ }
+ assertEquals("Canonical form ("+size+")",canon,sb.toString());
}
/*
* TODO add tests to check for: - name clash - long option abbreviations
Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=539898&r1=539897&r2=539898
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sun May 20 10:38:24 2007
@@ -234,6 +234,7 @@
<li>Bug 24684 - remote startup problems if spaces in the path of the jmeter</li>
<li>Use Listener configuration when loading CSV data files</li>
<li>Function methods setParameters() need to be synchronized</li>
+<li>Fix CLI long optional argument to require "=" (as for short options)</li>
</ul>
<h3>Version 2.2</h3>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org