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