Thread: [Japi-cvs] SF.net SVN: japi: [554] libs/argparser/trunk/src (Page 2)
Status: Beta
Brought to you by:
christianhujer
From: <chr...@us...> - 2007-07-29 19:22:18
|
Revision: 554 http://japi.svn.sourceforge.net/japi/?rev=554&view=rev Author: christianhujer Date: 2007-07-29 12:22:12 -0700 (Sun, 29 Jul 2007) Log Message: ----------- [ 1758846 ] Multiple command file inclusion fails Modified Paths: -------------- libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java Added Paths: ----------- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 Modified: libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java =================================================================== --- libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java 2007-07-15 10:32:03 UTC (rev 553) +++ libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java 2007-07-29 19:22:12 UTC (rev 554) @@ -19,6 +19,7 @@ package net.sf.japi.io.args; +import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.lang.reflect.InvocationTargetException; @@ -77,7 +78,7 @@ this.command = command; commandClass = command.getClass(); initMethods(); - final List<String> argList = getAllArguments(Arrays.asList(args)); + final List<String> argList = getAllArguments(new File("."), Arrays.asList(args)); argIterator = argList.listIterator(); parse(); checkRequiredMethods(); @@ -95,10 +96,11 @@ /** * Returns a list of all arguments after parsing arguments files. + * @param context File relative to which @-inclusions have to be resolved. * @param args arguments before parsing argument files. * @return all arguments after parsing argument files. */ - public List<String> getAllArguments(@NotNull final List<String> args) { + public List<String> getAllArguments(@NotNull final File context, @NotNull final List<String> args) { final List<String> argList = new ArrayList<String>(args); for (final ListIterator<String> iterator = argList.listIterator(); iterator.hasNext();) { final String arg = iterator.next(); @@ -107,7 +109,9 @@ } if (arg.startsWith("@")) { iterator.remove(); - for (final String insertArg : getAllArguments(readFromFile(arg.substring(1)))) { + final String filename = arg.substring(1); + final File file = new File(context.getParentFile(), filename); + for (final String insertArg : getAllArguments(file, readFromFile(file))) { iterator.add(insertArg); } } @@ -117,14 +121,14 @@ /** * Returns a tokenized unparsed list of arguments from an arguments file. - * @param filename Argument file to read. + * @param file Argument file to read. * @return all arguments from that argument file. */ - public List<String> readFromFile(@NotNull final String filename) { + public List<String> readFromFile(@NotNull final File file) { final List<String> args = new ArrayList<String>(); final TokenReader in; try { - in = new TokenReader(new FileInputStream(filename)); + in = new TokenReader(new FileInputStream(file)); } catch (final FileNotFoundException e) { // TODO TODO TODO TODO TODO return args; Modified: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java =================================================================== --- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java 2007-07-15 10:32:03 UTC (rev 553) +++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java 2007-07-29 19:22:12 UTC (rev 554) @@ -262,6 +262,26 @@ } /** + * Tests that including multiple command files from a command file works. + * @throws RequiredOptionsMissingException (unexpected) + * @throws TerminalException (unexpected) + * @throws UnknownOptionException (unexpected) + * @throws MissingArgumentException (unexpected) + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1758846&group_id=149894&atid=776737">[ 1758846 ] Multiple command file inclusion fails</a> + */ + @Test + public void testOptionsFromFileMultiple() throws RequiredOptionsMissingException, MissingArgumentException, TerminalException, UnknownOptionException { + final MockCommand command = new MockCommand(); + ArgParser.parseAndRun(command, "@src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster"); + final List<String> args = command.getArgs(); + Assert.assertEquals("Option value must be stored.", "fooInput", command.getInput()); + Assert.assertTrue("Run must be called even with zero arguments.", command.isRunCalled()); + Assert.assertEquals("Arguments must be stored.", 2, args.size()); + Assert.assertEquals("Argument foo must be stored.", "foo", args.get(0)); + Assert.assertEquals("Argument bar must be stored.", "bar", args.get(1)); + } + + /** * Tests that single dash options also work. * @throws RequiredOptionsMissingException (unexpected) * @throws TerminalException (unexpected) Added: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster =================================================================== --- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster (rev 0) +++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster 2007-07-29 19:22:12 UTC (rev 554) @@ -0,0 +1,3 @@ +@ArgParserTest_MultipleOptionsFileSlave1 +@ArgParserTest_MultipleOptionsFileSlave2 +-i fooInput \ No newline at end of file Property changes on: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + LF Added: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 =================================================================== --- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 (rev 0) +++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 2007-07-29 19:22:12 UTC (rev 554) @@ -0,0 +1 @@ +foo \ No newline at end of file Property changes on: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + LF Added: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 =================================================================== --- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 (rev 0) +++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 2007-07-29 19:22:12 UTC (rev 554) @@ -0,0 +1 @@ +bar \ No newline at end of file Property changes on: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + LF This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2007-09-10 21:36:31
|
Revision: 609 http://japi.svn.sourceforge.net/japi/?rev=609&view=rev Author: christianhujer Date: 2007-09-10 14:36:27 -0700 (Mon, 10 Sep 2007) Log Message: ----------- [ 1791713 ] quotation marks removed from @arg files [ 1791715 ] \" silently changed to \\ in argfiles Modified Paths: -------------- libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java Modified: libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java =================================================================== --- libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java 2007-09-09 17:21:28 UTC (rev 608) +++ libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java 2007-09-10 21:36:27 UTC (rev 609) @@ -31,7 +31,13 @@ /** * A TokenReader reads arguments from a file, non-recursive. - * That means the arguments are read regarding a certain argument syntax, but remain otherwise unparsed. + * That means the arguments are read regarding a certain argument syntax which should match with bash-like Quoting, but remain otherwise unparsed. + * <h4>Quoting and Escaping</h4> + * <ul> + * <li>\ introduces an escape. The escape character will be ignored, and the character following the escape character looses its special meaning if any.</li> + * <li>" introduces a string. A string is ended with ". Inside a string, \ only escapes ".</li> + * <li>' introduces a literal string. A literal string is ended with '. Inside a literal string, only ' has special meaning.</li> + * </ul> * @author <a href="mailto:ch...@ri...">Christian Hujer</a> */ public class TokenReader implements Closeable, Iterable<String>, Iterator<String> { @@ -99,6 +105,12 @@ } else if (c == '"') { mode = Mode.STRING; tokenValid = true; + } else if (c == '\'') { + mode = Mode.CHARS; + tokenValid = true; + } else if (c == '\\') { + mode = Mode.ESCAPE; + tokenValid = true; } else { nextToken.append(c); mode = Mode.NORMAL; @@ -112,6 +124,10 @@ return nextToken.toString(); } else if (c == '"') { mode = Mode.STRING; + } else if (c == '\'') { + mode = Mode.CHARS; + } else if (c == '\\') { + mode = Mode.ESCAPE; } else { nextToken.append(c); } @@ -126,9 +142,22 @@ } break; case STRING_ESCAPE: + if (c != '"') { + nextToken.append('\\'); + } nextToken.append(c); mode = Mode.STRING; break; + case ESCAPE: + nextToken.append(c); + mode = Mode.NORMAL; + break; + case CHARS: + if (c == '\'') { + mode = Mode.NORMAL; + } else { + nextToken.append(c); + } default: assert false; } @@ -152,7 +181,13 @@ STRING, /** String Escape - \ inside "". */ - STRING_ESCAPE - } + STRING_ESCAPE, + /** Secape - after \ but outside "". */ + ESCAPE, + + /** String - inside ''. */ + CHARS + } // enum Mode + } // class TokenReader Modified: libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java =================================================================== --- libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java 2007-09-09 17:21:28 UTC (rev 608) +++ libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java 2007-09-10 21:36:27 UTC (rev 609) @@ -151,6 +151,148 @@ reader.next(); } + /** Tests that the TokenReader treats escaped quotes correctly. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenEscapedQuotesRandom() { + final TokenReader reader = new TokenReader(createStream(" \\\" \\\" \\\" a\\\"a \"\\\"\" a\"\\\"\"a ")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "a\"a", reader.next()); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "a\"a", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>\n</samp> returns <samp>n</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderNormalEscape() { + final TokenReader reader = new TokenReader(createStream("\\n")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "n", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>\"</samp> returns <samp>"</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderNormalQuote() { + final TokenReader reader = new TokenReader(createStream("\\\"")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>\'</samp> returns <samp>'</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderNormalApos() { + final TokenReader reader = new TokenReader(createStream("\\'")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "'", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>"\n"</samp> returns <samp>\n</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderQuotesEscape() { + final TokenReader reader = new TokenReader(createStream("\"\\n\"")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\\n", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>"\""</samp> returns <samp>"</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderQuotesQuote() { + final TokenReader reader = new TokenReader(createStream("\"\\\"\"")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>"'"</samp> returns <samp>'</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderQuotesApos1() { + final TokenReader reader = new TokenReader(createStream("\"'\"")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "'", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>"\'"</samp> returns <samp>\'</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderQuotesApos2() { + final TokenReader reader = new TokenReader(createStream("\"\\'\"")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\\'", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>'\n'</samp> returns <samp>\n</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderAposEscape1() { + final TokenReader reader = new TokenReader(createStream("'\\n'")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\\n", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>'\\'</samp> returns <samp>\\</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderAposEscape2() { + final TokenReader reader = new TokenReader(createStream("'\\\\'")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\\\\", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + + /** Tests that <samp>'"'</samp> returns <samp>"</samp>. + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a> + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a> + */ + @Test + public void testTokenReaderAposQuote() { + final TokenReader reader = new TokenReader(createStream("'\"'")); + Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext()); + Assert.assertEquals("Expecting token", "\"", reader.next()); + Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext()); + } + /** Creates an InputStream for reading from a String. * @param s String to read from. * @return InputStream created from s. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2007-09-30 11:01:36
|
Revision: 621 http://japi.svn.sourceforge.net/japi/?rev=621&view=rev Author: christianhujer Date: 2007-09-30 04:01:34 -0700 (Sun, 30 Sep 2007) Log Message: ----------- Moved META-INF to src/prj where it belongs. Added Paths: ----------- libs/argparser/trunk/src/prj/META-INF/ Removed Paths: ------------- libs/argparser/trunk/src/META-INF/ Copied: libs/argparser/trunk/src/prj/META-INF (from rev 619, libs/argparser/trunk/src/META-INF) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2007-10-12 19:27:42
|
Revision: 629 http://japi.svn.sourceforge.net/japi/?rev=629&view=rev Author: christianhujer Date: 2007-10-12 12:27:40 -0700 (Fri, 12 Oct 2007) Log Message: ----------- [ 1812417 ] auto-add newline to help header and footer Modified Paths: -------------- libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties Modified: libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java =================================================================== --- libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java 2007-10-12 19:23:31 UTC (rev 628) +++ libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java 2007-10-12 19:27:40 UTC (rev 629) @@ -165,7 +165,8 @@ * @return Help header. */ @NotNull public String getHelpHeader() { - return getString("helpHeader"); + final String helpHeader = getString("helpHeader"); + return helpHeader.endsWith("\n") ? helpHeader : helpHeader + "\n"; } /** @@ -175,7 +176,8 @@ * @return Help footer. */ @NotNull public String getHelpFooter() { - return getString("helpFooter"); + final String helpFooter = getString("helpFooter"); + return helpFooter.endsWith("\n") ? helpFooter : helpFooter + "\n"; } /** Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java =================================================================== --- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java 2007-10-12 19:23:31 UTC (rev 628) +++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java 2007-10-12 19:27:40 UTC (rev 629) @@ -115,4 +115,42 @@ Assert.assertEquals("HelpHeaderFromMyBundle", mock.getString("helpHeader")); } + /** + * Tests that {@link BasicCommand#getHelpHeader()} returns either the empty String or a String ending on "\n". + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1812417&group_id=149894&atid=776737">[ 1812417 ] auto-add newline to help header and footer</a> + */ + @Test + public void testGetHelpHeaderNewline() { + final RBMockCommand mock = new RBMockCommand(); + mock.setReturnOwnBundle(false); + Assert.assertEquals("HelpHeaderFromDefaultBundle\n", mock.getHelpHeader()); + mock.setReturnOwnBundle(true); + Assert.assertEquals("HelpHeaderFromMyBundle\n", mock.getHelpHeader()); + } + + /** + * Tests that {@link BasicCommand#getHelpFooter()} returns the value from the correct bundle. + */ + @Test + public void testGetHelpFooter() { + final RBMockCommand mock = new RBMockCommand(); + mock.setReturnOwnBundle(false); + Assert.assertEquals("HelpFooterFromDefaultBundle", mock.getString("helpFooter")); + mock.setReturnOwnBundle(true); + Assert.assertEquals("HelpFooterFromMyBundle", mock.getString("helpFooter")); + } + + /** + * Tests that {@link BasicCommand#getHelpFooter()} returns either the empty String or a String ending on "\n". + * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1812417&group_id=149894&atid=776737">[ 1812417 ] auto-add newline to help header and footer</a> + */ + @Test + public void testGetHelpFooterNewline() { + final RBMockCommand mock = new RBMockCommand(); + mock.setReturnOwnBundle(false); + Assert.assertEquals("HelpFooterFromDefaultBundle\n", mock.getHelpFooter()); + mock.setReturnOwnBundle(true); + Assert.assertEquals("HelpFooterFromMyBundle\n", mock.getHelpFooter()); + } + } // class BasicCommandTest Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties =================================================================== --- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties 2007-10-12 19:23:31 UTC (rev 628) +++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties 2007-10-12 19:27:40 UTC (rev 629) @@ -19,3 +19,4 @@ testGetString1=String1FromDefaultBundle testGetString2=String2FromDefaultBundle helpHeader=HelpHeaderFromDefaultBundle +helpFooter=HelpFooterFromDefaultBundle Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties =================================================================== --- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties 2007-10-12 19:23:31 UTC (rev 628) +++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties 2007-10-12 19:27:40 UTC (rev 629) @@ -18,3 +18,4 @@ # testGetString1=String1FromMyBundle helpHeader=HelpHeaderFromMyBundle +helpFooter=HelpFooterFromMyBundle This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <chr...@us...> - 2007-12-16 23:40:11
|
Revision: 632 http://japi.svn.sourceforge.net/japi/?rev=632&view=rev Author: christianhujer Date: 2007-12-16 15:40:08 -0800 (Sun, 16 Dec 2007) Log Message: ----------- Implemented -W for GNU style long option parsing. Modified Paths: -------------- libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java Modified: libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java =================================================================== --- libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java 2007-10-21 12:57:24 UTC (rev 631) +++ libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java 2007-12-16 23:40:08 UTC (rev 632) @@ -43,11 +43,11 @@ * @todo better handling of boolean arguments * @todo Handling of - for STDIN as input argument filestream * @todo automatic printout of default values if property getter available. - * @todo Add -W long for gnu style long option parsing * @todo Let the programmer choose whether long options with one dash should be supported (for Ragnor). If long options with one dash are supported, short option concatenation should be disabled. * @todo Abbreviation of long options as long as the abbreviation is unique * @todo Treat a single dash not as option * @todo Alternative way of getting arguments by a callback mechanism which processes single arguments. + * @todo Disallow "W" as Option argument. */ public final class ArgParser { @@ -226,7 +226,12 @@ break; } final boolean doubleDash = arg.charAt(1) == '-'; - currentOption = arg.substring(doubleDash ? 2 : 1); + if ("-W".equals(arg)) { + currentOption = argIterator.next(); + argIterator.remove(); + } else { + currentOption = arg.substring(doubleDash ? 2 : 1); + } final int indexOfEq = currentOption.indexOf('='); if (indexOfEq != -1) { argIterator.add(currentOption.substring(indexOfEq + 1)); Modified: libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java =================================================================== --- libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java 2007-10-21 12:57:24 UTC (rev 631) +++ libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java 2007-12-16 23:40:08 UTC (rev 632) @@ -46,6 +46,8 @@ * The option names. * Usually this is two Strings, a single letter and a descriptive String. * Multiple descriptive Strings as well as no single letter String are allowed. + * It is an error to use an empty array. + * It is an error to use "W". * @note the supplied string values MUST consist of ASCII-letters only (match regex <code>[a-zA-Z]+</code>). * @return option names */ Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java =================================================================== --- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java 2007-10-21 12:57:24 UTC (rev 631) +++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java 2007-12-16 23:40:08 UTC (rev 632) @@ -38,6 +38,7 @@ /** * Test for {@link ArgParser}. + * @todo Add a test that empty @Option value is not allowed. * @author <a href="mailto:ch...@ri...">Christian Hujer</a> */ public class ArgParserTest { @@ -331,6 +332,24 @@ } /** + * Tests that GNU style options with -W are accepted and processed properly. + * @throws RequiredOptionsMissingException (unexpected) + * @throws TerminalException (unexpected) + * @throws UnknownOptionException (unexpected) + * @throws MissingArgumentException (unexpected) + * @throws ArgumentFileNotFoundException (unexpected) + */ + @Test + public void testPosixStyleLong() throws RequiredOptionsMissingException, MissingArgumentException, TerminalException, UnknownOptionException, ArgumentFileNotFoundException { + final MockCommand command = new MockCommand(); + ArgParser.parseAndRun(command, "-W", "input", "fooInput"); + Assert.assertEquals("Option value must be stored.", "fooInput", command.getInput()); + Assert.assertTrue("Run must be called even with zero arguments.", command.isRunCalled()); + Assert.assertEquals("Argument list for invocation without arguments must be empty.", 0, command.getArgs().size()); + // TODO -W as an option should either be disallowed or disable GNU style option parsing. + } + + /** * This MockCommand serves as a command for performing simple tests. * @author <a href="mailto:ch...@ri...">Christian Hujer</a> */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |