Index: lutinutil/src/test/org/codelutin/util/ParserUtil.java diff -u lutinutil/src/test/org/codelutin/util/ParserUtil.java:1.2 lutinutil/src/test/org/codelutin/util/ParserUtil.java:1.3 --- lutinutil/src/test/org/codelutin/util/ParserUtil.java:1.2 Wed Dec 5 03:04:49 2007 +++ lutinutil/src/test/org/codelutin/util/ParserUtil.java Sun Dec 16 22:31:04 2007 @@ -14,14 +14,15 @@ import junit.framework.Assert; import org.codelutin.i18n.I18n; -import org.codelutin.util.OptionParserAnnotationHelper.ArgumentA; -import org.codelutin.util.OptionParserAnnotationHelper.GroupArgumentA; +import org.codelutin.util.OptionParserAnnotationHelper.*; +import org.codelutin.util.OptionParserAnnotationHelper.GroupA; import org.codelutin.util.OptionParserAnnotationHelper.OptionA; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; +import java.util.Arrays; /** * Some usefull methods for testing OptionPArser and others. @@ -45,7 +46,7 @@ } } - protected static void assertParserEquals(OptionParserAnnotationHelper.ApplicationA expected, OptionParserAnnotationHelper.ApplicationA found) { + protected static void assertParserEquals(ApplicationA expected, ApplicationA found) { Assert.assertNotNull(found); int length = expected.options().length; assertEquals(length, found.options().length); @@ -58,7 +59,7 @@ protected static void assertOptionEquals(OptionA expected, OptionA found) { assertEquals(expected.key(), found.key()); - assertEquals(expected.description(), found.description()); + assertEquals(expected.desc(), found.desc()); assertEquals(expected.min(), found.min()); assertEquals(expected.max(), found.max()); int length = expected.groups().length; @@ -70,22 +71,18 @@ } } - protected static void assertGroupEquals(OptionParserAnnotationHelper.GroupArgumentA expected, - GroupArgumentA found) { - assertEquals(expected.min(), found.min()); - assertEquals(expected.max(), found.max()); + protected static void assertGroupEquals(GroupA expected,GroupA found) { assertEquals(expected.pos(), found.pos()); - int length = expected.arguments().length; - assertEquals(length, found.arguments().length); + int length = expected.args().length; + assertEquals(length, found.args().length); if (length > 0) { for (int i = 0; i < length; i++) { - assertArgumentEquals(found.arguments()[i], expected.arguments()[i]); + assertArgumentEquals(found.args()[i], expected.args()[i]); } } } - protected static void assertArgumentEquals(OptionParserAnnotationHelper.ArgumentA expected, - ArgumentA found) { + protected static void assertArgumentEquals(ArgumentA expected,ArgumentA found) { assertEquals(expected.min(), found.min()); assertEquals(expected.max(), found.max()); assertEquals(expected.key(), found.key()); @@ -103,6 +100,21 @@ assertEquals(nbOptions, parser.options.length); assertEquals(nbErrors, parser.errors.length); } + protected static void assertError(OptionParser parser, int nbOptions, int nbErrors,int nbUnused) throws IOException { + Writer writer = new StringWriter(); + writer.append("\n=============================================== nbOptions:"); + writer.append(String.valueOf(nbOptions)); + writer.append(", nbErrors:").append(String.valueOf(nbErrors)); + writer.append(", nbUnused:").append(String.valueOf(nbUnused)).append(", args:").append(Arrays.toString(parser.getArguments())).append("\n"); + parser.printErrors(writer); + System.out.println(writer.toString()); + writer.flush(); + writer.close(); + assertEquals(nbErrors != 0, parser.hasFailed()); + assertEquals(nbOptions, parser.getOptions().length); + assertEquals(nbUnused, parser.getUnusedArguments().length); + assertEquals(nbErrors, parser.getErrors().length); + } protected static File initFileMock(String key, String type, String... defs) throws IOException { Index: lutinutil/src/test/org/codelutin/util/OptionParserTest.java diff -u lutinutil/src/test/org/codelutin/util/OptionParserTest.java:1.1 lutinutil/src/test/org/codelutin/util/OptionParserTest.java:1.2 --- lutinutil/src/test/org/codelutin/util/OptionParserTest.java:1.1 Wed Dec 5 03:04:49 2007 +++ lutinutil/src/test/org/codelutin/util/OptionParserTest.java Sun Dec 16 22:31:04 2007 @@ -3,9 +3,15 @@ import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.codelutin.util.OptionParserAnnotationHelper.*; +import org.codelutin.log.LutinLogFactory; +import static org.codelutin.util.OptionArgumentType.constant; +import static org.codelutin.util.OptionArgumentValueType._string; +import org.codelutin.util.OptionParserAnnotationHelper.ApplicationA; +import org.codelutin.util.OptionParserAnnotationHelper.ArgumentA; +import org.codelutin.util.OptionParserAnnotationHelper.GroupA; +import org.codelutin.util.OptionParserAnnotationHelper.OptionA; -import java.io.File; +import java.io.IOException; import java.io.StringWriter; /** @@ -19,366 +25,93 @@ static private Log log = LogFactory.getLog(OptionParserTest.class); - private static final String PROJECT_NAME = OptionParserTest.class.getSimpleName(); - private static final String HERE = new File("").getAbsolutePath(); - private static final String OUT_PATH = new File(HERE, "target/gen/classes").getAbsolutePath(); - private static final String PARSER_NAME = "org.codelutin.util.OptionParserTest"; - private static final String PROPERTIES_FILE_PATH = HERE + "/src/test/testOptions.properties"; - -// private OptionParser parser; -// private Option option0, option1, option2, option3, option4; -// private OptionContextOld context0, context1, context2, context3, context4; - - protected void setUp() throws Exception { - super.setUp(); + static { ParserUtil.initI18n(); + System.setProperty("org.apache.commons.logging.LogFactory", LutinLogFactory.class.getName()); + } - public void testParserFromAnnotation() throws Exception { + @ApplicationA(options = @OptionA(key = "help", alias = {"--help", "-h"}, desc = "affiche l'aide")) + static class MyParser extends OptionParser { + public MyParser(ApplicationA annotation) { + super(annotation); + } + } - @ApplicationA(options = @OptionA(key = "help", alias = {"--help", "-h"}, description = "affiche l'aide")) - class MyParser extends OptionParser { + @ApplicationA(options = { + @OptionA(key = "help", alias = {"--help", "-h"}, desc = "affiche l'aide"), + @OptionA(key = "mandatory1", min = 1, max = 1, alias = {"--mandatory1", "-m1"}, desc = "option obligatoire avec un argument obligatoire", groups = @GroupA(pos = 0, args = @ArgumentA(key = "mconstant1", type = constant, valueType = _string))), + @OptionA(key = "mandatory2", min = 1, max = 1, alias = {"--mandatory2", "-m2"}, desc = "option obligatoire avec un argument facultatif", groups = @GroupA(pos = -1, args = @ArgumentA(key = "mconstant2", type = constant, valueType = _string))), + @OptionA(key = "optional1", alias = {"--optional1", "-o1"}, desc = "option facultative avec un argument facultatif", groups = @GroupA(pos = -1, args = @ArgumentA(key = "oconstant1", type = constant, valueType = _string))), + @OptionA(key = "optional2", alias = {"--optional2", "-o2"}, desc = "option facultative avec un argument obligatoire", groups = @GroupA(pos = 0, args = @ArgumentA(key = "oconstant2", type = constant, valueType = _string))) + } + ) + static class MyParser1 extends OptionParser { + public MyParser1(ApplicationA annotation) { + super(annotation); } + } + + + protected static OptionParser parser; + + public void testArgumentsBeforeFirstOption() throws Exception { + initParser(MyParser.class.getAnnotation(ApplicationA.class)); + + parser.doParse("first", "help"); + ParserUtil.assertError(parser, 0, 0, 2); + + parser.doParse("first", "--help"); + ParserUtil.assertError(parser, 1, 0, 1); + + parser.doParse("first", "second", "-h"); + ParserUtil.assertError(parser, 1, 0, 2); + } + + public void testMandatoryGroup() throws Exception { + initParser(MyParser1.class.getAnnotation(ApplicationA.class)); + + parser.doParse("--mandatory1"); + ParserUtil.assertError(parser, 0, 3, 0); - MyParser parser = new MyParser(); + parser.doParse("-m1", "-m2"); + ParserUtil.assertError(parser, 1, 2, 0); - StringWriter writer = new StringWriter(); - parser.printUsage(writer,"mon parseur"); - System.out.println(writer); - writer.close(); + parser.doParse("-m1", "-m2", "--mandatory2"); + ParserUtil.assertError(parser, 1, 3, 0); + parser.doParse("-m1", "mconstant1"); + ParserUtil.assertError(parser, 1, 1, 0); + + parser.doParse("-m1", "mconstant1", "-m2"); + ParserUtil.assertError(parser, 2, 0, 0); } -// public void testDetectOptions() throws Exception { -// List result; -// List expected; -// String[] args; -// expected = new ArrayList(); -// -// args = new String[]{"-0", "-1", "-2", "-3", "-4"}; -// mockParser(); -// expected.add(context0); -// expected.add(context1); -// expected.add(context2); -// expected.add(context3); -// expected.add(context4); -// -// result = parser.detectOptions(args); -// // aucun argument laissé de côté -// assertSame(expected, result, 0); -// -// args = new String[]{"-4", "-3", "-2", "-1", "-0",}; -// expected.clear(); -// mockParser(); -// expected.add(context4); -// expected.add(context3); -// expected.add(context2); -// expected.add(context1); -// expected.add(context0); -// -// result = parser.detectOptions(args); -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertSame(expected, result, 0); -// -// args = new String[]{"-0", "-2", "-3", "-4"}; -// expected.clear(); -// mockParser(); -// expected.add(context0); -// expected.add(context2); -// expected.add(context3); -// expected.add(context4); -// -// result = parser.detectOptions(args); -// -// // aucun argument laissé de côté -// assertSame(expected, result, 0); -// -// args = new String[]{"-0", "-2", "-33", "-4"}; -// expected.clear(); -// mockParser(); -// expected.add(context0); -// expected.add(context2); -// expected.add(context4); -// -// result = parser.detectOptions(args); -// -// assertSame(expected, result, 1); -// // 1 argument laissé de côté (-33) -// assertEquals("-33", parser.arguments.get(0)); -// -// args = new String[]{"-0", "-0", "-2", "-33", "-4"}; -// expected.clear(); -// mockParser(); -// expected.add(context0); -// expected.add(context0); -// expected.add(context2); -// expected.add(context4); -// -// result = parser.detectOptions(args); -// -// assertSame(expected, result, 1); -// // 1 argument laissé de côté (-33) -// assertEquals("-33", parser.arguments.get(0)); -// -// args = new String[]{"-0", "arg0", "-1", "-2", "-33", "-4"}; -// expected.clear(); -// mockParser(); -// context0.args = new String[1]; -// context0.args[0] = "arg0"; -// expected.add(context0); -// expected.add(context1); -// expected.add(context2); -// expected.add(context4); -// -// result = parser.detectOptions(args); -// -// assertSame(expected, result, 1); -// // 1 argument laissé de côté (-33) -// assertEquals("-33", parser.arguments.get(0)); -// -// args = new String[]{"-0", "arg0", "-1", "-1", "-2", "-33", "-4", "arg4", "arg44",}; -// expected.clear(); -// mockParser(); -// expected.add(context0); -// expected.add(context1); -// expected.add(context1); -// expected.add(context2); -// context4.args = new String[2]; -// context4.args[0] = "arg4"; -// context4.args[1] = "arg44"; -// expected.add(context4); -// -// result = parser.detectOptions(args); -// -// assertSame(expected, result, 1); -// // 1 argument laissé de côté (-33) -// assertEquals("-33", parser.arguments.get(0)); -// -// args = new String[]{"-33", "-0", "arg0", "--option1", "-1", "-2", "-4", "arg4", "arg44", "-34",}; -// expected.clear(); -// mockParser(); -// expected.add(context0); -// expected.add(context1); -// expected.add(context1); -// expected.add(context2); -// expected.add(context4); -// -// result = parser.detectOptions(args); -// -// assertSame(expected, result, 2); -// // 1 argument laissé de côté (-33) -// assertEquals("-33", parser.arguments.get(0)); -// assertEquals("-34", parser.arguments.get(1)); -// } - -// public void testParse() throws Exception { -// Option[] result; -// //Option[] expected; -// String[] args; -// -// -// args = new String[]{"-0", "constant", "help"}; -// //mockParser2(); -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse(args); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(2, result[0].getArguments().length); -// assertEquals("constant", result[0].getArguments()[0]); -// assertEquals("help", result[0].getArguments()[1]); -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// try { -// parser.parse("-0", "help"); -// // miss a mandatory argument -// fail(); -// } catch (OptionParserException e) { -// assertTrue(true); -// } -// -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse("-0", "key=0"); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(1, result[0].getArguments().length); -// assertEquals((long) 0, result[0].getArguments()[0]); -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse("-0", "key2=0"); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(1, result[0].getArguments().length); -// assertEquals((double) 0, result[0].getArguments()[0]); -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// try { -// parser.parse("-0", "key2=a"); -// fail(); -// } catch (OptionParserException e) { -// assertTrue(true); -// } -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// try { -// parser.parse("-0", "key=0", "key2=a"); -// // key2 is unused -// fail(); -// } catch (OptionParserException e) { -// assertTrue(true); -// } -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// try { -// parser.parse("-0", "key=0", "help", "help"); -// // key2 is unused -// fail(); -// } catch (OptionParserException e) { -// assertTrue(true); -// } -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse("-0", "key2=0", "key3=fr.ifremer.isisfish.IsisFishOption", "help"); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(3, result[0].getArguments().length); -// assertEquals((double) 0, result[0].getArguments()[0]); -// assertEquals(fr.ifremer.isisfish.IsisFishOption.class, result[0].getArguments()[1]); -// assertEquals("help", result[0].getArguments()[2]); -// -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help|file:file]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse("-0", "key2=0", "key3=fr.ifremer.isisfish.IsisFishOption", "help", "/tmp"); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(4, result[0].getArguments().length); -// assertEquals((double) 0, result[0].getArguments()[0]); -// assertEquals(fr.ifremer.isisfish.IsisFishOption.class, result[0].getArguments()[1]); -// assertEquals("help", result[0].getArguments()[2]); -// assertEquals(new java.io.File("/tmp"), result[0].getArguments()[3]); -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help|file:newfile]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse("-0", "key2=0", "key3=fr.ifremer.isisfish.IsisFishOption", "help", "/tmp2"); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(4, result[0].getArguments().length); -// assertEquals((double) 0, result[0].getArguments()[0]); -// assertEquals(fr.ifremer.isisfish.IsisFishOption.class, result[0].getArguments()[1]); -// assertEquals("help", result[0].getArguments()[2]); -// assertEquals(new java.io.File("/tmp2"), result[0].getArguments()[3]); -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help|file:newfile|str:string]", 1, 1); -// -// try { -// parser.addSon(option0); -// // can't use :string and :newfile in same group -// fail(); -// } catch (Exception e) { -// assertTrue(true); -// } -// -// parser = new OptionParser("testParse"); -// option0 = new Option("option0", "", "-0|--option0 [help|file:file|str:string]", 1, 1); -// parser.addSon(option0); -// -// result = parser.parse("-0", "key2=0", "key3=fr.ifremer.isisfish.IsisFishOption", "help", "/tmp", "str"); -// -// // aucun argument laissé de côté -// assertEquals(0, parser.arguments.size()); -// assertEquals(1, result.length); -// assertEquals(5, result[0].getArguments().length); -// assertEquals((double) 0, result[0].getArguments()[0]); -// assertEquals(fr.ifremer.isisfish.IsisFishOption.class, result[0].getArguments()[1]); -// assertEquals("help", result[0].getArguments()[2]); -// assertEquals(new java.io.File("/tmp"), result[0].getArguments()[3]); -// assertEquals("str", result[0].getArguments()[4]); -// -// } - -// -// private void mockOptions() { -// option0 = new Option("option0", "", "-0|--option0 ", 0, 0); -// option1 = new Option("option1", "", "-1|--option1 ", 0, 0); -// option2 = new Option("option2", "", "-2|--option2 ", 0, 0); -// option3 = new Option("option3", "", "-3|--option3 ", 0, 0); -// option4 = new Option("option4", "", "-4|--option4 ", 0, 0); -// } -// -// private void mockContexts() { -// context0 = new OptionParser.OptionContextOld(option0, new String[0]); -// context1 = new OptionParser.OptionContextOld(option1, new String[0]); -// context2 = new OptionParser.OptionContextOld(option2, new String[0]); -// context3 = new OptionParser.OptionContextOld(option3, new String[0]); -// context4 = new OptionParser.OptionContextOld(option4, new String[0]); -// } - -// private void mockParser() { -// -// parser = new OptionParser("testDetectOptions"); -// -// parser.addSon(option0); -// parser.addSon(option1); -// parser.addSon(option2); -// parser.addSon(option3); -// parser.addSon(option4); -// } - -// private void assertSame(List expected, List result, int nbArgumentsLeft) { -// -//// assertEquals(nbArgumentsLeft, parser.arguments.size()); -// assertEquals(expected.size(), result.size()); -// for (int i = 0; i < result.size(); i++) { -// OptionParser.OptionContextOld context = result.get(i); -// OptionParser.OptionContextOld expectedContext = expected.get(i); -// assertTrue(Arrays.equals(expectedContext.args, context.args)); -// assertTrue(Arrays.equals(expectedContext.option.def.getAlias(), -// context.option.def.getAlias())); -// } -// } + public void testTooMuchOptionFound() throws Exception { + initParser(MyParser.class.getAnnotation(ApplicationA.class)); + + parser.doParse("-h", "--help"); + ParserUtil.assertError(parser, 1, 1, 0); + + parser.doParse("--help", "--help"); + ParserUtil.assertError(parser, 1, 1, 0); + + parser.doParse("-h", "-h"); + ParserUtil.assertError(parser, 1, 1, 0); + parser.doParse("-h", "-h", "-h"); + ParserUtil.assertError(parser, 1, 2, 0); + } + + protected void initParser(ApplicationA annotation) { + try { + parser = new MyParser(annotation); + StringWriter writer = new StringWriter(); + parser.printUsage(writer, getName()); + log.info('\n' + writer.toString()); + writer.close(); + } catch (IOException e) { + fail(e.getMessage()); + } + } } Index: lutinutil/src/test/org/codelutin/util/OptionDefinitionParserWalkerTest.java diff -u lutinutil/src/test/org/codelutin/util/OptionDefinitionParserWalkerTest.java:1.4 lutinutil/src/test/org/codelutin/util/OptionDefinitionParserWalkerTest.java:1.5 --- lutinutil/src/test/org/codelutin/util/OptionDefinitionParserWalkerTest.java:1.4 Wed Dec 12 22:11:52 2007 +++ lutinutil/src/test/org/codelutin/util/OptionDefinitionParserWalkerTest.java Sun Dec 16 22:31:04 2007 @@ -16,7 +16,7 @@ import static org.codelutin.util.OptionDefinitionParser.TypeSource.properties; import org.codelutin.util.OptionParserAnnotationHelper.ApplicationA; import org.codelutin.util.OptionParserAnnotationHelper.ArgumentA; -import org.codelutin.util.OptionParserAnnotationHelper.GroupArgumentA; +import org.codelutin.util.OptionParserAnnotationHelper.GroupA; import org.codelutin.util.OptionParserAnnotationHelper.OptionA; import java.io.File; @@ -26,9 +26,9 @@ key = "option", alias = {"--keyOne", "-1"}, min = 1, max = 2, - description = "--keyOne|-1 {1,2} ", - groups = @GroupArgumentA(min = 1, max = 1, pos = 0, - arguments = { + desc = "--keyOne|-1 {1,2} ", + groups = @OptionParserAnnotationHelper.GroupA(pos = 0, + args = { @ArgumentA(key = "arguOne", type = OptionArgumentType.valued, valueType = OptionArgumentValueType._boolean, min = 123, max = 143), @ArgumentA(key = "arguTwo", type = OptionArgumentType.namedAndValued, valueType = OptionArgumentValueType._class)} ) @@ -36,9 +36,9 @@ key = "option2", alias = {"--keyTwo", "-2"}, min = 1, max = 2, - description = "--keyTwo|-2 {1,2} ", - groups = @GroupArgumentA(min = 1, max = 1, pos = 0, - arguments = { + desc = "--keyTwo|-2 {1,2} ", + groups = @GroupA(pos = 0, + args = { @ArgumentA(key = "arguOne2", type = OptionArgumentType.valued, valueType = OptionArgumentValueType._boolean, min = 123, max = 143), @ArgumentA(key = "arguTwo2", type = OptionArgumentType.namedAndValued, valueType = OptionArgumentValueType._class), @ArgumentA(key = "arguTwo3", type = OptionArgumentType.namedAndValued, valueType = OptionArgumentValueType._file)} @@ -68,7 +68,7 @@ OptionA[] options = excepted.options(); int size = options.length; - file = ParserUtil.initFileMock("option", "option", options[0].description(), options[0].description(), options[1].description(), options[1].description()); + file = ParserUtil.initFileMock("option", "option", options[0].desc(), options[0].desc(), options[1].desc(), options[1].desc()); parser = OptionDefinitionParser.doParse(properties, file); ParserUtil.assertError(parser, size, 0); ApplicationA found = OptionParserUtil.ToAnnotationWalker.getInstance().run(parser.options); @@ -83,7 +83,7 @@ OptionA[] options = excepted.options(); int size = options.length; - file = ParserUtil.initFileMock("option", "option", options[0].description(), options[0].description(), options[1].description(), options[1].description()); + file = ParserUtil.initFileMock("option", "option", options[0].desc(), options[0].desc(), options[1].desc(), options[1].desc()); parser = OptionDefinitionParser.doParse(properties, file); ParserUtil.assertError(parser, size, 0); //OptionDefinition[] found = OptionParserUtil.ToDefinitionWalker.getInstance().run(parser.options);