summaryrefslogtreecommitdiffstats
path: root/pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java')
-rw-r--r--pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java2792
1 files changed, 1251 insertions, 1541 deletions
diff --git a/pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java b/pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java
index 579f0f59..cf01f989 100644
--- a/pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java
+++ b/pki/base/silent/src/com/netscape/pkisilent/argparser/ArgParserTest.java
@@ -1,4 +1,5 @@
package com.netscape.pkisilent.argparser;
+
// --- BEGIN COPYRIGHT BLOCK ---
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -18,17 +19,17 @@ package com.netscape.pkisilent.argparser;
// --- END COPYRIGHT BLOCK ---
/**
- * Copyright John E. Lloyd, 2004. All rights reserved. Permission to use,
- * copy, modify and redistribute is granted, provided that this copyright
- * notice is retained and the author is given credit whenever appropriate.
- *
- * This software is distributed "as is", without any warranty, including
- * any implied warranty of merchantability or fitness for a particular
- * use. The author assumes no responsibility for, and shall not be liable
- * for, any special, indirect, or consequential damages, or any damages
- * whatsoever, arising out of or in connection with the use of this
- * software.
- */
+ * Copyright John E. Lloyd, 2004. All rights reserved. Permission to use,
+ * copy, modify and redistribute is granted, provided that this copyright
+ * notice is retained and the author is given credit whenever appropriate.
+ *
+ * This software is distributed "as is", without any warranty, including
+ * any implied warranty of merchantability or fitness for a particular
+ * use. The author assumes no responsibility for, and shall not be liable
+ * for, any special, indirect, or consequential damages, or any damages
+ * whatsoever, arising out of or in connection with the use of this
+ * software.
+ */
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
@@ -36,1537 +37,1246 @@ import java.lang.reflect.Array;
import java.util.Vector;
/**
- * Testing class for the class ArgParser. Executing the <code>main</code>
- * method of this class will perform a suite of tests to help verify correct
- * operation of the parser class.
- *
+ * Testing class for the class ArgParser. Executing the <code>main</code> method
+ * of this class will perform a suite of tests to help verify correct operation
+ * of the parser class.
+ *
* @author John E. Lloyd, Fall 2004
* @see ArgParser
*/
-public class ArgParserTest
-{
- ArgParser parser;
-
- static final boolean CLOSED = true;
- static final boolean OPEN = false;
-
- static final boolean ONE_WORD = true;
- static final boolean MULTI_WORD = false;
-
- private static void verify (boolean ok, String msg)
- { if (!ok)
- { Throwable e = new Throwable();
- System.out.println ("Verification failed:" + msg);
- e.printStackTrace();
- System.exit(1);
- }
- }
-
- private static String[] argsFromString (String s)
- {
- Vector<String> vec = new Vector<String>(100);
- try
- { ArgParser.stringToArgs (vec, s, /*allowQuotedStings=*/false);
- }
- catch (StringScanException e)
- { e.printStackTrace();
- System.exit (1);
- }
- String[] result = new String[vec.size()];
- for (int i=0; i<vec.size(); i++)
- { result[i] = (String)vec.get(i);
- }
- return result;
- }
-
- static class RngCheck
- {
- ArgParser.RangePnt low = null;
- ArgParser.RangePnt high = null;
- int type;
-
- RngCheck (String s)
- { low = new ArgParser.RangePnt (s, CLOSED);
- type = 's';
- }
-
- RngCheck (double d)
- { low = new ArgParser.RangePnt (d, CLOSED);
- type = 'd';
- }
-
- RngCheck (long l)
- { low = new ArgParser.RangePnt (l, CLOSED);
- type = 'l';
- }
-
- RngCheck (boolean b)
- { low = new ArgParser.RangePnt (b, CLOSED);
- type = 'b';
- }
-
- RngCheck (String s1, boolean c1, String s2, boolean c2)
- { low = new ArgParser.RangePnt (s1, c1);
- high = new ArgParser.RangePnt (s2, c2);
- type = 's';
- }
-
- RngCheck (double d1, boolean c1, double d2, boolean c2)
- { low = new ArgParser.RangePnt (d1, c1);
- high = new ArgParser.RangePnt (d2, c2);
- type = 'd';
- }
-
- RngCheck (long l1, boolean c1, long l2, boolean c2)
- { low = new ArgParser.RangePnt (l1, c1);
- high = new ArgParser.RangePnt (l2, c2);
- type = 'l';
- }
-
- void check (ArgParser.RangeAtom ra)
- {
- verify ((ra.low==null) == (low==null),
- "(ra.low==null)=" + (ra.low==null) +
- "(low==null)=" + (low==null));
- verify ((ra.high==null) == (high==null),
- "(ra.high==null)=" + (ra.high==null) +
- "(high==null)=" + (high==null));
-
- if (ra.low != null)
- { switch (type)
- { case 'l':
- { verify (ra.low.lval==low.lval,
- "ra.low=" + ra.low + " low=" + low);
- break;
- }
- case 'd':
- { verify (ra.low.dval==low.dval,
- "ra.low=" + ra.low + " low=" + low);
- break;
- }
- case 's':
- { verify (ra.low.sval.equals (low.sval),
- "ra.low=" + ra.low + " low=" + low);
- break;
- }
- case 'b':
- { verify (ra.low.bval==low.bval,
- "ra.low=" + ra.low + " low=" + low);
- break;
- }
- }
- verify (ra.low.closed==low.closed,
- "ra.low=" + ra.low + " low=" + low);
- }
- if (ra.high != null)
- { switch (type)
- { case 'l':
- { verify (ra.high.lval==high.lval,
- "ra.high=" + ra.high + " high=" + high);
- break;
- }
- case 'd':
- { verify (ra.high.dval==high.dval,
- "ra.high=" + ra.high + " high=" + high);
- break;
- }
- case 's':
- { verify (ra.high.sval.equals (high.sval),
- "ra.high=" + ra.high + " high=" + high);
- break;
- }
- case 'b':
- { verify (ra.high.bval==high.bval,
- "ra.high=" + ra.high + " high=" + high);
- break;
- }
- }
- verify (ra.high.closed==high.closed,
- "ra.high=" + ra.high + " high=" + high);
- }
- }
- }
-
- ArgParserTest ()
- { parser = new ArgParser("fubar");
- }
-
- static void checkException (Exception e, String errmsg)
- { if (errmsg != null)
- { if (!e.getMessage().equals(errmsg))
- { System.out.println (
-"Expecting exception '" + errmsg + "' but got '" +
- e.getMessage() + "'");
- e.printStackTrace();
- (new Throwable()).printStackTrace();
- System.exit(1);
- }
- }
- else
- { System.out.println (
-"Unexpected exception '" + e.getMessage() + "'");
- e.printStackTrace();
- (new Throwable()).printStackTrace();
- System.exit(1);
- }
- }
-
- void checkPrintHelp (String msg)
- {
- ByteArrayOutputStream buf = new ByteArrayOutputStream(0x10000);
- PrintStream ps = new PrintStream(buf);
- ps.println (parser.getHelpMessage());
- System.out.print (buf.toString());
- }
-
-// void checkGetSynopsis (String msg)
-// {
-// ByteArrayOutputStream buf = new ByteArrayOutputStream(0x10000);
-// PrintStream ps = new PrintStream(buf);
-// parser.printSynopsis (ps, 80);
-// System.out.print (buf.toString());
-// }
-
- void checkAdd (String s, Object resHolder, String errmsg)
- {
- checkAdd (s, resHolder, 0, 0, null, null, null, errmsg);
- }
-
- void add (String s, Object resHolder)
- { try
- { parser.addOption (s, resHolder);
- }
- catch (Exception e)
- { e.printStackTrace();
- System.exit (1);
- }
- }
-
- void checkStringArray (String msg, String[] strs, String[] check)
- {
- boolean dontMatch = false;
- if (strs.length != check.length)
- { dontMatch = true;
- }
- else
- { for (int i=0; i<strs.length; i++)
- { if (!strs[i].equals (check[i]))
- { dontMatch = true;
- break;
- }
- }
- }
- if (dontMatch)
- { System.out.println (msg);
- System.out.print ("Expected: ");
- for (int i=0; i<check.length; i++)
- { System.out.print ("'" + check[i] + "'");
- if (i<check.length-1)
- { System.out.print (" ");
- }
- }
- System.out.println ("");
- System.out.print ("Got: ");
- for (int i=0; i<strs.length; i++)
- { System.out.print ("'" + strs[i] + "'");
- if (i<strs.length-1)
- { System.out.print (" ");
- }
- }
- System.out.println ("");
- System.exit(1);
- }
- }
-
- void checkAdd (String s, Object resHolder, int code, int numValues,
- Object names, RngCheck[] rngCheck,
- String helpMsg, String errmsg)
- {
- boolean exceptionThrown = false;
- String[] namelist = null;
- try
- { parser.addOption (s, resHolder);
- }
- catch (Exception e)
- { exceptionThrown = true;
- checkException (e, errmsg);
- }
- if (names instanceof String)
- { namelist = new String[] { (String)names };
- }
- else
- { namelist = (String[])names;
- }
- if (!exceptionThrown)
- { verify (errmsg == null,
- "Expecting exception " + errmsg);
- ArgParser.Record rec = parser.lastMatchRecord();
- verify (rec.convertCode==code,
- "code=" + rec.convertCode + ", expecting " + code);
- ArgParser.NameDesc nd;
- int i=0;
- for (nd=rec.firstNameDesc(); nd!=null; nd=nd.next)
- { i++;
- }
- verify (i==namelist.length,
- "numNames=" + i + ", expecting " +namelist.length);
- i=0;
- for (nd=rec.firstNameDesc(); nd!=null; nd=nd.next)
- { String ss;
- if (!nd.oneWord)
- { ss = new String(nd.name) + ' ';
- }
- else
- { ss = nd.name;
- }
- verify (ss.equals(namelist[i]),
- "have name '"+ss+"', expecting '"+namelist[i]+"'");
- i++;
- }
- ArgParser.RangeAtom ra;
- i=0;
- for (ra=rec.firstRangeAtom(); ra!=null; ra=ra.next)
- { i++;
- }
- int expectedRangeNum = 0;
- if (rngCheck!=null)
- { expectedRangeNum = rngCheck.length;
- }
- verify (i==expectedRangeNum,
- "numRangeAtoms="+i+", expecting "+expectedRangeNum);
- i=0;
- for (ra=rec.firstRangeAtom(); ra!=null; ra=ra.next)
- { rngCheck[i++].check(ra);
- }
- verify (rec.helpMsg.equals(helpMsg),
- "helpMsg="+rec.helpMsg+", expecting "+helpMsg);
- verify (rec.numValues==numValues,
- "numValues="+rec.numValues+", expecting "+numValues);
- }
- }
-
- double getDoubleValue (Object obj, int k)
- {
- if (obj instanceof DoubleHolder)
- { return ((DoubleHolder)obj).value;
- }
- else if (obj instanceof FloatHolder)
- { return ((FloatHolder)obj).value;
- }
- else if (obj instanceof double[])
- { return ((double[])obj)[k];
- }
- else if (obj instanceof float[])
- { return ((float[])obj)[k];
- }
- else
- { verify (false, "object doesn't contain double values");
- return 0;
- }
- }
-
- long getLongValue (Object obj, int k)
- {
- if (obj instanceof LongHolder)
- { return ((LongHolder)obj).value;
- }
- else if (obj instanceof IntHolder)
- { return ((IntHolder)obj).value;
- }
- else if (obj instanceof long[])
- { return ((long[])obj)[k];
- }
- else if (obj instanceof int[])
- { return ((int[])obj)[k];
- }
- else
- { verify (false, "object doesn't contain long values");
- return 0;
- }
- }
-
- String getStringValue (Object obj, int k)
- {
- if (obj instanceof StringHolder)
- { return ((StringHolder)obj).value;
- }
- else if (obj instanceof String[])
- { return ((String[])obj)[k];
- }
- else
- { verify (false, "object doesn't contain String values");
- return null;
- }
- }
-
- boolean getBooleanValue (Object obj, int k)
- {
- if (obj instanceof BooleanHolder)
- { return ((BooleanHolder)obj).value;
- }
- else if (obj instanceof boolean[])
- { return ((boolean[])obj)[k];
- }
- else
- { verify (false, "object doesn't contain boolean values");
- return false;
- }
- }
-
- char getCharValue (Object obj, int k)
- {
- if (obj instanceof CharHolder)
- { return ((CharHolder)obj).value;
- }
- else if (obj instanceof char[])
- { return ((char[])obj)[k];
- }
- else
- { verify (false, "object doesn't contain char values");
- return 0;
- }
- }
-
- static class MErr
- {
- int code;
- String valStr;
-
- MErr (int code, String valStr)
- { this.code = code;
- this.valStr = valStr;
- }
- }
-
- static class MTest
- {
- String args;
- Object result;
- int resultIdx;
-
- MTest (String args, Object result)
- { this (args, result, -1);
- }
-
- MTest (String args, Object result, int resultIdx)
- { this.args = args;
- this.result = result;
- this.resultIdx = resultIdx;
- }
- };
-
- void checkMatch (String args[], int idx, String errMsg)
- { getMatchResult (args, idx, -1, errMsg, -1);
- }
-
- void checkMatch (String args[], int idx, int cnt,
- long check, int resultIdx)
- { Object rholder = getMatchResult (args, idx, cnt, null, resultIdx);
- long result = getLongValue(rholder,0);
- verify (result==check, "result " + result + " vs. " + check);
- }
-
- void checkMatch (String args[], int idx, int cnt,
- double check, int resultIdx)
- { Object rholder = getMatchResult (args, idx, cnt, null, resultIdx);
- double result = getDoubleValue(rholder,0);
- verify (result==check, "result " + result + " vs. " + check);
- }
-
- void checkMatch (String args[], int idx, int cnt,
- String check, int resultIdx)
- { Object rholder = getMatchResult (args, idx, cnt, null, resultIdx);
- String result = getStringValue(rholder,0);
- verify (result.equals(check), "result " + result + " vs. " + check);
- }
-
- void checkMatch (String args[], int idx, int cnt,
- boolean check, int resultIdx)
- { Object rholder = getMatchResult (args, idx, cnt, null, resultIdx);
- boolean result = getBooleanValue(rholder,0);
- verify (result==check, "result " + result + " vs. " + check);
- }
-
- void checkMatch (String args[], int idx, int cnt,
- char check, int resultIdx)
- { Object rholder = getMatchResult (args, idx, cnt, null, resultIdx);
- char result = getCharValue(rholder,0);
- verify (result==check, "result " + result + " vs. " + check);
- }
-
- void checkMatch (String args[], int idx, int cnt,
- Object checkArray, int resultIdx)
- { Object rholder = getMatchResult (args, idx, cnt, null, resultIdx);
- if (!checkArray.getClass().isArray())
- { verify (false, "check is not an array");
- }
- for (int i=0; i<Array.getLength(checkArray); i++)
- { if (checkArray instanceof long[])
- { long result = getLongValue(rholder,i);
- long check = ((long[])checkArray)[i];
- verify (result==check,
- "result ["+i+"] " + result + " vs. " + check);
- }
- else if (checkArray instanceof double[])
- { double result = getDoubleValue(rholder,i);
- double check = ((double[])checkArray)[i];
- verify (result==check,
- "result ["+i+"] " + result + " vs. " + check);
- }
- else if (checkArray instanceof String[])
- { String result = getStringValue(rholder,i);
- String check = ((String[])checkArray)[i];
- verify (result.equals(check),
- "result ["+i+"] " + result + " vs. " + check);
- }
- else if (checkArray instanceof boolean[])
- { boolean result = getBooleanValue(rholder,i);
- boolean check = ((boolean[])checkArray)[i];
- verify (result==check,
- "result ["+i+"] " + result + " vs. " + check);
- }
- else if (checkArray instanceof char[])
- { char result = getCharValue(rholder,i);
- char check = ((char[])checkArray)[i];
- verify (result==check,
- "result ["+i+"] " + result + " vs. " + check);
- }
- else
- { verify (false, "unknown type for checkArray");
- }
- }
- }
-
- void checkMatch (MTest test, boolean oneWord)
- { String[] argv;
- if (oneWord)
- { argv = new String[1];
- argv[0] = test.args;
- }
- else
- { argv = argsFromString(test.args);
- }
- if (test.result instanceof Long)
- { checkMatch (argv, 0, argv.length,
- ((Long)test.result).longValue(),
- test.resultIdx);
- }
- else if (test.result instanceof Double)
- { checkMatch (argv, 0, argv.length,
- ((Double)test.result).doubleValue(),
- test.resultIdx);
- }
- else if (test.result instanceof String)
- { checkMatch (argv, 0, argv.length,
- (String)test.result,
- test.resultIdx);
- }
- else if (test.result instanceof Boolean)
- { checkMatch (argv, 0, argv.length,
- ((Boolean)test.result).booleanValue(),
- test.resultIdx);
- }
- else if (test.result instanceof Character)
- { checkMatch (argv, 0, argv.length,
- ((Character)test.result).charValue(),
- test.resultIdx);
- }
- else if (test.result.getClass().isArray())
- { checkMatch (argv, 0, argv.length, test.result,
- test.resultIdx);
- }
- else if (test.result instanceof MErr)
- { MErr err = (MErr)test.result;
- String argname = parser.getOptionName (argv[0]);
- String msg = "";
-
- switch (err.code)
- { case 'c':
- { msg = "requires a contiguous value";
- break;
- }
- case 'm':
- { msg = "malformed " + parser.getOptionTypeName(argv[0]) +
- " '" + err.valStr + "'";
- break;
- }
- case 'r':
- { msg = "value '" + err.valStr + "' not in range " +
- parser.getOptionRangeDesc(argv[0]);
- break;
- }
- case 'v':
- { msg = "requires " + err.valStr + " values";
- break;
- }
- }
- checkMatch (argv, 0, argname + ": " + msg);
- }
- else
- { verify (false, "Unknown result type");
- }
- }
-
- void checkMatches (MTest[] tests, boolean oneWord)
- { for (int i=0; i<tests.length; i++)
- { checkMatch (tests[i], oneWord);
- }
- }
-
- Object getMatchResult (String args[], int idx, int cnt,
- String errMsg, int resultIdx)
- {
- boolean exceptionThrown = false;
- int k = 0;
- try
- { k = parser.matchArg (args, idx);
- }
- catch (Exception e)
- { exceptionThrown = true;
- checkException (e, errMsg);
- }
- if (!exceptionThrown)
- { verify (k==idx+cnt,
- "Expecting result index " + (idx+cnt) + ", got " + k);
- Object result = parser.getResultHolder(args[0]);
- if (resultIdx >= 0)
- { verify (result instanceof Vector,
- "Expecting result to be stored in a vector");
- Vector<?> vec = (Vector<?>)result;
- verify (vec.size()==resultIdx+1,
- "Expecting result vector size " + (resultIdx+1));
- return vec.get(resultIdx);
- }
- else
- { return result;
- }
- }
- else
- { return null;
- }
- }
-
- /**
- * Runs a set of tests to verify correct operation of the
- * ArgParser class. If all the tests run correctly, the
- * program prints the message <code>Passed</code> and terminates.
- * Otherwise, diagnostic information is printed at the first
- * point of failure.
- */
- public static void main (String[] args)
- {
- ArgParserTest test = new ArgParserTest();
-
- BooleanHolder bh = new BooleanHolder();
- boolean[] b3 = new boolean[3];
- CharHolder ch = new CharHolder();
- char[] c3 = new char[3];
- IntHolder ih = new IntHolder();
- int[] i3 = new int[3];
- LongHolder lh = new LongHolder();
- long[] l3 = new long[3];
- FloatHolder fh = new FloatHolder();
- float[] f3 = new float[3];
- DoubleHolder dh = new DoubleHolder();
- double[] d3 = new double[3];
- StringHolder sh = new StringHolder();
- String[] s3 = new String[3];
-
- test.checkAdd ("-foo %i{[0,10)}X3 #sets the value of foo",
-// 0123456789012345
- i3, 'i', 3, new String[] { "-foo " },
- new RngCheck[] {
- new RngCheck(0, CLOSED, 10, OPEN) },
- "sets the value of foo", null);
-
- test.checkAdd ("-arg1,,", null, "Null option name given");
- test.checkAdd ("-arg1,,goo %f ", null, "Null option name given");
- test.checkAdd (" ", null, "Null option name given");
- test.checkAdd ("", null, "Null option name given");
- test.checkAdd (" %v", null, "Null option name given");
- test.checkAdd ("-foo ", null, "No conversion character given");
- test.checkAdd ("-foo %", null, "No conversion character given");
- test.checkAdd ("foo, aaa bbb ",null,"Names not separated by ','");
- test.checkAdd (" foo aaa %d", null, "Names not separated by ','");
- test.checkAdd ("-arg1,-b,", null, "Null option name given");
- test.checkAdd ("-arg1,-b", null, "No conversion character given");
- test.checkAdd ("-arg1 ", null, "No conversion character given");
- test.checkAdd ("-arg1, %v", null, "Null option name given");
- test.checkAdd ("-arg1,%v", null, "Null option name given");
- test.checkAdd ("-foo %V", null,
- "Conversion code 'V' not one of 'iodxcbfsvh'");
- test.checkAdd ("-h %hX5",null,"Multipliers not supported for %h");
- test.checkAdd ("-h %h{}",null,"Ranges not supported for %h");
- test.checkAdd ("-help, -h %h #here is how we help you",
- null, 'h', 1, new String[] {"-help ", "-h " },
- null, "here is how we help you", null);
-
- test.checkAdd (
- "-arg1 ,-arg2=%d{0,3,(7,16]}X1 #x3 test",
- l3, 'd', 1, new String[] { "-arg1 ", "-arg2=" },
- new RngCheck[]
- { new RngCheck(0),
- new RngCheck(3),
- new RngCheck(7, OPEN, 16, CLOSED),
- },
- "x3 test", null);
-
- test.checkAdd (
- "bbb,ccc%x{[1,2]} #X3 x3 test",
- l3, 'x', 1, new String[] { "bbb", "ccc" },
- new RngCheck[]
- { new RngCheck(1, CLOSED, 2, CLOSED),
- },
- "X3 x3 test", null);
-
- test.checkAdd (
- " bbb ,ccc, ddd ,e , f=%bX1 #x3 test",
- b3, 'b', 1, new String[] { "bbb ", "ccc", "ddd ", "e ", "f=" },
- null,
- "x3 test", null);
-
- test.checkAdd (
- " bbb ,ccc, ddd ,e , f= %bX3 #x3 test",
- b3, 'b', 3, new String[] { "bbb ", "ccc ", "ddd ", "e ","f= " },
- null,
- "x3 test", null);
-
- test.checkAdd (
- "-b,--bar %s{[\"john\",\"jerry\"),fred,\"harry\"} #sets bar",
- sh, 's', 1, new String[] { "-b ", "--bar " },
- new RngCheck[] {
- new RngCheck("jerry",OPEN,"john",CLOSED),
- new RngCheck("fred"),
- new RngCheck("harry") },
- "sets bar", null);
-
- test.checkAdd (
- "-c ,coven%f{0.0,9.0,(6,5],[-9.1,10.2]} ",
- dh, 'f', 1, new String[] { "-c ", "coven" },
- new RngCheck[] {
- new RngCheck(0.0),
- new RngCheck(9.0),
- new RngCheck(5.0,CLOSED,6.0,OPEN),
- new RngCheck(-9.1,CLOSED,10.2,CLOSED) },
- "", null);
-
- test.checkAdd (
- "-b %b #a boolean value ",
- bh, 'b', 1, new String[] { "-b "},
- new RngCheck[] { },
- "a boolean value ", null);
-
- test.checkAdd ("-a %i", ih, 'i', 1, "-a ", null, "", null);
- test.checkAdd ("-a %o", lh, 'o', 1, "-a ", null, "", null);
- test.checkAdd ("-a %d", i3, 'd', 1, "-a ", null, "", null);
- test.checkAdd ("-a %x", l3, 'x', 1, "-a ", null, "", null);
- test.checkAdd ("-a %c", ch, 'c', 1, "-a ", null, "", null);
- test.checkAdd ("-a %c", c3, 'c', 1, "-a ", null, "", null);
- test.checkAdd ("-a %v", bh, 'v', 1, "-a ", null, "", null);
- test.checkAdd ("-a %b", b3, 'b', 1, "-a ", null, "", null);
- test.checkAdd ("-a %f", fh, 'f', 1, "-a ", null, "", null);
- test.checkAdd ("-a %f", f3, 'f', 1, "-a ", null, "", null);
- test.checkAdd ("-a %f", dh, 'f', 1, "-a ", null, "", null);
- test.checkAdd ("-a %f", d3, 'f', 1, "-a ", null, "", null);
-
- test.checkAdd ("-a %i", fh, 'i', 1, "-a ", null, "",
- "Invalid result holder for %i");
- test.checkAdd ("-a %c", i3, 'c', 1, "-a ", null, "",
- "Invalid result holder for %c");
- test.checkAdd ("-a %v", d3, 'v', 1, "-a ", null, "",
- "Invalid result holder for %v");
- test.checkAdd ("-a %f", sh, 'f', 1, "-a ", null, "",
- "Invalid result holder for %f");
- test.checkAdd ("-a %s", l3, 's', 1, "-a ", null, "",
- "Invalid result holder for %s");
-
- test.checkAdd ("-foo %i{} ", ih, 'i', 1, "-foo ", null, "", null);
- test.checkAdd ("-foo%i{}", ih, 'i', 1, "-foo", null, "", null);
- test.checkAdd ("-foo%i{ }", ih, 'i', 1, "-foo", null, "", null);
- test.checkAdd ("-foo%i{ }}", ih,
- "Illegal character(s), expecting '#'");
- test.checkAdd ("-foo%i{ ", ih,"Unterminated range specification");
- test.checkAdd ("-foo%i{", ih, "Unterminated range specification");
- test.checkAdd ("-foo%i{0,9", ih, "Unterminated range specification");
- test.checkAdd ("-foo%i{1,2,3)", ih,
- "Unterminated range specification");
-
- test.checkAdd ("-b %f{0.9}", fh, 'f', 1, "-b ",
- new RngCheck[] { new RngCheck(0.9) },
- "", null);
- test.checkAdd ("-b %f{ 0.9 ,7, -0.5,-4 ,6 }", fh, 'f', 1, "-b ",
- new RngCheck[] { new RngCheck(0.9),
- new RngCheck(7.0),
- new RngCheck(-0.5),
- new RngCheck(-4.0),
- new RngCheck(6.0) },
- "", null);
- test.checkAdd ("-b %f{ [0.9,7), (-0.5,-4),[9,6] , (10,13.4] }",
- fh, 'f', 1, "-b ",
- new RngCheck[] { new RngCheck(0.9,CLOSED,7.0,OPEN),
- new RngCheck(-4.0,OPEN,-.5,OPEN),
- new RngCheck(6.0,CLOSED,9.0,CLOSED),
- new RngCheck(10.0,OPEN,13.4,CLOSED),
- },
- "", null);
- test.checkAdd ("-b %f{(8 9]}", fh,
- "Missing ',' in subrange specification");
- test.checkAdd ("-b %f{(8,9,]}", fh,
- "Unterminated subrange");
- test.checkAdd ("-b %f{(8,9 ,]}", fh,
- "Unterminated subrange");
- test.checkAdd ("-b %f{(8,9 8]}", fh,
- "Unterminated subrange");
- test.checkAdd ("-b %f{8 9}", fh,
- "Range spec: ',' or '}' expected");
- test.checkAdd ("-b %f{8 *}", fh,
- "Range spec: ',' or '}' expected");
-
- test.checkAdd ("-b %f{8y}", fh,
- "Range spec: ',' or '}' expected");
- test.checkAdd ("-b %f{.}", fh,
- "Malformed float '.}' in range spec");
- test.checkAdd ("-b %f{1.0e}", fh,
- "Malformed float '1.0e}' in range spec");
- test.checkAdd ("-b %f{[*]}", fh,
- "Malformed float '*' in range spec");
- test.checkAdd ("-b %f{1.2e5t}", fh,
- "Range spec: ',' or '}' expected");
-
-
- test.checkAdd ("-b %i{8}", ih, 'i', 1, "-b ",
- new RngCheck[] { new RngCheck(8) },
- "", null);
- test.checkAdd ("-b %i{8, 9,10 }", ih, 'i', 1, "-b ",
- new RngCheck[] { new RngCheck(8),
- new RngCheck(9),
- new RngCheck(10) },
- "", null);
- test.checkAdd ("-b %i{8, [-9,10),[-17,15],(2,-33),(8,9] }",
- ih, 'i', 1, "-b ",
- new RngCheck[] { new RngCheck(8),
- new RngCheck(-9,CLOSED,10,OPEN),
- new RngCheck(-17,CLOSED,15,CLOSED),
- new RngCheck(-33,OPEN,2,OPEN),
- new RngCheck(8,OPEN,9,CLOSED),
- },
- "", null);
- test.checkAdd ("-b %i{8.7}", ih,
- "Range spec: ',' or '}' expected");
- test.checkAdd ("-b %i{6,[*]}", ih,
- "Malformed integer '*' in range spec");
- test.checkAdd ("-b %i{g76}", ih,
- "Malformed integer 'g' in range spec");
-
- test.checkAdd ("-b %s{foobar}", sh, 's', 1, "-b ",
- new RngCheck[] { new RngCheck("foobar") },
- "", null);
- test.checkAdd ("-b %s{foobar, 0x233,\" \"}", sh, 's', 1, "-b ",
- new RngCheck[] { new RngCheck("foobar"),
- new RngCheck("0x233"),
- new RngCheck(" ") },
- "", null);
- test.checkAdd ("-b %s{foobar,(bb,aa], [\"01\",02]}",
- sh, 's', 1, "-b ",
- new RngCheck[]
- { new RngCheck("foobar"),
- new RngCheck("aa",CLOSED,"bb",OPEN),
- new RngCheck("01",CLOSED,"02",CLOSED),
- },
- "", null);
-
- test.checkAdd ("-b %c{'a'}", ch, 'c', 1, "-b ",
- new RngCheck[] { new RngCheck('a') },
- "", null);
- test.checkAdd ("-b %c{'\\n', '\\002', 'B'}", ch, 'c', 1, "-b ",
- new RngCheck[] { new RngCheck('\n'),
- new RngCheck('\002'),
- new RngCheck('B') },
- "", null);
- test.checkAdd ("-b %c{'q',('g','a'], ['\t','\\003']}",
- ch, 'c', 1, "-b ",
- new RngCheck[]
- { new RngCheck('q'),
- new RngCheck('a',CLOSED,'g',OPEN),
- new RngCheck('\003',CLOSED,'\t',CLOSED),
- },
- "", null);
-
- test.checkAdd ("-b %b{true}X2", b3, 'b', 2, "-b ",
- new RngCheck[] { new RngCheck(true) },
- "", null);
- test.checkAdd ("-b %b{ true , false, true }", bh, 'b', 1, "-b ",
- new RngCheck[] { new RngCheck(true),
- new RngCheck(false),
- new RngCheck(true) },
- "", null);
- test.checkAdd ("-b %v{true,[true,false)}", bh,
- "Sub ranges not supported for %b or %v");
- test.checkAdd ("-b %v{true,[]}", bh,
- "Sub ranges not supported for %b or %v");
- test.checkAdd ("-b %b{tru}", bh,
- "Malformed boolean 'tru}' in range spec");
-
- test.checkAdd ("-b %iX2", i3, 'i', 2, "-b ", null, "", null);
- test.checkAdd ("-b %vX3", b3, 'v', 3, "-b ", null, "", null);
- test.checkAdd ("-b %v{ }X3", b3, 'v', 3, "-b ", null, "", null);
-
- test.checkAdd ("-b=%iX2", i3, 'i', 2, "-b", null, "",
-"Multiplier value incompatible with one word option -b=");
- test.checkAdd ("-b %iX0", i3, 'i', 0, "-b ", null, "",
- "Value multiplier number must be > 0");
- test.checkAdd ("-b %iX-6", i3, 'i', 0, "-b ", null, "",
- "Value multiplier number must be > 0");
- test.checkAdd ("-b %iXy", i3, 'i', 0, "-b ", null, "",
- "Malformed value multiplier");
- test.checkAdd ("-b %iX4", i3, 'i', 4, "-b ", null, "",
- "Result holder array must have a length >= 4");
- test.checkAdd ("-b %iX4", ih, 'i', 4, "-b ", null, "",
-"Multiplier requires result holder to be an array of length >= 4");
-
- test.checkAdd ("-b %i #X4", ih, 'i', 1, "-b ", null, "X4", null);
- test.checkAdd ("-b %i #[}X4",ih, 'i', 1, "-b ", null, "[}X4", null);
-
-// test.checkPrintHelp("");
-// test.checkPrintUsage("");
-
- test = new ArgParserTest();
-
- test.checkAdd (
- "-intarg %i{1,2,(9,18],[22,27],[33,38),(45,48)} #test int arg",
- ih, 'i', 1, "-intarg ",
- new RngCheck[]
- { new RngCheck (1),
- new RngCheck (2),
- new RngCheck (9,OPEN,18,CLOSED),
- new RngCheck (22,CLOSED,27,CLOSED),
- new RngCheck (33,CLOSED,38,OPEN),
- new RngCheck (45,OPEN,48,OPEN),
- },
- "test int arg", null);
-
- MTest[] tests;
-
- tests = new MTest[]
- {
- new MTest("-intarg 1", new Long(1) ),
- new MTest("-intarg 3", new MErr ('r', "3") ),
- new MTest("-intarg 9", new MErr ('r', "9") ),
- new MTest("-intarg 11", new Long(11) ),
- new MTest("-intarg 18", new Long(18)),
- new MTest("-intarg 22", new Long(22)),
- new MTest("-intarg 25", new Long(25)),
- new MTest("-intarg 27", new Long(27)),
- new MTest("-intarg 33", new Long(33)),
- new MTest("-intarg 35", new Long(35)),
- new MTest("-intarg 38", new MErr ('r', "38") ),
- new MTest("-intarg 45", new MErr ('r', "45")),
- new MTest("-intarg 46", new Long(46)),
- new MTest("-intarg 48", new MErr ('r', "48")),
- new MTest("-intarg 100", new MErr ('r', "100")),
- new MTest("-intarg 0xbeef", new MErr ('r', "0xbeef")),
- new MTest("-intarg 0x2f", new Long (0x2f)),
- new MTest("-intarg 041", new Long(041) ),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-farg %f{1,2,(9,18],[22,27],[33,38),(45,48)} #test float arg",
- dh, 'f', 1, "-farg ",
- new RngCheck[]
- {
- new RngCheck (1.0),
- new RngCheck (2.0),
- new RngCheck (9.0,OPEN,18.0,CLOSED),
- new RngCheck (22.0,CLOSED,27.0,CLOSED),
- new RngCheck (33.0,CLOSED,38.0,OPEN),
- new RngCheck (45.0,OPEN,48.0,OPEN),
- },
- "test float arg", null);
-
- tests = new MTest[]
- {
- new MTest("-farg 1", new Double(1)),
- new MTest("-farg 3", new MErr('r', "3")),
- new MTest("-farg 9", new MErr('r', "9")),
- new MTest("-farg 9.0001", new Double(9.0001)),
- new MTest("-farg 11", new Double(11)),
- new MTest("-farg 18", new Double(18)),
- new MTest("-farg 22", new Double(22)),
- new MTest("-farg 25", new Double(25)),
- new MTest("-farg 27", new Double(27)),
- new MTest("-farg 33", new Double(33)),
- new MTest("-farg 35", new Double(35)),
- new MTest("-farg 37.9999",new Double(37.9999)),
- new MTest("-farg 38", new MErr('r', "38")),
- new MTest("-farg 45", new MErr('r', "45")),
- new MTest("-farg 45.0001", new Double(45.0001)),
- new MTest("-farg 46",new Double(46)),
- new MTest("-farg 47.9999",new Double(47.9999)),
- new MTest("-farg 48", new MErr('r', "48")),
- new MTest("-farg 100", new MErr('r', "100")),
- new MTest("-farg 0", new MErr('r', "0")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-sarg %s{1,2,(AA,AZ],[BB,BX],[C3,C8),(d5,d8)} #test string arg",
- s3, 's', 1, "-sarg ",
- new RngCheck[]
- { new RngCheck ("1"),
- new RngCheck ("2"),
- new RngCheck ("AA",OPEN,"AZ",CLOSED),
- new RngCheck ("BB",CLOSED,"BX",CLOSED),
- new RngCheck ("C3",CLOSED,"C8",OPEN),
- new RngCheck ("d5",OPEN,"d8",OPEN),
- },
- "test string arg", null);
-
- tests = new MTest[]
- {
- new MTest ("-sarg 1", "1"),
- new MTest ("-sarg 3", new MErr('r',"3")),
- new MTest ("-sarg AA", new MErr('r',"AA")),
- new MTest ("-sarg AM", "AM"),
- new MTest ("-sarg AZ", "AZ"),
- new MTest ("-sarg BB", "BB"),
- new MTest ("-sarg BL", "BL"),
- new MTest ("-sarg BX", "BX"),
- new MTest ("-sarg C3", "C3"),
- new MTest ("-sarg C6", "C6"),
- new MTest ("-sarg C8", new MErr('r',"C8")),
- new MTest ("-sarg d5", new MErr('r',"d5")),
- new MTest ("-sarg d6", "d6"),
- new MTest ("-sarg d8", new MErr('r',"d8")),
- new MTest ("-sarg zzz", new MErr('r',"zzz")),
- new MTest ("-sarg 0", new MErr('r',"0")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test = new ArgParserTest();
-
- test.checkAdd (
- "-carg %c{1,2,(a,z],['A','Z'],['\\001',\\007),(4,8)}",
- c3, 'c', 1, "-carg ",
- new RngCheck[]
- { new RngCheck ('1'),
- new RngCheck ('2'),
- new RngCheck ('a',OPEN,'z',CLOSED),
- new RngCheck ('A',CLOSED,'Z',CLOSED),
- new RngCheck ('\001',CLOSED,'\007',OPEN),
- new RngCheck ('4',OPEN,'8',OPEN),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-carg 1", new Character('1')),
- new MTest ("-carg 3", new MErr('r',"3")),
- new MTest ("-carg a", new MErr('r',"a")),
- new MTest ("-carg m", new Character('m')),
- new MTest ("-carg z", new Character('z')),
- new MTest ("-carg A", new Character('A')),
- new MTest ("-carg 'L'", new Character('L')),
- new MTest ("-carg 'Z'", new Character('Z')),
- new MTest ("-carg \\001", new Character('\001')),
- new MTest ("-carg \\005", new Character('\005')),
- new MTest ("-carg '\\007'", new MErr('r',"'\\007'")),
- new MTest ("-carg '4'", new MErr('r',"'4'")),
- new MTest ("-carg 6", new Character('6')),
- new MTest ("-carg 8", new MErr('r',"8")),
- new MTest ("-carg '\\012'", new MErr('r',"'\\012'")),
- new MTest ("-carg 0", new MErr('r',"0")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-foo=%i{[-50,100]}", ih, 'i', 1, "-foo=",
- new RngCheck[]
- { new RngCheck (-50,CLOSED,100,CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-foo=-51", new MErr('r',"-51")),
- new MTest ("-foo=-0x32", new Long(-0x32)),
- new MTest ("-foo=-0x33", new MErr('r',"-0x33")),
- new MTest ("-foo=-0777", new MErr('r',"-0777")),
- new MTest ("-foo=-07", new Long(-07)),
- new MTest ("-foo=0", new Long(0)),
- new MTest ("-foo=100", new Long(100)),
- new MTest ("-foo=0x5e", new Long(0x5e)),
- new MTest ("-foo=066", new Long(066)),
- new MTest ("-foo=06677", new MErr('r',"06677")),
- new MTest ("-foo=0xbeef", new MErr('r',"0xbeef")),
- new MTest ("-foo=foo", new MErr('m',"foo")),
- new MTest ("-foo=-51d", new MErr('m',"-51d")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-foo2=%i", ih, 'i', 1, "-foo2=", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-foo2=-51", new Long(-51)),
- new MTest ("-foo2=-0x33", new Long(-0x33)),
- new MTest ("-foo2=-0777", new Long(-0777)),
- new MTest ("-foo2=06677", new Long(06677)),
- new MTest ("-foo2=0xbeef", new Long(0xbeef)),
- new MTest ("-foo2=foo", new MErr('m',"foo")),
- new MTest ("-foo2=-51d", new MErr('m',"-51d")),
- new MTest ("-foo2=-51", new Long(-51)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-foo3 %iX3", i3, 'i', 3, "-foo3 ", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-foo3 -51 678 0x45",
- new long[] { -51, 678, 0x45 }),
- new MTest ("-foo3 55 16f 55", new MErr ('m', "16f")),
- new MTest ("-foo3 55 16", new MErr ('v', "3")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- Vector<String> vec = new Vector<String>(100);
-
- test.checkAdd ("-foov3 %iX3", vec,'i',3,"-foov3 ",null,"",null);
- tests = new MTest[]
- { new MTest ("-foov3 -1 2 4", new long[] {-1, 2, 4}, 0),
- new MTest ("-foov3 10 3 9", new long[] {10, 3, 9}, 1),
- new MTest ("-foov3 123 1 0", new long[] {123, 1, 0}, 2),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
- test.checkAdd ("-foov %i", vec,'i',1,"-foov ",null,"",null);
- tests = new MTest[]
- { new MTest ("-foov 11", new Long(11), 0),
- new MTest ("-foov 12", new Long(12), 1),
- new MTest ("-foov 13", new Long(13), 2),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-foo4 %i{[-50,100]}X2", i3, 'i', 2, "-foo4 ",
- new RngCheck[]
- { new RngCheck (-50,CLOSED,100,CLOSED),
- },
- "", null);
- tests = new MTest[]
- {
- new MTest ("-foo4 -49 78",
- new long[] { -49, 78 }),
- new MTest ("-foo4 -48 102", new MErr ('r', "102")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-oct=%o{[-062,0144]}", ih, 'o', 1, "-oct=",
- new RngCheck[]
- { new RngCheck (-50,CLOSED,100,CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-oct=-063", new MErr('r',"-063")),
- new MTest ("-oct=-0x32", new MErr('m',"-0x32")),
- new MTest ("-oct=-0777", new MErr('r',"-0777")),
- new MTest ("-oct=-07", new Long(-07)),
- new MTest ("-oct=0", new Long(0)),
- new MTest ("-oct=100", new Long(64)),
- new MTest ("-oct=0xae", new MErr('m',"0xae")),
- new MTest ("-oct=66", new Long(066)),
- new MTest ("-oct=06677", new MErr('r',"06677")),
- new MTest ("-oct=0xbeef", new MErr('m',"0xbeef")),
- new MTest ("-oct=foo", new MErr('m',"foo")),
- new MTest ("-oct=-51d", new MErr('m',"-51d")),
- new MTest ("-oct=78", new MErr('m',"78")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-oct2=%o", ih, 'o', 1, "-oct2=", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-oct2=-063", new Long(-063)),
- new MTest ("-oct2=-0777", new Long(-0777)),
- new MTest ("-oct2=06677", new Long(06677)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd (
- "-dec=%d{[-0x32,0x64]}", ih, 'd', 1, "-dec=",
- new RngCheck[]
- { new RngCheck (-50,CLOSED,100,CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-dec=-063", new MErr('r',"-063")),
- new MTest ("-dec=-0x32", new MErr('m',"-0x32")),
- new MTest ("-dec=-0777", new MErr('r',"-0777")),
- new MTest ("-dec=-07", new Long(-07)),
- new MTest ("-dec=0", new Long(0)),
- new MTest ("-dec=100", new Long(100)),
- new MTest ("-dec=0xae", new MErr('m',"0xae")),
- new MTest ("-dec=66", new Long(66)),
- new MTest ("-dec=06677", new MErr('r',"06677")),
- new MTest ("-dec=0xbeef", new MErr('m',"0xbeef")),
- new MTest ("-dec=foo", new MErr('m',"foo")),
- new MTest ("-dec=-51d", new MErr('m',"-51d")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-dec2=%d", ih, 'd', 1, "-dec2=", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-dec2=-063", new Long(-63)),
- new MTest ("-dec2=-0777", new Long(-777)),
- new MTest ("-dec2=06677", new Long(6677)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd (
- "-hex=%x{[-0x32,0x64]}", ih, 'x', 1, "-hex=",
- new RngCheck[]
- { new RngCheck (-50,CLOSED,100,CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-hex=-06", new Long(-0x6)),
- new MTest ("-hex=-0x3g2", new MErr('m',"-0x3g2")),
- new MTest ("-hex=-0777", new MErr('r',"-0777")),
- new MTest ("-hex=-017", new Long(-0x17)),
- new MTest ("-hex=0", new Long(0)),
- new MTest ("-hex=64", new Long(0x64)),
- new MTest ("-hex=5e", new Long(0x5e)),
- new MTest ("-hex=66", new MErr('r',"66")),
- new MTest ("-hex=06677", new MErr('r',"06677")),
- new MTest ("-hex=0xbeef", new MErr('m',"0xbeef")),
- new MTest ("-hex=foo", new MErr('m',"foo")),
- new MTest ("-hex=-51d", new MErr('r',"-51d")),
- new MTest ("-hex=-51g", new MErr('m',"-51g")),
- new MTest ("-hex=", new MErr('c',"")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-hex2=%x", ih, 'x', 1, "-hex2=", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-hex2=-0777", new Long(-0x777)),
- new MTest ("-hex2=66", new Long(0x66)),
- new MTest ("-hex2=06677", new Long(0x6677)),
- new MTest ("-hex2=-51d", new Long(-0x51d)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd (
- "-char=%c{['b','m']}", ch, 'c', 1, "-char=",
- new RngCheck[]
- { new RngCheck ('b',CLOSED,'m',CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-char=a", new MErr('r',"a")),
- new MTest ("-char=b", new Character('b')),
- new MTest ("-char='b'", new Character('b')),
- new MTest ("-char='\142'", new Character('b')),
- new MTest ("-char='\141'", new MErr('r',"'\141'")),
- new MTest ("-char=\142", new Character('b')),
- new MTest ("-char=\141", new MErr('r',"\141")),
- new MTest ("-char=m", new Character('m')),
- new MTest ("-char=z", new MErr('r', "z")),
- new MTest ("-char=bb", new MErr('m', "bb")),
- new MTest ("-char='b", new MErr('m', "'b")),
- new MTest ("-char='", new MErr('m', "'")),
- new MTest ("-char=a'", new MErr('m', "a'")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-char2=%c", ch, 'c', 1, "-char2=",null,"",null);
- tests = new MTest[]
- {
- new MTest ("-char2=a", new Character('a')),
- new MTest ("-char2='\141'", new Character('\141')),
- new MTest ("-char2=\141", new Character('\141')),
- new MTest ("-char2=z", new Character('z')),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-charv3 %cX3", vec,'c',3,"-charv3 ",null,"",null);
- tests = new MTest[]
- { new MTest ("-charv3 a b c", new char[] {'a', 'b', 'c'}, 0),
- new MTest ("-charv3 'g' f '\\n'", new char[]{'g','f','\n'}, 1),
- new MTest ("-charv3 1 \001 3", new char[] {'1', '\001', '3'}, 2),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
- test.checkAdd ("-charv=%c", vec,'c',1,"-charv=",null,"",null);
- tests = new MTest[]
- { new MTest ("-charv=d", new Character('d'), 0),
- new MTest ("-charv='g'", new Character('g'), 1),
- new MTest ("-charv=\111", new Character('\111'), 2),
- };
- vec.clear();
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd (
- "-bool=%b{true}", bh, 'b', 1, "-bool=",
- new RngCheck[]
- { new RngCheck (true),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-bool=true", new Boolean(true)),
- new MTest ("-bool=false", new MErr('r', "false")),
- new MTest ("-bool=fals", new MErr('m', "fals")),
- new MTest ("-bool=falsem", new MErr('m', "falsem")),
- new MTest ("-bool=truex", new MErr('m', "truex")),
- new MTest ("-bool=foo", new MErr('m', "foo")),
- new MTest ("-bool=1", new MErr('m', "1")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd (
- "-boo2=%b{true,false}", bh, 'b', 1, "-boo2=",
- new RngCheck[]
- { new RngCheck (true),
- new RngCheck (false),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-boo2=true", new Boolean(true)),
- new MTest ("-boo2=false", new Boolean(false)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-boo3=%b", bh, 'b', 1, "-boo3=", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-boo3=true", new Boolean(true)),
- new MTest ("-boo3=false", new Boolean(false)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-boo3 %bX3", b3, 'b', 3, "-boo3 ", null, "", null);
- tests = new MTest[]
- {
- new MTest ("-boo3 true false true",
- new boolean[] { true, false, true }),
- new MTest ("-boo3 true fals true", new MErr ('m', "fals")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd ("-boov3 %bX3", vec,'b',3,"-boov3 ",null,"",null);
- tests = new MTest[]
- { new MTest ("-boov3 true true false",
- new boolean [] { true, true, false }, 0),
- new MTest ("-boov3 false false true",
- new boolean [] { false, false, true }, 1),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
- test.checkAdd ("-boov %b", vec,'b',1,"-boov ",null,"",null);
- tests = new MTest[]
- { new MTest ("-boov true", new Boolean (true), 0),
- new MTest ("-boov false", new Boolean (false), 1),
- new MTest ("-boov true", new Boolean (true), 2),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
-
-
- test.checkAdd ("-v3 %vX2", b3, 'v', 2, "-v3 ", null, "", null);
- tests = new MTest[]
- { new MTest ("-v3", new boolean[] { true, true }),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-vf %v{false,true}X2", b3, 'v', 2, "-vf ",
- new RngCheck[]
- { new RngCheck(false),
- new RngCheck(true),
- },
- "", null);
- tests = new MTest[]
- { new MTest ("-vf", new boolean[] { false, false }),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd (
- "-str=%s{(john,zzzz]}", sh, 's', 1, "-str=",
- new RngCheck[]
- { new RngCheck ("john", OPEN, "zzzz", CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-str=john", new MErr ('r', "john")),
- new MTest ("-str=joho ", "joho "),
- new MTest ("-str=joho ", "joho "),
- new MTest ("-str=zzzz", "zzzz"),
- new MTest ("-str= joho", new MErr ('r', " joho")),
- new MTest ("-str=jnhn ", new MErr ('r', "jnhn ")),
- new MTest ("-str=zzzzz", new MErr ('r', "zzzzz")),
- new MTest ("-str=\"joho\"", new MErr ('r', "\"joho\"")),
- new MTest ("-str=\"joho", new MErr('r', "\"joho")),
- new MTest ("-str=joho j", "joho j"), // new MErr('m', "joho j")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-str2=%s", sh,'s',1,"-str2=",null,"",null);
- tests = new MTest[]
- {
- new MTest ("-str2= jnhn", " jnhn"),
- new MTest ("-str2=zzzzz", "zzzzz"),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-str3 %sX3",s3,'s',3,"-str3 ",null,"",null);
- tests = new MTest[]
- {
- new MTest ("-str3 foo bar johnny",
- new String[] { "foo", "bar", "johnny" }),
- new MTest ("-str3 zzzzz \"bad foo",
- new String[] { "zzzzz", "\"bad", "foo"
- }), // new MErr('m', "\"bad")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd ("-strv3 %sX3", vec,'s',3,"-strv3 ",null,"",null);
- tests = new MTest[]
- { new MTest ("-strv3 foo bar \"hihi\"",
- new String[] {"foo", "bar", "\"hihi\""}, 0),
- new MTest ("-strv3 a 123 gg",
- new String[]{"a", "123", "gg"}, 1),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
- test.checkAdd ("-strv=%s", vec,'s',1,"-strv=",null,"",null);
- tests = new MTest[]
- { new MTest ("-strv=d", "d", 0),
- new MTest ("-strv='g'", "'g'", 1),
- new MTest ("-strv=\\111", "\\111", 2),
- };
- vec.clear();
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd (
- "-float=%f{(-0.001,1000.0]}", dh, 'f', 1, "-float=",
- new RngCheck[]
- { new RngCheck (-0.001, OPEN, 1000.0, CLOSED),
- },
- "", null);
-
- tests = new MTest[]
- {
- new MTest ("-float=-0.000999", new Double(-0.000999)),
- new MTest ("-float=1e-3", new Double(0.001)),
- new MTest ("-float=12.33e1", new Double(123.3)),
- new MTest ("-float=1e3", new Double(1e3)),
- new MTest ("-float=1000.000", new Double(1000.0)),
- new MTest ("-float=-0.001", new MErr('r', "-0.001")),
- new MTest ("-float=-1e-3", new MErr('r', "-1e-3")),
- new MTest ("-float=1000.001", new MErr('r', "1000.001")),
- new MTest ("-float=.", new MErr('m', ".")),
- new MTest ("-float= 124.5 ", new Double (124.5)),
- new MTest ("-float=124.5x", new MErr('m', "124.5x")),
- new MTest ("-float= foo ", new MErr('m', " foo ")),
- new MTest ("-float=1e1", new Double(10)),
- new MTest ("-float=1e ", new MErr('m', "1e ")),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-float2=%f", dh,'f',1,"-float2=",null,"",null);
- tests = new MTest[]
- {
- new MTest ("-float2=-0.001", new Double(-0.001)),
- new MTest ("-float2=-1e-3", new Double(-1e-3)),
- new MTest ("-float2=1000.001", new Double(1000.001)),
- };
- test.checkMatches (tests, ONE_WORD);
-
- test.checkAdd ("-f3 %fX3", d3,'f',3,"-f3 ",null,"",null);
- tests = new MTest[]
- {
- new MTest ("-f3 -0.001 1.23e5 -9.88e-4",
- new double[] { -0.001, 1.23e5, -9.88e-4 }),
- new MTest ("-f3 7.88 foo 9.0", new MErr ('m', "foo")),
- new MTest ("-f3 7.88 . 9.0", new MErr ('m', ".")),
- new MTest ("-f3 7.88 3.0 9.0x", new MErr ('m', "9.0x")),
- };
- test.checkMatches (tests, MULTI_WORD);
-
- test.checkAdd ("-fv3 %fX3", vec,'f',3,"-fv3 ",null,"",null);
- tests = new MTest[]
- { new MTest ("-fv3 1.0 3.444 6.7",
- new double[] {1.0, 3.444, 6.7}, 0),
- new MTest ("-fv3 13e-5 145.678 0.0001e45",
- new double[]{13e-5, 145.678, 0.0001e45}, 1),
- new MTest ("-fv3 11.11 3.1245 -1e-4",
- new double[] {11.11, 3.1245, -1e-4}, 2),
- new MTest ("-fv3 1.0 2 3",
- new double[] { 1.0, 2.0, 3.0 }, 3),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
- test.checkAdd ("-fv %f", vec,'f',1,"-fv ",null,"",null);
- tests = new MTest[]
- { new MTest ("-fv -15.1234", new Double(-15.1234), 0),
- new MTest ("-fv -1.234e-7", new Double(-1.234e-7), 1),
- new MTest ("-fv 0.001111", new Double(0.001111), 2),
- };
- vec.clear();
- test.checkMatches (tests, MULTI_WORD);
-
-
- IntHolder intHolder = new IntHolder();
- StringHolder strHolder = new StringHolder();
-
- ArgParser parser = new ArgParser ("test");
- parser.addOption ("-foo %d #an int", intHolder);
- parser.addOption ("-bar %s #a string", strHolder);
- args = new String[]
- { "zzz", "-cat", "-foo", "123", "yyy", "-bar", "xxxx", "xxx"
- };
-
- String[] unmatchedCheck = new String[]
- { "zzz", "-cat", "yyy", "xxx"
- };
-
- String[] unmatched = parser.matchAllArgs (args, 0, 0);
- test.checkStringArray (
- "Unmatched args:", unmatched, unmatchedCheck);
-
- vec.clear();
- for (int i=0; i<args.length; )
- { try
- { i = parser.matchArg (args, i);
- if (parser.getUnmatchedArgument() != null)
- { vec.add (parser.getUnmatchedArgument());
- }
- }
- catch (Exception e)
- {
- }
- }
- unmatched = (String[])vec.toArray(new String[0]);
- test.checkStringArray (
- "My unmatched args:", unmatched, unmatchedCheck);
-
- System.out.println ("\nPassed\n");
-
- }
+public class ArgParserTest {
+ ArgParser parser;
+
+ static final boolean CLOSED = true;
+ static final boolean OPEN = false;
+
+ static final boolean ONE_WORD = true;
+ static final boolean MULTI_WORD = false;
+
+ private static void verify(boolean ok, String msg) {
+ if (!ok) {
+ Throwable e = new Throwable();
+ System.out.println("Verification failed:" + msg);
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static String[] argsFromString(String s) {
+ Vector<String> vec = new Vector<String>(100);
+ try {
+ ArgParser.stringToArgs(vec, s, /* allowQuotedStings= */false);
+ } catch (StringScanException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ String[] result = new String[vec.size()];
+ for (int i = 0; i < vec.size(); i++) {
+ result[i] = (String) vec.get(i);
+ }
+ return result;
+ }
+
+ static class RngCheck {
+ ArgParser.RangePnt low = null;
+ ArgParser.RangePnt high = null;
+ int type;
+
+ RngCheck(String s) {
+ low = new ArgParser.RangePnt(s, CLOSED);
+ type = 's';
+ }
+
+ RngCheck(double d) {
+ low = new ArgParser.RangePnt(d, CLOSED);
+ type = 'd';
+ }
+
+ RngCheck(long l) {
+ low = new ArgParser.RangePnt(l, CLOSED);
+ type = 'l';
+ }
+
+ RngCheck(boolean b) {
+ low = new ArgParser.RangePnt(b, CLOSED);
+ type = 'b';
+ }
+
+ RngCheck(String s1, boolean c1, String s2, boolean c2) {
+ low = new ArgParser.RangePnt(s1, c1);
+ high = new ArgParser.RangePnt(s2, c2);
+ type = 's';
+ }
+
+ RngCheck(double d1, boolean c1, double d2, boolean c2) {
+ low = new ArgParser.RangePnt(d1, c1);
+ high = new ArgParser.RangePnt(d2, c2);
+ type = 'd';
+ }
+
+ RngCheck(long l1, boolean c1, long l2, boolean c2) {
+ low = new ArgParser.RangePnt(l1, c1);
+ high = new ArgParser.RangePnt(l2, c2);
+ type = 'l';
+ }
+
+ void check(ArgParser.RangeAtom ra) {
+ verify((ra.low == null) == (low == null), "(ra.low==null)="
+ + (ra.low == null) + "(low==null)=" + (low == null));
+ verify((ra.high == null) == (high == null), "(ra.high==null)="
+ + (ra.high == null) + "(high==null)=" + (high == null));
+
+ if (ra.low != null) {
+ switch (type) {
+ case 'l': {
+ verify(ra.low.lval == low.lval, "ra.low=" + ra.low
+ + " low=" + low);
+ break;
+ }
+ case 'd': {
+ verify(ra.low.dval == low.dval, "ra.low=" + ra.low
+ + " low=" + low);
+ break;
+ }
+ case 's': {
+ verify(ra.low.sval.equals(low.sval), "ra.low=" + ra.low
+ + " low=" + low);
+ break;
+ }
+ case 'b': {
+ verify(ra.low.bval == low.bval, "ra.low=" + ra.low
+ + " low=" + low);
+ break;
+ }
+ }
+ verify(ra.low.closed == low.closed, "ra.low=" + ra.low
+ + " low=" + low);
+ }
+ if (ra.high != null) {
+ switch (type) {
+ case 'l': {
+ verify(ra.high.lval == high.lval, "ra.high=" + ra.high
+ + " high=" + high);
+ break;
+ }
+ case 'd': {
+ verify(ra.high.dval == high.dval, "ra.high=" + ra.high
+ + " high=" + high);
+ break;
+ }
+ case 's': {
+ verify(ra.high.sval.equals(high.sval), "ra.high=" + ra.high
+ + " high=" + high);
+ break;
+ }
+ case 'b': {
+ verify(ra.high.bval == high.bval, "ra.high=" + ra.high
+ + " high=" + high);
+ break;
+ }
+ }
+ verify(ra.high.closed == high.closed, "ra.high=" + ra.high
+ + " high=" + high);
+ }
+ }
+ }
+
+ ArgParserTest() {
+ parser = new ArgParser("fubar");
+ }
+
+ static void checkException(Exception e, String errmsg) {
+ if (errmsg != null) {
+ if (!e.getMessage().equals(errmsg)) {
+ System.out.println("Expecting exception '" + errmsg
+ + "' but got '" + e.getMessage() + "'");
+ e.printStackTrace();
+ (new Throwable()).printStackTrace();
+ System.exit(1);
+ }
+ } else {
+ System.out.println("Unexpected exception '" + e.getMessage() + "'");
+ e.printStackTrace();
+ (new Throwable()).printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ void checkPrintHelp(String msg) {
+ ByteArrayOutputStream buf = new ByteArrayOutputStream(0x10000);
+ PrintStream ps = new PrintStream(buf);
+ ps.println(parser.getHelpMessage());
+ System.out.print(buf.toString());
+ }
+
+ // void checkGetSynopsis (String msg)
+ // {
+ // ByteArrayOutputStream buf = new ByteArrayOutputStream(0x10000);
+ // PrintStream ps = new PrintStream(buf);
+ // parser.printSynopsis (ps, 80);
+ // System.out.print (buf.toString());
+ // }
+
+ void checkAdd(String s, Object resHolder, String errmsg) {
+ checkAdd(s, resHolder, 0, 0, null, null, null, errmsg);
+ }
+
+ void add(String s, Object resHolder) {
+ try {
+ parser.addOption(s, resHolder);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ void checkStringArray(String msg, String[] strs, String[] check) {
+ boolean dontMatch = false;
+ if (strs.length != check.length) {
+ dontMatch = true;
+ } else {
+ for (int i = 0; i < strs.length; i++) {
+ if (!strs[i].equals(check[i])) {
+ dontMatch = true;
+ break;
+ }
+ }
+ }
+ if (dontMatch) {
+ System.out.println(msg);
+ System.out.print("Expected: ");
+ for (int i = 0; i < check.length; i++) {
+ System.out.print("'" + check[i] + "'");
+ if (i < check.length - 1) {
+ System.out.print(" ");
+ }
+ }
+ System.out.println("");
+ System.out.print("Got: ");
+ for (int i = 0; i < strs.length; i++) {
+ System.out.print("'" + strs[i] + "'");
+ if (i < strs.length - 1) {
+ System.out.print(" ");
+ }
+ }
+ System.out.println("");
+ System.exit(1);
+ }
+ }
+
+ void checkAdd(String s, Object resHolder, int code, int numValues,
+ Object names, RngCheck[] rngCheck, String helpMsg, String errmsg) {
+ boolean exceptionThrown = false;
+ String[] namelist = null;
+ try {
+ parser.addOption(s, resHolder);
+ } catch (Exception e) {
+ exceptionThrown = true;
+ checkException(e, errmsg);
+ }
+ if (names instanceof String) {
+ namelist = new String[] { (String) names };
+ } else {
+ namelist = (String[]) names;
+ }
+ if (!exceptionThrown) {
+ verify(errmsg == null, "Expecting exception " + errmsg);
+ ArgParser.Record rec = parser.lastMatchRecord();
+ verify(rec.convertCode == code, "code=" + rec.convertCode
+ + ", expecting " + code);
+ ArgParser.NameDesc nd;
+ int i = 0;
+ for (nd = rec.firstNameDesc(); nd != null; nd = nd.next) {
+ i++;
+ }
+ verify(i == namelist.length, "numNames=" + i + ", expecting "
+ + namelist.length);
+ i = 0;
+ for (nd = rec.firstNameDesc(); nd != null; nd = nd.next) {
+ String ss;
+ if (!nd.oneWord) {
+ ss = new String(nd.name) + ' ';
+ } else {
+ ss = nd.name;
+ }
+ verify(ss.equals(namelist[i]), "have name '" + ss
+ + "', expecting '" + namelist[i] + "'");
+ i++;
+ }
+ ArgParser.RangeAtom ra;
+ i = 0;
+ for (ra = rec.firstRangeAtom(); ra != null; ra = ra.next) {
+ i++;
+ }
+ int expectedRangeNum = 0;
+ if (rngCheck != null) {
+ expectedRangeNum = rngCheck.length;
+ }
+ verify(i == expectedRangeNum, "numRangeAtoms=" + i + ", expecting "
+ + expectedRangeNum);
+ i = 0;
+ for (ra = rec.firstRangeAtom(); ra != null; ra = ra.next) {
+ rngCheck[i++].check(ra);
+ }
+ verify(rec.helpMsg.equals(helpMsg), "helpMsg=" + rec.helpMsg
+ + ", expecting " + helpMsg);
+ verify(rec.numValues == numValues, "numValues=" + rec.numValues
+ + ", expecting " + numValues);
+ }
+ }
+
+ double getDoubleValue(Object obj, int k) {
+ if (obj instanceof DoubleHolder) {
+ return ((DoubleHolder) obj).value;
+ } else if (obj instanceof FloatHolder) {
+ return ((FloatHolder) obj).value;
+ } else if (obj instanceof double[]) {
+ return ((double[]) obj)[k];
+ } else if (obj instanceof float[]) {
+ return ((float[]) obj)[k];
+ } else {
+ verify(false, "object doesn't contain double values");
+ return 0;
+ }
+ }
+
+ long getLongValue(Object obj, int k) {
+ if (obj instanceof LongHolder) {
+ return ((LongHolder) obj).value;
+ } else if (obj instanceof IntHolder) {
+ return ((IntHolder) obj).value;
+ } else if (obj instanceof long[]) {
+ return ((long[]) obj)[k];
+ } else if (obj instanceof int[]) {
+ return ((int[]) obj)[k];
+ } else {
+ verify(false, "object doesn't contain long values");
+ return 0;
+ }
+ }
+
+ String getStringValue(Object obj, int k) {
+ if (obj instanceof StringHolder) {
+ return ((StringHolder) obj).value;
+ } else if (obj instanceof String[]) {
+ return ((String[]) obj)[k];
+ } else {
+ verify(false, "object doesn't contain String values");
+ return null;
+ }
+ }
+
+ boolean getBooleanValue(Object obj, int k) {
+ if (obj instanceof BooleanHolder) {
+ return ((BooleanHolder) obj).value;
+ } else if (obj instanceof boolean[]) {
+ return ((boolean[]) obj)[k];
+ } else {
+ verify(false, "object doesn't contain boolean values");
+ return false;
+ }
+ }
+
+ char getCharValue(Object obj, int k) {
+ if (obj instanceof CharHolder) {
+ return ((CharHolder) obj).value;
+ } else if (obj instanceof char[]) {
+ return ((char[]) obj)[k];
+ } else {
+ verify(false, "object doesn't contain char values");
+ return 0;
+ }
+ }
+
+ static class MErr {
+ int code;
+ String valStr;
+
+ MErr(int code, String valStr) {
+ this.code = code;
+ this.valStr = valStr;
+ }
+ }
+
+ static class MTest {
+ String args;
+ Object result;
+ int resultIdx;
+
+ MTest(String args, Object result) {
+ this(args, result, -1);
+ }
+
+ MTest(String args, Object result, int resultIdx) {
+ this.args = args;
+ this.result = result;
+ this.resultIdx = resultIdx;
+ }
+ };
+
+ void checkMatch(String args[], int idx, String errMsg) {
+ getMatchResult(args, idx, -1, errMsg, -1);
+ }
+
+ void checkMatch(String args[], int idx, int cnt, long check, int resultIdx) {
+ Object rholder = getMatchResult(args, idx, cnt, null, resultIdx);
+ long result = getLongValue(rholder, 0);
+ verify(result == check, "result " + result + " vs. " + check);
+ }
+
+ void checkMatch(String args[], int idx, int cnt, double check, int resultIdx) {
+ Object rholder = getMatchResult(args, idx, cnt, null, resultIdx);
+ double result = getDoubleValue(rholder, 0);
+ verify(result == check, "result " + result + " vs. " + check);
+ }
+
+ void checkMatch(String args[], int idx, int cnt, String check, int resultIdx) {
+ Object rholder = getMatchResult(args, idx, cnt, null, resultIdx);
+ String result = getStringValue(rholder, 0);
+ verify(result.equals(check), "result " + result + " vs. " + check);
+ }
+
+ void checkMatch(String args[], int idx, int cnt, boolean check,
+ int resultIdx) {
+ Object rholder = getMatchResult(args, idx, cnt, null, resultIdx);
+ boolean result = getBooleanValue(rholder, 0);
+ verify(result == check, "result " + result + " vs. " + check);
+ }
+
+ void checkMatch(String args[], int idx, int cnt, char check, int resultIdx) {
+ Object rholder = getMatchResult(args, idx, cnt, null, resultIdx);
+ char result = getCharValue(rholder, 0);
+ verify(result == check, "result " + result + " vs. " + check);
+ }
+
+ void checkMatch(String args[], int idx, int cnt, Object checkArray,
+ int resultIdx) {
+ Object rholder = getMatchResult(args, idx, cnt, null, resultIdx);
+ if (!checkArray.getClass().isArray()) {
+ verify(false, "check is not an array");
+ }
+ for (int i = 0; i < Array.getLength(checkArray); i++) {
+ if (checkArray instanceof long[]) {
+ long result = getLongValue(rholder, i);
+ long check = ((long[]) checkArray)[i];
+ verify(result == check, "result [" + i + "] " + result
+ + " vs. " + check);
+ } else if (checkArray instanceof double[]) {
+ double result = getDoubleValue(rholder, i);
+ double check = ((double[]) checkArray)[i];
+ verify(result == check, "result [" + i + "] " + result
+ + " vs. " + check);
+ } else if (checkArray instanceof String[]) {
+ String result = getStringValue(rholder, i);
+ String check = ((String[]) checkArray)[i];
+ verify(result.equals(check), "result [" + i + "] " + result
+ + " vs. " + check);
+ } else if (checkArray instanceof boolean[]) {
+ boolean result = getBooleanValue(rholder, i);
+ boolean check = ((boolean[]) checkArray)[i];
+ verify(result == check, "result [" + i + "] " + result
+ + " vs. " + check);
+ } else if (checkArray instanceof char[]) {
+ char result = getCharValue(rholder, i);
+ char check = ((char[]) checkArray)[i];
+ verify(result == check, "result [" + i + "] " + result
+ + " vs. " + check);
+ } else {
+ verify(false, "unknown type for checkArray");
+ }
+ }
+ }
+
+ void checkMatch(MTest test, boolean oneWord) {
+ String[] argv;
+ if (oneWord) {
+ argv = new String[1];
+ argv[0] = test.args;
+ } else {
+ argv = argsFromString(test.args);
+ }
+ if (test.result instanceof Long) {
+ checkMatch(argv, 0, argv.length, ((Long) test.result).longValue(),
+ test.resultIdx);
+ } else if (test.result instanceof Double) {
+ checkMatch(argv, 0, argv.length,
+ ((Double) test.result).doubleValue(), test.resultIdx);
+ } else if (test.result instanceof String) {
+ checkMatch(argv, 0, argv.length, (String) test.result,
+ test.resultIdx);
+ } else if (test.result instanceof Boolean) {
+ checkMatch(argv, 0, argv.length,
+ ((Boolean) test.result).booleanValue(), test.resultIdx);
+ } else if (test.result instanceof Character) {
+ checkMatch(argv, 0, argv.length,
+ ((Character) test.result).charValue(), test.resultIdx);
+ } else if (test.result.getClass().isArray()) {
+ checkMatch(argv, 0, argv.length, test.result, test.resultIdx);
+ } else if (test.result instanceof MErr) {
+ MErr err = (MErr) test.result;
+ String argname = parser.getOptionName(argv[0]);
+ String msg = "";
+
+ switch (err.code) {
+ case 'c': {
+ msg = "requires a contiguous value";
+ break;
+ }
+ case 'm': {
+ msg = "malformed " + parser.getOptionTypeName(argv[0]) + " '"
+ + err.valStr + "'";
+ break;
+ }
+ case 'r': {
+ msg = "value '" + err.valStr + "' not in range "
+ + parser.getOptionRangeDesc(argv[0]);
+ break;
+ }
+ case 'v': {
+ msg = "requires " + err.valStr + " values";
+ break;
+ }
+ }
+ checkMatch(argv, 0, argname + ": " + msg);
+ } else {
+ verify(false, "Unknown result type");
+ }
+ }
+
+ void checkMatches(MTest[] tests, boolean oneWord) {
+ for (int i = 0; i < tests.length; i++) {
+ checkMatch(tests[i], oneWord);
+ }
+ }
+
+ Object getMatchResult(String args[], int idx, int cnt, String errMsg,
+ int resultIdx) {
+ boolean exceptionThrown = false;
+ int k = 0;
+ try {
+ k = parser.matchArg(args, idx);
+ } catch (Exception e) {
+ exceptionThrown = true;
+ checkException(e, errMsg);
+ }
+ if (!exceptionThrown) {
+ verify(k == idx + cnt, "Expecting result index " + (idx + cnt)
+ + ", got " + k);
+ Object result = parser.getResultHolder(args[0]);
+ if (resultIdx >= 0) {
+ verify(result instanceof Vector,
+ "Expecting result to be stored in a vector");
+ Vector<?> vec = (Vector<?>) result;
+ verify(vec.size() == resultIdx + 1,
+ "Expecting result vector size " + (resultIdx + 1));
+ return vec.get(resultIdx);
+ } else {
+ return result;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Runs a set of tests to verify correct operation of the ArgParser class.
+ * If all the tests run correctly, the program prints the message
+ * <code>Passed</code> and terminates. Otherwise, diagnostic information is
+ * printed at the first point of failure.
+ */
+ public static void main(String[] args) {
+ ArgParserTest test = new ArgParserTest();
+
+ BooleanHolder bh = new BooleanHolder();
+ boolean[] b3 = new boolean[3];
+ CharHolder ch = new CharHolder();
+ char[] c3 = new char[3];
+ IntHolder ih = new IntHolder();
+ int[] i3 = new int[3];
+ LongHolder lh = new LongHolder();
+ long[] l3 = new long[3];
+ FloatHolder fh = new FloatHolder();
+ float[] f3 = new float[3];
+ DoubleHolder dh = new DoubleHolder();
+ double[] d3 = new double[3];
+ StringHolder sh = new StringHolder();
+ String[] s3 = new String[3];
+
+ test.checkAdd(
+ "-foo %i{[0,10)}X3 #sets the value of foo",
+ // 0123456789012345
+ i3, 'i', 3, new String[] { "-foo " },
+ new RngCheck[] { new RngCheck(0, CLOSED, 10, OPEN) },
+ "sets the value of foo", null);
+
+ test.checkAdd("-arg1,,", null, "Null option name given");
+ test.checkAdd("-arg1,,goo %f ", null, "Null option name given");
+ test.checkAdd(" ", null, "Null option name given");
+ test.checkAdd("", null, "Null option name given");
+ test.checkAdd(" %v", null, "Null option name given");
+ test.checkAdd("-foo ", null, "No conversion character given");
+ test.checkAdd("-foo %", null, "No conversion character given");
+ test.checkAdd("foo, aaa bbb ", null, "Names not separated by ','");
+ test.checkAdd(" foo aaa %d", null, "Names not separated by ','");
+ test.checkAdd("-arg1,-b,", null, "Null option name given");
+ test.checkAdd("-arg1,-b", null, "No conversion character given");
+ test.checkAdd("-arg1 ", null, "No conversion character given");
+ test.checkAdd("-arg1, %v", null, "Null option name given");
+ test.checkAdd("-arg1,%v", null, "Null option name given");
+ test.checkAdd("-foo %V", null,
+ "Conversion code 'V' not one of 'iodxcbfsvh'");
+ test.checkAdd("-h %hX5", null, "Multipliers not supported for %h");
+ test.checkAdd("-h %h{}", null, "Ranges not supported for %h");
+ test.checkAdd("-help, -h %h #here is how we help you", null, 'h', 1,
+ new String[] { "-help ", "-h " }, null,
+ "here is how we help you", null);
+
+ test.checkAdd("-arg1 ,-arg2=%d{0,3,(7,16]}X1 #x3 test", l3, 'd', 1,
+ new String[] { "-arg1 ", "-arg2=" }, new RngCheck[] {
+ new RngCheck(0), new RngCheck(3),
+ new RngCheck(7, OPEN, 16, CLOSED), }, "x3 test", null);
+
+ test.checkAdd("bbb,ccc%x{[1,2]} #X3 x3 test", l3, 'x', 1, new String[] {
+ "bbb", "ccc" }, new RngCheck[] { new RngCheck(1, CLOSED, 2,
+ CLOSED), }, "X3 x3 test", null);
+
+ test.checkAdd(" bbb ,ccc, ddd ,e , f=%bX1 #x3 test", b3, 'b', 1,
+ new String[] { "bbb ", "ccc", "ddd ", "e ", "f=" }, null,
+ "x3 test", null);
+
+ test.checkAdd(" bbb ,ccc, ddd ,e , f= %bX3 #x3 test", b3, 'b', 3,
+ new String[] { "bbb ", "ccc ", "ddd ", "e ", "f= " }, null,
+ "x3 test", null);
+
+ test.checkAdd(
+ "-b,--bar %s{[\"john\",\"jerry\"),fred,\"harry\"} #sets bar",
+ sh, 's', 1, new String[] { "-b ", "--bar " }, new RngCheck[] {
+ new RngCheck("jerry", OPEN, "john", CLOSED),
+ new RngCheck("fred"), new RngCheck("harry") },
+ "sets bar", null);
+
+ test.checkAdd("-c ,coven%f{0.0,9.0,(6,5],[-9.1,10.2]} ", dh, 'f', 1,
+ new String[] { "-c ", "coven" }, new RngCheck[] {
+ new RngCheck(0.0), new RngCheck(9.0),
+ new RngCheck(5.0, CLOSED, 6.0, OPEN),
+ new RngCheck(-9.1, CLOSED, 10.2, CLOSED) }, "", null);
+
+ test.checkAdd("-b %b #a boolean value ", bh, 'b', 1,
+ new String[] { "-b " }, new RngCheck[] {}, "a boolean value ",
+ null);
+
+ test.checkAdd("-a %i", ih, 'i', 1, "-a ", null, "", null);
+ test.checkAdd("-a %o", lh, 'o', 1, "-a ", null, "", null);
+ test.checkAdd("-a %d", i3, 'd', 1, "-a ", null, "", null);
+ test.checkAdd("-a %x", l3, 'x', 1, "-a ", null, "", null);
+ test.checkAdd("-a %c", ch, 'c', 1, "-a ", null, "", null);
+ test.checkAdd("-a %c", c3, 'c', 1, "-a ", null, "", null);
+ test.checkAdd("-a %v", bh, 'v', 1, "-a ", null, "", null);
+ test.checkAdd("-a %b", b3, 'b', 1, "-a ", null, "", null);
+ test.checkAdd("-a %f", fh, 'f', 1, "-a ", null, "", null);
+ test.checkAdd("-a %f", f3, 'f', 1, "-a ", null, "", null);
+ test.checkAdd("-a %f", dh, 'f', 1, "-a ", null, "", null);
+ test.checkAdd("-a %f", d3, 'f', 1, "-a ", null, "", null);
+
+ test.checkAdd("-a %i", fh, 'i', 1, "-a ", null, "",
+ "Invalid result holder for %i");
+ test.checkAdd("-a %c", i3, 'c', 1, "-a ", null, "",
+ "Invalid result holder for %c");
+ test.checkAdd("-a %v", d3, 'v', 1, "-a ", null, "",
+ "Invalid result holder for %v");
+ test.checkAdd("-a %f", sh, 'f', 1, "-a ", null, "",
+ "Invalid result holder for %f");
+ test.checkAdd("-a %s", l3, 's', 1, "-a ", null, "",
+ "Invalid result holder for %s");
+
+ test.checkAdd("-foo %i{} ", ih, 'i', 1, "-foo ", null, "", null);
+ test.checkAdd("-foo%i{}", ih, 'i', 1, "-foo", null, "", null);
+ test.checkAdd("-foo%i{ }", ih, 'i', 1, "-foo", null, "", null);
+ test.checkAdd("-foo%i{ }}", ih, "Illegal character(s), expecting '#'");
+ test.checkAdd("-foo%i{ ", ih, "Unterminated range specification");
+ test.checkAdd("-foo%i{", ih, "Unterminated range specification");
+ test.checkAdd("-foo%i{0,9", ih, "Unterminated range specification");
+ test.checkAdd("-foo%i{1,2,3)", ih, "Unterminated range specification");
+
+ test.checkAdd("-b %f{0.9}", fh, 'f', 1, "-b ",
+ new RngCheck[] { new RngCheck(0.9) }, "", null);
+ test.checkAdd("-b %f{ 0.9 ,7, -0.5,-4 ,6 }", fh, 'f', 1, "-b ",
+ new RngCheck[] { new RngCheck(0.9), new RngCheck(7.0),
+ new RngCheck(-0.5), new RngCheck(-4.0),
+ new RngCheck(6.0) }, "", null);
+ test.checkAdd("-b %f{ [0.9,7), (-0.5,-4),[9,6] , (10,13.4] }", fh, 'f',
+ 1, "-b ", new RngCheck[] {
+ new RngCheck(0.9, CLOSED, 7.0, OPEN),
+ new RngCheck(-4.0, OPEN, -.5, OPEN),
+ new RngCheck(6.0, CLOSED, 9.0, CLOSED),
+ new RngCheck(10.0, OPEN, 13.4, CLOSED), }, "", null);
+ test.checkAdd("-b %f{(8 9]}", fh,
+ "Missing ',' in subrange specification");
+ test.checkAdd("-b %f{(8,9,]}", fh, "Unterminated subrange");
+ test.checkAdd("-b %f{(8,9 ,]}", fh, "Unterminated subrange");
+ test.checkAdd("-b %f{(8,9 8]}", fh, "Unterminated subrange");
+ test.checkAdd("-b %f{8 9}", fh, "Range spec: ',' or '}' expected");
+ test.checkAdd("-b %f{8 *}", fh, "Range spec: ',' or '}' expected");
+
+ test.checkAdd("-b %f{8y}", fh, "Range spec: ',' or '}' expected");
+ test.checkAdd("-b %f{.}", fh, "Malformed float '.}' in range spec");
+ test.checkAdd("-b %f{1.0e}", fh,
+ "Malformed float '1.0e}' in range spec");
+ test.checkAdd("-b %f{[*]}", fh, "Malformed float '*' in range spec");
+ test.checkAdd("-b %f{1.2e5t}", fh, "Range spec: ',' or '}' expected");
+
+ test.checkAdd("-b %i{8}", ih, 'i', 1, "-b ",
+ new RngCheck[] { new RngCheck(8) }, "", null);
+ test.checkAdd("-b %i{8, 9,10 }", ih, 'i', 1, "-b ", new RngCheck[] {
+ new RngCheck(8), new RngCheck(9), new RngCheck(10) }, "", null);
+ test.checkAdd("-b %i{8, [-9,10),[-17,15],(2,-33),(8,9] }", ih, 'i', 1,
+ "-b ", new RngCheck[] { new RngCheck(8),
+ new RngCheck(-9, CLOSED, 10, OPEN),
+ new RngCheck(-17, CLOSED, 15, CLOSED),
+ new RngCheck(-33, OPEN, 2, OPEN),
+ new RngCheck(8, OPEN, 9, CLOSED), }, "", null);
+ test.checkAdd("-b %i{8.7}", ih, "Range spec: ',' or '}' expected");
+ test.checkAdd("-b %i{6,[*]}", ih, "Malformed integer '*' in range spec");
+ test.checkAdd("-b %i{g76}", ih, "Malformed integer 'g' in range spec");
+
+ test.checkAdd("-b %s{foobar}", sh, 's', 1, "-b ",
+ new RngCheck[] { new RngCheck("foobar") }, "", null);
+ test.checkAdd("-b %s{foobar, 0x233,\" \"}", sh, 's', 1, "-b ",
+ new RngCheck[] { new RngCheck("foobar"), new RngCheck("0x233"),
+ new RngCheck(" ") }, "", null);
+ test.checkAdd("-b %s{foobar,(bb,aa], [\"01\",02]}", sh, 's', 1, "-b ",
+ new RngCheck[] { new RngCheck("foobar"),
+ new RngCheck("aa", CLOSED, "bb", OPEN),
+ new RngCheck("01", CLOSED, "02", CLOSED), }, "", null);
+
+ test.checkAdd("-b %c{'a'}", ch, 'c', 1, "-b ",
+ new RngCheck[] { new RngCheck('a') }, "", null);
+ test.checkAdd("-b %c{'\\n', '\\002', 'B'}", ch, 'c', 1, "-b ",
+ new RngCheck[] { new RngCheck('\n'), new RngCheck('\002'),
+ new RngCheck('B') }, "", null);
+ test.checkAdd("-b %c{'q',('g','a'], ['\t','\\003']}", ch, 'c', 1,
+ "-b ", new RngCheck[] { new RngCheck('q'),
+ new RngCheck('a', CLOSED, 'g', OPEN),
+ new RngCheck('\003', CLOSED, '\t', CLOSED), }, "", null);
+
+ test.checkAdd("-b %b{true}X2", b3, 'b', 2, "-b ",
+ new RngCheck[] { new RngCheck(true) }, "", null);
+ test.checkAdd("-b %b{ true , false, true }", bh, 'b', 1, "-b ",
+ new RngCheck[] { new RngCheck(true), new RngCheck(false),
+ new RngCheck(true) }, "", null);
+ test.checkAdd("-b %v{true,[true,false)}", bh,
+ "Sub ranges not supported for %b or %v");
+ test.checkAdd("-b %v{true,[]}", bh,
+ "Sub ranges not supported for %b or %v");
+ test.checkAdd("-b %b{tru}", bh,
+ "Malformed boolean 'tru}' in range spec");
+
+ test.checkAdd("-b %iX2", i3, 'i', 2, "-b ", null, "", null);
+ test.checkAdd("-b %vX3", b3, 'v', 3, "-b ", null, "", null);
+ test.checkAdd("-b %v{ }X3", b3, 'v', 3, "-b ", null, "", null);
+
+ test.checkAdd("-b=%iX2", i3, 'i', 2, "-b", null, "",
+ "Multiplier value incompatible with one word option -b=");
+ test.checkAdd("-b %iX0", i3, 'i', 0, "-b ", null, "",
+ "Value multiplier number must be > 0");
+ test.checkAdd("-b %iX-6", i3, 'i', 0, "-b ", null, "",
+ "Value multiplier number must be > 0");
+ test.checkAdd("-b %iXy", i3, 'i', 0, "-b ", null, "",
+ "Malformed value multiplier");
+ test.checkAdd("-b %iX4", i3, 'i', 4, "-b ", null, "",
+ "Result holder array must have a length >= 4");
+ test.checkAdd("-b %iX4", ih, 'i', 4, "-b ", null, "",
+ "Multiplier requires result holder to be an array of length >= 4");
+
+ test.checkAdd("-b %i #X4", ih, 'i', 1, "-b ", null, "X4", null);
+ test.checkAdd("-b %i #[}X4", ih, 'i', 1, "-b ", null, "[}X4", null);
+
+ // test.checkPrintHelp("");
+ // test.checkPrintUsage("");
+
+ test = new ArgParserTest();
+
+ test.checkAdd(
+ "-intarg %i{1,2,(9,18],[22,27],[33,38),(45,48)} #test int arg",
+ ih, 'i', 1, "-intarg ", new RngCheck[] { new RngCheck(1),
+ new RngCheck(2), new RngCheck(9, OPEN, 18, CLOSED),
+ new RngCheck(22, CLOSED, 27, CLOSED),
+ new RngCheck(33, CLOSED, 38, OPEN),
+ new RngCheck(45, OPEN, 48, OPEN), }, "test int arg",
+ null);
+
+ MTest[] tests;
+
+ tests = new MTest[] { new MTest("-intarg 1", new Long(1)),
+ new MTest("-intarg 3", new MErr('r', "3")),
+ new MTest("-intarg 9", new MErr('r', "9")),
+ new MTest("-intarg 11", new Long(11)),
+ new MTest("-intarg 18", new Long(18)),
+ new MTest("-intarg 22", new Long(22)),
+ new MTest("-intarg 25", new Long(25)),
+ new MTest("-intarg 27", new Long(27)),
+ new MTest("-intarg 33", new Long(33)),
+ new MTest("-intarg 35", new Long(35)),
+ new MTest("-intarg 38", new MErr('r', "38")),
+ new MTest("-intarg 45", new MErr('r', "45")),
+ new MTest("-intarg 46", new Long(46)),
+ new MTest("-intarg 48", new MErr('r', "48")),
+ new MTest("-intarg 100", new MErr('r', "100")),
+ new MTest("-intarg 0xbeef", new MErr('r', "0xbeef")),
+ new MTest("-intarg 0x2f", new Long(0x2f)),
+ new MTest("-intarg 041", new Long(041)), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd(
+ "-farg %f{1,2,(9,18],[22,27],[33,38),(45,48)} #test float arg",
+ dh, 'f', 1, "-farg ", new RngCheck[] { new RngCheck(1.0),
+ new RngCheck(2.0),
+ new RngCheck(9.0, OPEN, 18.0, CLOSED),
+ new RngCheck(22.0, CLOSED, 27.0, CLOSED),
+ new RngCheck(33.0, CLOSED, 38.0, OPEN),
+ new RngCheck(45.0, OPEN, 48.0, OPEN), },
+ "test float arg", null);
+
+ tests = new MTest[] { new MTest("-farg 1", new Double(1)),
+ new MTest("-farg 3", new MErr('r', "3")),
+ new MTest("-farg 9", new MErr('r', "9")),
+ new MTest("-farg 9.0001", new Double(9.0001)),
+ new MTest("-farg 11", new Double(11)),
+ new MTest("-farg 18", new Double(18)),
+ new MTest("-farg 22", new Double(22)),
+ new MTest("-farg 25", new Double(25)),
+ new MTest("-farg 27", new Double(27)),
+ new MTest("-farg 33", new Double(33)),
+ new MTest("-farg 35", new Double(35)),
+ new MTest("-farg 37.9999", new Double(37.9999)),
+ new MTest("-farg 38", new MErr('r', "38")),
+ new MTest("-farg 45", new MErr('r', "45")),
+ new MTest("-farg 45.0001", new Double(45.0001)),
+ new MTest("-farg 46", new Double(46)),
+ new MTest("-farg 47.9999", new Double(47.9999)),
+ new MTest("-farg 48", new MErr('r', "48")),
+ new MTest("-farg 100", new MErr('r', "100")),
+ new MTest("-farg 0", new MErr('r', "0")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd(
+ "-sarg %s{1,2,(AA,AZ],[BB,BX],[C3,C8),(d5,d8)} #test string arg",
+ s3, 's', 1, "-sarg ", new RngCheck[] { new RngCheck("1"),
+ new RngCheck("2"),
+ new RngCheck("AA", OPEN, "AZ", CLOSED),
+ new RngCheck("BB", CLOSED, "BX", CLOSED),
+ new RngCheck("C3", CLOSED, "C8", OPEN),
+ new RngCheck("d5", OPEN, "d8", OPEN), },
+ "test string arg", null);
+
+ tests = new MTest[] { new MTest("-sarg 1", "1"),
+ new MTest("-sarg 3", new MErr('r', "3")),
+ new MTest("-sarg AA", new MErr('r', "AA")),
+ new MTest("-sarg AM", "AM"), new MTest("-sarg AZ", "AZ"),
+ new MTest("-sarg BB", "BB"), new MTest("-sarg BL", "BL"),
+ new MTest("-sarg BX", "BX"), new MTest("-sarg C3", "C3"),
+ new MTest("-sarg C6", "C6"),
+ new MTest("-sarg C8", new MErr('r', "C8")),
+ new MTest("-sarg d5", new MErr('r', "d5")),
+ new MTest("-sarg d6", "d6"),
+ new MTest("-sarg d8", new MErr('r', "d8")),
+ new MTest("-sarg zzz", new MErr('r', "zzz")),
+ new MTest("-sarg 0", new MErr('r', "0")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test = new ArgParserTest();
+
+ test.checkAdd("-carg %c{1,2,(a,z],['A','Z'],['\\001',\\007),(4,8)}",
+ c3, 'c', 1, "-carg ", new RngCheck[] { new RngCheck('1'),
+ new RngCheck('2'),
+ new RngCheck('a', OPEN, 'z', CLOSED),
+ new RngCheck('A', CLOSED, 'Z', CLOSED),
+ new RngCheck('\001', CLOSED, '\007', OPEN),
+ new RngCheck('4', OPEN, '8', OPEN), }, "", null);
+
+ tests = new MTest[] { new MTest("-carg 1", new Character('1')),
+ new MTest("-carg 3", new MErr('r', "3")),
+ new MTest("-carg a", new MErr('r', "a")),
+ new MTest("-carg m", new Character('m')),
+ new MTest("-carg z", new Character('z')),
+ new MTest("-carg A", new Character('A')),
+ new MTest("-carg 'L'", new Character('L')),
+ new MTest("-carg 'Z'", new Character('Z')),
+ new MTest("-carg \\001", new Character('\001')),
+ new MTest("-carg \\005", new Character('\005')),
+ new MTest("-carg '\\007'", new MErr('r', "'\\007'")),
+ new MTest("-carg '4'", new MErr('r', "'4'")),
+ new MTest("-carg 6", new Character('6')),
+ new MTest("-carg 8", new MErr('r', "8")),
+ new MTest("-carg '\\012'", new MErr('r', "'\\012'")),
+ new MTest("-carg 0", new MErr('r', "0")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-foo=%i{[-50,100]}", ih, 'i', 1, "-foo=",
+ new RngCheck[] { new RngCheck(-50, CLOSED, 100, CLOSED), }, "",
+ null);
+
+ tests = new MTest[] { new MTest("-foo=-51", new MErr('r', "-51")),
+ new MTest("-foo=-0x32", new Long(-0x32)),
+ new MTest("-foo=-0x33", new MErr('r', "-0x33")),
+ new MTest("-foo=-0777", new MErr('r', "-0777")),
+ new MTest("-foo=-07", new Long(-07)),
+ new MTest("-foo=0", new Long(0)),
+ new MTest("-foo=100", new Long(100)),
+ new MTest("-foo=0x5e", new Long(0x5e)),
+ new MTest("-foo=066", new Long(066)),
+ new MTest("-foo=06677", new MErr('r', "06677")),
+ new MTest("-foo=0xbeef", new MErr('r', "0xbeef")),
+ new MTest("-foo=foo", new MErr('m', "foo")),
+ new MTest("-foo=-51d", new MErr('m', "-51d")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-foo2=%i", ih, 'i', 1, "-foo2=", null, "", null);
+ tests = new MTest[] { new MTest("-foo2=-51", new Long(-51)),
+ new MTest("-foo2=-0x33", new Long(-0x33)),
+ new MTest("-foo2=-0777", new Long(-0777)),
+ new MTest("-foo2=06677", new Long(06677)),
+ new MTest("-foo2=0xbeef", new Long(0xbeef)),
+ new MTest("-foo2=foo", new MErr('m', "foo")),
+ new MTest("-foo2=-51d", new MErr('m', "-51d")),
+ new MTest("-foo2=-51", new Long(-51)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-foo3 %iX3", i3, 'i', 3, "-foo3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-foo3 -51 678 0x45", new long[] { -51, 678, 0x45 }),
+ new MTest("-foo3 55 16f 55", new MErr('m', "16f")),
+ new MTest("-foo3 55 16", new MErr('v', "3")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ Vector<String> vec = new Vector<String>(100);
+
+ test.checkAdd("-foov3 %iX3", vec, 'i', 3, "-foov3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-foov3 -1 2 4", new long[] { -1, 2, 4 }, 0),
+ new MTest("-foov3 10 3 9", new long[] { 10, 3, 9 }, 1),
+ new MTest("-foov3 123 1 0", new long[] { 123, 1, 0 }, 2), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+ test.checkAdd("-foov %i", vec, 'i', 1, "-foov ", null, "", null);
+ tests = new MTest[] { new MTest("-foov 11", new Long(11), 0),
+ new MTest("-foov 12", new Long(12), 1),
+ new MTest("-foov 13", new Long(13), 2), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-foo4 %i{[-50,100]}X2", i3, 'i', 2, "-foo4 ",
+ new RngCheck[] { new RngCheck(-50, CLOSED, 100, CLOSED), }, "",
+ null);
+ tests = new MTest[] {
+ new MTest("-foo4 -49 78", new long[] { -49, 78 }),
+ new MTest("-foo4 -48 102", new MErr('r', "102")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-oct=%o{[-062,0144]}", ih, 'o', 1, "-oct=",
+ new RngCheck[] { new RngCheck(-50, CLOSED, 100, CLOSED), }, "",
+ null);
+
+ tests = new MTest[] { new MTest("-oct=-063", new MErr('r', "-063")),
+ new MTest("-oct=-0x32", new MErr('m', "-0x32")),
+ new MTest("-oct=-0777", new MErr('r', "-0777")),
+ new MTest("-oct=-07", new Long(-07)),
+ new MTest("-oct=0", new Long(0)),
+ new MTest("-oct=100", new Long(64)),
+ new MTest("-oct=0xae", new MErr('m', "0xae")),
+ new MTest("-oct=66", new Long(066)),
+ new MTest("-oct=06677", new MErr('r', "06677")),
+ new MTest("-oct=0xbeef", new MErr('m', "0xbeef")),
+ new MTest("-oct=foo", new MErr('m', "foo")),
+ new MTest("-oct=-51d", new MErr('m', "-51d")),
+ new MTest("-oct=78", new MErr('m', "78")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-oct2=%o", ih, 'o', 1, "-oct2=", null, "", null);
+ tests = new MTest[] { new MTest("-oct2=-063", new Long(-063)),
+ new MTest("-oct2=-0777", new Long(-0777)),
+ new MTest("-oct2=06677", new Long(06677)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-dec=%d{[-0x32,0x64]}", ih, 'd', 1, "-dec=",
+ new RngCheck[] { new RngCheck(-50, CLOSED, 100, CLOSED), }, "",
+ null);
+
+ tests = new MTest[] { new MTest("-dec=-063", new MErr('r', "-063")),
+ new MTest("-dec=-0x32", new MErr('m', "-0x32")),
+ new MTest("-dec=-0777", new MErr('r', "-0777")),
+ new MTest("-dec=-07", new Long(-07)),
+ new MTest("-dec=0", new Long(0)),
+ new MTest("-dec=100", new Long(100)),
+ new MTest("-dec=0xae", new MErr('m', "0xae")),
+ new MTest("-dec=66", new Long(66)),
+ new MTest("-dec=06677", new MErr('r', "06677")),
+ new MTest("-dec=0xbeef", new MErr('m', "0xbeef")),
+ new MTest("-dec=foo", new MErr('m', "foo")),
+ new MTest("-dec=-51d", new MErr('m', "-51d")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-dec2=%d", ih, 'd', 1, "-dec2=", null, "", null);
+ tests = new MTest[] { new MTest("-dec2=-063", new Long(-63)),
+ new MTest("-dec2=-0777", new Long(-777)),
+ new MTest("-dec2=06677", new Long(6677)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-hex=%x{[-0x32,0x64]}", ih, 'x', 1, "-hex=",
+ new RngCheck[] { new RngCheck(-50, CLOSED, 100, CLOSED), }, "",
+ null);
+
+ tests = new MTest[] { new MTest("-hex=-06", new Long(-0x6)),
+ new MTest("-hex=-0x3g2", new MErr('m', "-0x3g2")),
+ new MTest("-hex=-0777", new MErr('r', "-0777")),
+ new MTest("-hex=-017", new Long(-0x17)),
+ new MTest("-hex=0", new Long(0)),
+ new MTest("-hex=64", new Long(0x64)),
+ new MTest("-hex=5e", new Long(0x5e)),
+ new MTest("-hex=66", new MErr('r', "66")),
+ new MTest("-hex=06677", new MErr('r', "06677")),
+ new MTest("-hex=0xbeef", new MErr('m', "0xbeef")),
+ new MTest("-hex=foo", new MErr('m', "foo")),
+ new MTest("-hex=-51d", new MErr('r', "-51d")),
+ new MTest("-hex=-51g", new MErr('m', "-51g")),
+ new MTest("-hex=", new MErr('c', "")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-hex2=%x", ih, 'x', 1, "-hex2=", null, "", null);
+ tests = new MTest[] { new MTest("-hex2=-0777", new Long(-0x777)),
+ new MTest("-hex2=66", new Long(0x66)),
+ new MTest("-hex2=06677", new Long(0x6677)),
+ new MTest("-hex2=-51d", new Long(-0x51d)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-char=%c{['b','m']}", ch, 'c', 1, "-char=",
+ new RngCheck[] { new RngCheck('b', CLOSED, 'm', CLOSED), }, "",
+ null);
+
+ tests = new MTest[] { new MTest("-char=a", new MErr('r', "a")),
+ new MTest("-char=b", new Character('b')),
+ new MTest("-char='b'", new Character('b')),
+ new MTest("-char='\142'", new Character('b')),
+ new MTest("-char='\141'", new MErr('r', "'\141'")),
+ new MTest("-char=\142", new Character('b')),
+ new MTest("-char=\141", new MErr('r', "\141")),
+ new MTest("-char=m", new Character('m')),
+ new MTest("-char=z", new MErr('r', "z")),
+ new MTest("-char=bb", new MErr('m', "bb")),
+ new MTest("-char='b", new MErr('m', "'b")),
+ new MTest("-char='", new MErr('m', "'")),
+ new MTest("-char=a'", new MErr('m', "a'")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-char2=%c", ch, 'c', 1, "-char2=", null, "", null);
+ tests = new MTest[] { new MTest("-char2=a", new Character('a')),
+ new MTest("-char2='\141'", new Character('\141')),
+ new MTest("-char2=\141", new Character('\141')),
+ new MTest("-char2=z", new Character('z')), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-charv3 %cX3", vec, 'c', 3, "-charv3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-charv3 a b c", new char[] { 'a', 'b', 'c' }, 0),
+ new MTest("-charv3 'g' f '\\n'", new char[] { 'g', 'f', '\n' },
+ 1),
+ new MTest("-charv3 1 \001 3", new char[] { '1', '\001', '3' },
+ 2), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+ test.checkAdd("-charv=%c", vec, 'c', 1, "-charv=", null, "", null);
+ tests = new MTest[] { new MTest("-charv=d", new Character('d'), 0),
+ new MTest("-charv='g'", new Character('g'), 1),
+ new MTest("-charv=\111", new Character('\111'), 2), };
+ vec.clear();
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-bool=%b{true}", bh, 'b', 1, "-bool=",
+ new RngCheck[] { new RngCheck(true), }, "", null);
+
+ tests = new MTest[] { new MTest("-bool=true", new Boolean(true)),
+ new MTest("-bool=false", new MErr('r', "false")),
+ new MTest("-bool=fals", new MErr('m', "fals")),
+ new MTest("-bool=falsem", new MErr('m', "falsem")),
+ new MTest("-bool=truex", new MErr('m', "truex")),
+ new MTest("-bool=foo", new MErr('m', "foo")),
+ new MTest("-bool=1", new MErr('m', "1")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-boo2=%b{true,false}", bh, 'b', 1, "-boo2=",
+ new RngCheck[] { new RngCheck(true), new RngCheck(false), },
+ "", null);
+
+ tests = new MTest[] { new MTest("-boo2=true", new Boolean(true)),
+ new MTest("-boo2=false", new Boolean(false)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-boo3=%b", bh, 'b', 1, "-boo3=", null, "", null);
+ tests = new MTest[] { new MTest("-boo3=true", new Boolean(true)),
+ new MTest("-boo3=false", new Boolean(false)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-boo3 %bX3", b3, 'b', 3, "-boo3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-boo3 true false true", new boolean[] { true, false,
+ true }),
+ new MTest("-boo3 true fals true", new MErr('m', "fals")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-boov3 %bX3", vec, 'b', 3, "-boov3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-boov3 true true false", new boolean[] { true, true,
+ false }, 0),
+ new MTest("-boov3 false false true", new boolean[] { false,
+ false, true }, 1), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+ test.checkAdd("-boov %b", vec, 'b', 1, "-boov ", null, "", null);
+ tests = new MTest[] { new MTest("-boov true", new Boolean(true), 0),
+ new MTest("-boov false", new Boolean(false), 1),
+ new MTest("-boov true", new Boolean(true), 2), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-v3 %vX2", b3, 'v', 2, "-v3 ", null, "", null);
+ tests = new MTest[] { new MTest("-v3", new boolean[] { true, true }), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-vf %v{false,true}X2", b3, 'v', 2, "-vf ",
+ new RngCheck[] { new RngCheck(false), new RngCheck(true), },
+ "", null);
+ tests = new MTest[] { new MTest("-vf", new boolean[] { false, false }), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-str=%s{(john,zzzz]}", sh, 's', 1, "-str=",
+ new RngCheck[] { new RngCheck("john", OPEN, "zzzz", CLOSED), },
+ "", null);
+
+ tests = new MTest[] { new MTest("-str=john", new MErr('r', "john")),
+ new MTest("-str=joho ", "joho "),
+ new MTest("-str=joho ", "joho "),
+ new MTest("-str=zzzz", "zzzz"),
+ new MTest("-str= joho", new MErr('r', " joho")),
+ new MTest("-str=jnhn ", new MErr('r', "jnhn ")),
+ new MTest("-str=zzzzz", new MErr('r', "zzzzz")),
+ new MTest("-str=\"joho\"", new MErr('r', "\"joho\"")),
+ new MTest("-str=\"joho", new MErr('r', "\"joho")),
+ new MTest("-str=joho j", "joho j"), // new MErr('m', "joho j")),
+ };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-str2=%s", sh, 's', 1, "-str2=", null, "", null);
+ tests = new MTest[] { new MTest("-str2= jnhn", " jnhn"),
+ new MTest("-str2=zzzzz", "zzzzz"), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-str3 %sX3", s3, 's', 3, "-str3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-str3 foo bar johnny", new String[] { "foo", "bar",
+ "johnny" }),
+ new MTest("-str3 zzzzz \"bad foo", new String[] { "zzzzz",
+ "\"bad", "foo" }), // new MErr('m', "\"bad")),
+ };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-strv3 %sX3", vec, 's', 3, "-strv3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-strv3 foo bar \"hihi\"", new String[] { "foo",
+ "bar", "\"hihi\"" }, 0),
+ new MTest("-strv3 a 123 gg", new String[] { "a", "123", "gg" },
+ 1), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+ test.checkAdd("-strv=%s", vec, 's', 1, "-strv=", null, "", null);
+ tests = new MTest[] { new MTest("-strv=d", "d", 0),
+ new MTest("-strv='g'", "'g'", 1),
+ new MTest("-strv=\\111", "\\111", 2), };
+ vec.clear();
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-float=%f{(-0.001,1000.0]}", dh, 'f', 1, "-float=",
+ new RngCheck[] { new RngCheck(-0.001, OPEN, 1000.0, CLOSED), },
+ "", null);
+
+ tests = new MTest[] {
+ new MTest("-float=-0.000999", new Double(-0.000999)),
+ new MTest("-float=1e-3", new Double(0.001)),
+ new MTest("-float=12.33e1", new Double(123.3)),
+ new MTest("-float=1e3", new Double(1e3)),
+ new MTest("-float=1000.000", new Double(1000.0)),
+ new MTest("-float=-0.001", new MErr('r', "-0.001")),
+ new MTest("-float=-1e-3", new MErr('r', "-1e-3")),
+ new MTest("-float=1000.001", new MErr('r', "1000.001")),
+ new MTest("-float=.", new MErr('m', ".")),
+ new MTest("-float= 124.5 ", new Double(124.5)),
+ new MTest("-float=124.5x", new MErr('m', "124.5x")),
+ new MTest("-float= foo ", new MErr('m', " foo ")),
+ new MTest("-float=1e1", new Double(10)),
+ new MTest("-float=1e ", new MErr('m', "1e ")), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-float2=%f", dh, 'f', 1, "-float2=", null, "", null);
+ tests = new MTest[] { new MTest("-float2=-0.001", new Double(-0.001)),
+ new MTest("-float2=-1e-3", new Double(-1e-3)),
+ new MTest("-float2=1000.001", new Double(1000.001)), };
+ test.checkMatches(tests, ONE_WORD);
+
+ test.checkAdd("-f3 %fX3", d3, 'f', 3, "-f3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-f3 -0.001 1.23e5 -9.88e-4", new double[] { -0.001,
+ 1.23e5, -9.88e-4 }),
+ new MTest("-f3 7.88 foo 9.0", new MErr('m', "foo")),
+ new MTest("-f3 7.88 . 9.0", new MErr('m', ".")),
+ new MTest("-f3 7.88 3.0 9.0x", new MErr('m', "9.0x")), };
+ test.checkMatches(tests, MULTI_WORD);
+
+ test.checkAdd("-fv3 %fX3", vec, 'f', 3, "-fv3 ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-fv3 1.0 3.444 6.7",
+ new double[] { 1.0, 3.444, 6.7 }, 0),
+ new MTest("-fv3 13e-5 145.678 0.0001e45", new double[] { 13e-5,
+ 145.678, 0.0001e45 }, 1),
+ new MTest("-fv3 11.11 3.1245 -1e-4", new double[] { 11.11,
+ 3.1245, -1e-4 }, 2),
+ new MTest("-fv3 1.0 2 3", new double[] { 1.0, 2.0, 3.0 }, 3), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+ test.checkAdd("-fv %f", vec, 'f', 1, "-fv ", null, "", null);
+ tests = new MTest[] {
+ new MTest("-fv -15.1234", new Double(-15.1234), 0),
+ new MTest("-fv -1.234e-7", new Double(-1.234e-7), 1),
+ new MTest("-fv 0.001111", new Double(0.001111), 2), };
+ vec.clear();
+ test.checkMatches(tests, MULTI_WORD);
+
+ IntHolder intHolder = new IntHolder();
+ StringHolder strHolder = new StringHolder();
+
+ ArgParser parser = new ArgParser("test");
+ parser.addOption("-foo %d #an int", intHolder);
+ parser.addOption("-bar %s #a string", strHolder);
+ args = new String[] { "zzz", "-cat", "-foo", "123", "yyy", "-bar",
+ "xxxx", "xxx" };
+
+ String[] unmatchedCheck = new String[] { "zzz", "-cat", "yyy", "xxx" };
+
+ String[] unmatched = parser.matchAllArgs(args, 0, 0);
+ test.checkStringArray("Unmatched args:", unmatched, unmatchedCheck);
+
+ vec.clear();
+ for (int i = 0; i < args.length;) {
+ try {
+ i = parser.matchArg(args, i);
+ if (parser.getUnmatchedArgument() != null) {
+ vec.add(parser.getUnmatchedArgument());
+ }
+ } catch (Exception e) {
+ }
+ }
+ unmatched = (String[]) vec.toArray(new String[0]);
+ test.checkStringArray("My unmatched args:", unmatched, unmatchedCheck);
+
+ System.out.println("\nPassed\n");
+
+ }
}