+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2008 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// OptionParserTest.java\r
-// Since: Oct 28, 2008 4:44:53 PM\r
-//\r
-// $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/test/java/org/xerial/util/opt/OptionParserTest.java $\r
-// $Author: leo $\r
-//--------------------------------------\r
-package org.xerial.util.opt;\r
-\r
-import static org.junit.Assert.*;\r
-\r
-import java.io.File;\r
-import java.io.StringWriter;\r
-import java.util.List;\r
-\r
-import org.junit.After;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.xerial.util.log.LogLevel;\r
-import org.xerial.util.log.Logger;\r
-\r
-public class OptionParserTest {\r
- private static Logger _logger = Logger.getLogger(OptionParserTest.class);\r
-\r
- @Before\r
- public void setUp() throws Exception {}\r
-\r
- @After\r
- public void tearDown() throws Exception {}\r
-\r
- class MyOption {\r
- @Option(symbol = "h", longName = "help", description = "display help message")\r
- private boolean displayHelp;\r
-\r
- @Argument(index = 0, required = true)\r
- private String subCommand;\r
-\r
- @Argument(name = "input_file", index = 1, required = false)\r
- private List<String> fileList;\r
- }\r
-\r
- @Test\r
- public void optionBinding() throws OptionParserException {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- parser.parse(new String[] { "add", "-h", "1.txt", "2.txt" });\r
-\r
- assertEquals("add", myOption.subCommand);\r
- assertTrue(myOption.displayHelp);\r
- assertNotNull(myOption.fileList);\r
- assertEquals(2, myOption.fileList.size());\r
- assertEquals("1.txt", myOption.fileList.get(0));\r
- assertEquals("2.txt", myOption.fileList.get(1));\r
-\r
- }\r
-\r
- @Test\r
- public void printUsage() {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- StringWriter out = new StringWriter();\r
- parser.printUsage(out);\r
- String help = out.toString();\r
- assertTrue(help.length() > 0);\r
- }\r
-\r
- @Test\r
- public void testDuplicatedOptionFlag() {\r
- try {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- parser.parse(new String[] { "-h", "-h" });\r
-\r
- fail("must detect the presence of duplicated option flags");\r
- }\r
- catch (OptionParserException e) {\r
-\r
- }\r
- }\r
-\r
- @Test\r
- public void testDuplicatedLongOptionFlag() {\r
- try {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- parser.parse(new String[] { "--help", "--help" });\r
-\r
- fail("must detect the presence of duplicated option flags");\r
- }\r
- catch (OptionParserException e) {\r
-\r
- }\r
- }\r
-\r
- @Test\r
- public void detectMissingArgument() {\r
- try {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- parser.parse(new String[] {});\r
-\r
- fail("must detect some argument is missing");\r
- }\r
- catch (OptionParserException e) {\r
-\r
- }\r
-\r
- }\r
-\r
- @Test\r
- public void initializeCollectionsInOptionHolder() throws OptionParserException {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- parser.parse(new String[] { "add" });\r
-\r
- assertEquals("add", myOption.subCommand);\r
- assertFalse(myOption.displayHelp);\r
- assertNotNull(myOption.fileList);\r
- assertEquals(0, myOption.fileList.size());\r
-\r
- }\r
-\r
- class LoglevelCommand {\r
- @Option(symbol = "l", longName = "loglevel", varName = "LOG_LEVEL")\r
- private LogLevel loglevel = LogLevel.INFO;\r
- }\r
-\r
- @Test\r
- public void enumOption() throws OptionParserException {\r
- LoglevelCommand opt = new LoglevelCommand();\r
- OptionParser parser = new OptionParser(opt);\r
- parser.parse(new String[] { "--loglevel=DEBUG" });\r
-\r
- assertEquals(LogLevel.DEBUG, opt.loglevel);\r
- }\r
-\r
- class MultipleName {\r
- @Option(longName = "name")\r
- private List<String> name;\r
- }\r
-\r
- @Test\r
- public void mulpleOptionOccurences() throws OptionParserException {\r
- MultipleName mn = new MultipleName();\r
- OptionParser parser = new OptionParser(mn);\r
- parser.parse(new String[] { "--name=leo", "--name=yui" });\r
-\r
- assertNotNull(mn.name);\r
- assertEquals(2, mn.name.size());\r
- assertEquals("leo", mn.name.get(0));\r
- assertEquals("yui", mn.name.get(1));\r
- }\r
-\r
- class IntArg {\r
- @Option(symbol = "i")\r
- int num;\r
-\r
- @Argument(name = "value")\r
- List<Integer> value;\r
- }\r
-\r
- @Test\r
- public void intArgument() throws OptionParserException {\r
- IntArg intArg = new IntArg();\r
- OptionParser parser = new OptionParser(intArg);\r
-\r
- parser.parse(new String[] { "-i", "3", "1", "4", "10" });\r
-\r
- assertNotNull(intArg.value);\r
- assertEquals(3, intArg.num);\r
- assertEquals(3, intArg.value.size());\r
- assertEquals(1, intArg.value.get(0).intValue());\r
- assertEquals(4, intArg.value.get(1).intValue());\r
- assertEquals(10, intArg.value.get(2).intValue());\r
-\r
- }\r
-\r
- class AmbiguousTypeArg {\r
- @Argument(name = "value")\r
- List< ? > value;\r
-\r
- /**\r
- * for testing purpose, use untyped list\r
- */\r
- @SuppressWarnings("unchecked")\r
- @Option(symbol = "d")\r
- List d;\r
- }\r
-\r
- @Test\r
- public void ambiguousType() throws OptionParserException {\r
- AmbiguousTypeArg arg = new AmbiguousTypeArg();\r
- OptionParser parser = new OptionParser(arg);\r
-\r
- parser.parse(new String[] { "1", "2", "3", "-d", "5", "-d", "10" });\r
-\r
- assertNotNull(arg.value);\r
- assertEquals(3, arg.value.size());\r
- assertEquals("1", arg.value.get(0));\r
- assertEquals("2", arg.value.get(1));\r
- assertEquals("3", arg.value.get(2));\r
-\r
- assertNotNull(arg.d);\r
- assertEquals(2, arg.d.size());\r
- assertEquals("5", arg.d.get(0));\r
- assertEquals("10", arg.d.get(1));\r
-\r
- }\r
-\r
- @Test\r
- public void detectUnknownOption() {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
-\r
- try {\r
- parser.parse(new String[] { "-v", "file" });\r
-\r
- fail("must detect unknown options ");\r
- }\r
- catch (OptionParserException e) {\r
-\r
- }\r
-\r
- }\r
-\r
- @Test\r
- public void ignoreUnknownOption() {\r
- MyOption myOption = new MyOption();\r
- OptionParser parser = new OptionParser(myOption);\r
- parser.setIgnoreUnknownOption(true);\r
-\r
- try {\r
- parser.parse(new String[] { "-v", "file" });\r
-\r
- }\r
- catch (OptionParserException e) {\r
- fail("must ignore unknown options ");\r
- }\r
-\r
- }\r
-\r
- class MainCommand {\r
- @Argument(name = "sub_command")\r
- String subCommand = null;\r
- }\r
-\r
- class SubCommand {\r
- @Option(symbol = "h", longName = "help")\r
- boolean displayHelp = false;\r
-\r
- @Argument(name = "input")\r
- String input = null;\r
- }\r
-\r
- @Test\r
- public void retrieveUnusedArguments() throws OptionParserException {\r
- MainCommand mainCommand = new MainCommand();\r
- OptionParser mainCommandParser = new OptionParser(mainCommand);\r
- mainCommandParser.setIgnoreUnknownOption(true);\r
-\r
- mainCommandParser.parse(new String[] { "action", "input.txt", "--help" });\r
-\r
- String[] subCommandArgs = mainCommandParser.getUnusedArguments();\r
-\r
- assertEquals(2, subCommandArgs.length);\r
- assertEquals("input.txt", subCommandArgs[0]);\r
- assertEquals("--help", subCommandArgs[1]);\r
-\r
- SubCommand subCommand = new SubCommand();\r
- OptionParser subCommandParser = new OptionParser(subCommand);\r
-\r
- subCommandParser.parse(subCommandArgs);\r
-\r
- assertNotNull(subCommand.input);\r
- assertEquals("input.txt", subCommand.input);\r
- assertTrue(subCommand.displayHelp);\r
- }\r
-\r
- @Test\r
- public void getOptionHolderTest() throws Exception {\r
-\r
- OptionParser mainCommandParser = new OptionParser(new MainCommand());\r
- mainCommandParser.parse(new String[] { "action" });\r
- MainCommand mc = mainCommandParser.getOptionHolder();\r
-\r
- assertEquals("action", mc.subCommand);\r
-\r
- }\r
-\r
- static class MyOpt {\r
- @Option(symbol = "v", longName = "value", description = "integer value")\r
- int value = -1;\r
- }\r
-\r
- @Test\r
- public void errorMessage() throws Exception {\r
- OptionParser p = new OptionParser(MyOpt.class);\r
- try {\r
- p.parse(new String[] { "-v", "abc" }); // use wrong type\r
- }\r
- catch (OptionParserException e) {\r
- _logger.debug(e);\r
- assertTrue(String.format(\r
- "error message must explain which option argument causes the error: %s", e\r
- .getMessage()), e.getMessage().contains("-v"));\r
- return;\r
- }\r
- fail("cannot reach here");\r
-\r
- }\r
-\r
- static class FileOpt {\r
- @Option(symbol = "o", description = "file name")\r
- File f;\r
-\r
- @Argument\r
- File input;\r
- }\r
-\r
- @Test\r
- public void fileType() throws Exception {\r
- FileOpt o = new FileOpt();\r
- OptionParser opt = new OptionParser(o);\r
- opt.parse(new String[] { "-o", "output.txt", "input.xml" });\r
-\r
- assertEquals(new File("output.txt").getPath(), o.f.getPath());\r
- assertEquals(new File("input.xml").getPath(), o.input.getPath());\r
- }\r
-\r
- static class OptWithSubCommand {\r
- @Option(symbol = "o")\r
- String globalOpt = null;\r
-\r
- @Argument\r
- String subcommand;\r
- }\r
-\r
- @Test\r
- public void splitArguments() throws Exception {\r
- OptionParser opt = new OptionParser(OptWithSubCommand.class);\r
- opt.parseUntilTheFirstArgument(new String[] { "-o", "globalOpt", "subcommand", "-w",\r
- "hello" });\r
- OptWithSubCommand h = opt.getOptionHolder();\r
- String[] tail = opt.getUnusedArguments();\r
- assertEquals(2, tail.length);\r
- assertEquals("-w", tail[0]);\r
- assertEquals("hello", tail[1]);\r
-\r
- assertEquals("globalOpt", h.globalOpt);\r
-\r
- }\r
-\r
-}\r