|
From: <cr...@us...> - 2009-06-07 05:49:44
|
Revision: 5545
http://jnode.svn.sourceforge.net/jnode/?rev=5545&view=rev
Author: crawley
Date: 2009-06-07 05:49:03 +0000 (Sun, 07 Jun 2009)
Log Message:
-----------
Implemented eager form of RepeatSyntax ( + fixed unit test regression)
Modified Paths:
--------------
trunk/shell/src/shell/org/jnode/shell/syntax/RepeatSyntax.java
trunk/shell/src/test/org/jnode/test/shell/syntax/RepeatSyntaxTest.java
Modified: trunk/shell/src/shell/org/jnode/shell/syntax/RepeatSyntax.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/syntax/RepeatSyntax.java 2009-06-07 05:30:04 UTC (rev 5544)
+++ trunk/shell/src/shell/org/jnode/shell/syntax/RepeatSyntax.java 2009-06-07 05:49:03 UTC (rev 5545)
@@ -110,16 +110,28 @@
MuSyntax childSyntax = child.prepare(bundle);
MuSyntax res, tail;
if (maxCount == Integer.MAX_VALUE) {
- tail = new MuAlternation(label,
- null,
- new MuSequence(childSyntax, new MuBackReference(label)));
+ if (eager) {
+ tail = new MuAlternation(label,
+ new MuSequence(childSyntax, new MuBackReference(label)),
+ null);
+ } else {
+ tail = new MuAlternation(label,
+ null,
+ new MuSequence(childSyntax, new MuBackReference(label)));
+ }
} else {
int tailCount = maxCount - minCount;
tail = null;
while (tailCount-- > 0) {
- tail = new MuAlternation(
- (MuSyntax) null,
- (tail == null) ? childSyntax : new MuSequence(childSyntax, tail));
+ if (eager) {
+ tail = new MuAlternation(
+ (tail == null) ? childSyntax : new MuSequence(childSyntax, tail),
+ null);
+ } else {
+ tail = new MuAlternation(
+ (MuSyntax) null,
+ (tail == null) ? childSyntax : new MuSequence(childSyntax, tail));
+ }
}
}
if (minCount == 0) {
Modified: trunk/shell/src/test/org/jnode/test/shell/syntax/RepeatSyntaxTest.java
===================================================================
--- trunk/shell/src/test/org/jnode/test/shell/syntax/RepeatSyntaxTest.java 2009-06-07 05:30:04 UTC (rev 5544)
+++ trunk/shell/src/test/org/jnode/test/shell/syntax/RepeatSyntaxTest.java 2009-06-07 05:49:03 UTC (rev 5545)
@@ -32,20 +32,23 @@
import org.jnode.shell.syntax.CommandSyntaxException;
import org.jnode.shell.syntax.FileArgument;
import org.jnode.shell.syntax.RepeatSyntax;
+import org.jnode.shell.syntax.SequenceSyntax;
import org.jnode.shell.syntax.Syntax;
public class RepeatSyntaxTest extends TestCase {
public static class Test extends AbstractCommand {
- private final FileArgument arg =
+ private final FileArgument arg1 =
new FileArgument("arg1", Argument.OPTIONAL + Argument.MULTIPLE);
+ private final FileArgument arg2 =
+ new FileArgument("arg2", Argument.OPTIONAL + Argument.MULTIPLE);
public Test() {
- registerArguments(arg);
+ registerArguments(arg1, arg2);
}
public void execute() throws Exception {
- getOutput().getPrintWriter().print(arg.getValue());
+ getOutput().getPrintWriter().print(arg1.getValue());
}
}
@@ -63,7 +66,7 @@
public void testZeroToMany() throws Exception {
TestShell shell = new TestShell();
- shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatedSyntaxTest$Test");
+ shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatSyntaxTest$Test");
shell.addSyntax("cmd", new RepeatSyntax(new ArgumentSyntax("arg1")));
CommandLine cl = new CommandLine(new Token("cmd"), new Token[]{}, null);
@@ -85,7 +88,7 @@
public void testOneToMany() throws Exception {
TestShell shell = new TestShell();
- shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatedSyntaxTest$Test");
+ shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatSyntaxTest$Test");
shell.addSyntax("cmd", new RepeatSyntax(new ArgumentSyntax("arg1"), 1, Integer.MAX_VALUE));
CommandLine cl;
@@ -113,7 +116,7 @@
public void testOneToTwo() throws Exception {
TestShell shell = new TestShell();
- shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatedSyntaxTest$Test");
+ shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatSyntaxTest$Test");
shell.addSyntax("cmd", new RepeatSyntax(new ArgumentSyntax("arg1"), 1, 2));
CommandLine cl;
@@ -150,7 +153,7 @@
public void testThreeToSix() throws Exception {
TestShell shell = new TestShell();
- shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatedSyntaxTest$Test");
+ shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatSyntaxTest$Test");
shell.addSyntax("cmd", new RepeatSyntax(new ArgumentSyntax("arg1"), 3, 6));
CommandLine cl;
@@ -215,4 +218,56 @@
// expected
}
}
+
+ public void testLazy() throws Exception {
+ TestShell shell = new TestShell();
+ shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatSyntaxTest$Test");
+ shell.addSyntax("cmd", new SequenceSyntax(
+ new RepeatSyntax(new ArgumentSyntax("arg1")),
+ new RepeatSyntax(new ArgumentSyntax("arg2"))));
+
+ CommandLine cl = new CommandLine(new Token("cmd"), new Token[]{}, null);
+ CommandInfo cmdInfo = cl.parseCommandLine(shell);
+ Command cmd = cmdInfo.createCommandInstance();
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg1").getValues().length);
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg2").getValues().length);
+
+ cl = new CommandLine(new Token("cmd"), new Token[]{new Token("F1")}, null);
+ cmdInfo = cl.parseCommandLine(shell);
+ cmd = cmdInfo.createCommandInstance();
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg1").getValues().length);
+ assertEquals(1, cmd.getArgumentBundle().getArgument("arg2").getValues().length);
+
+ cl = new CommandLine(new Token("cmd"), new Token[]{new Token("F1"), new Token("F1")}, null);
+ cmdInfo = cl.parseCommandLine(shell);
+ cmd = cmdInfo.createCommandInstance();
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg1").getValues().length);
+ assertEquals(2, cmd.getArgumentBundle().getArgument("arg2").getValues().length);
+ }
+
+ public void testEager() throws Exception {
+ TestShell shell = new TestShell();
+ shell.addAlias("cmd", "org.jnode.test.shell.syntax.RepeatSyntaxTest$Test");
+ shell.addSyntax("cmd", new SequenceSyntax(
+ new RepeatSyntax(null, new ArgumentSyntax("arg1"), 0, Integer.MAX_VALUE, true, null),
+ new RepeatSyntax(new ArgumentSyntax("arg2"))));
+
+ CommandLine cl = new CommandLine(new Token("cmd"), new Token[]{}, null);
+ CommandInfo cmdInfo = cl.parseCommandLine(shell);
+ Command cmd = cmdInfo.createCommandInstance();
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg1").getValues().length);
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg2").getValues().length);
+
+ cl = new CommandLine(new Token("cmd"), new Token[]{new Token("F1")}, null);
+ cmdInfo = cl.parseCommandLine(shell);
+ cmd = cmdInfo.createCommandInstance();
+ assertEquals(1, cmd.getArgumentBundle().getArgument("arg1").getValues().length);
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg2").getValues().length);
+
+ cl = new CommandLine(new Token("cmd"), new Token[]{new Token("F1"), new Token("F1")}, null);
+ cmdInfo = cl.parseCommandLine(shell);
+ cmd = cmdInfo.createCommandInstance();
+ assertEquals(2, cmd.getArgumentBundle().getArgument("arg1").getValues().length);
+ assertEquals(0, cmd.getArgumentBundle().getArgument("arg2").getValues().length);
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|