|
|
@@ -1,7 +1,6 @@
|
|
|
package net.ranides.assira.g4;
|
|
|
|
|
|
import net.ranides.assira.io.ResourceUtils;
|
|
|
-import net.ranides.assira.text.StrBuilder;
|
|
|
import org.junit.Test;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
@@ -12,6 +11,53 @@ import static org.junit.Assert.assertEquals;
|
|
|
|
|
|
public class G4ParserTest {
|
|
|
|
|
|
+ // @todo G4Parser should have "coverage mode" for each rule and rule branch
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testLabels() throws IOException {
|
|
|
+ G4Parser parser = G4Parser.newInstance(ResourceUtils.text("LabelTest.g4"));
|
|
|
+
|
|
|
+ G4Node expr1 = parser.parse("manyLabels", "! ( 2 3 + 4 + 5 6 !");
|
|
|
+ assertEquals("2", expr1.label("num1").text());
|
|
|
+ assertEquals("3", expr1.label("num2").text());
|
|
|
+ assertEquals("5", expr1.label("num4").text());
|
|
|
+ assertEquals("6", expr1.label("num5").text());
|
|
|
+
|
|
|
+ G4Node expr2 = parser.parse("functionCall", "hello(1,2,3,4)");
|
|
|
+ assertEquals("1,2,3,4", expr2.label("args").text());
|
|
|
+
|
|
|
+ testLabelExpression(parser, "withLabels");
|
|
|
+ testLabelExpression(parser, "withoutLabels");
|
|
|
+ testLabelExpression(parser, "withoutLabelsRecursive");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void testLabelExpression(G4Parser parser, String rule) {
|
|
|
+
|
|
|
+ G4Node expr2 = parser.parse(rule, "-5");
|
|
|
+ assertEquals("5", expr2.label("a").text());
|
|
|
+ assertThrows(NoSuchElementException.class, () -> {
|
|
|
+ expr2.label("b");
|
|
|
+ });
|
|
|
+
|
|
|
+ G4Node expr3 = parser.parse(rule, "(1+5) & 8");
|
|
|
+ assertEquals("(1+5)", expr3.label("a").text());
|
|
|
+ assertEquals("8", expr3.label("b").text());
|
|
|
+
|
|
|
+ G4Node expr4 = parser.parse(rule, "(1+5) * 8");
|
|
|
+ assertEquals("(1+5)", expr4.label("b").text());
|
|
|
+ assertEquals("8", expr4.label("a").text());
|
|
|
+
|
|
|
+ G4Node expr5 = parser.parse(rule, "(1+5) + 8");
|
|
|
+ assertEquals("(1+5)", expr5.label("x").text());
|
|
|
+ assertEquals("8", expr5.label("y").text());
|
|
|
+
|
|
|
+ G4Node expr6 = parser.parse(rule, "? 1 2 3");
|
|
|
+ assertEquals("1", expr6.label("p").text());
|
|
|
+ assertEquals("2", expr6.label("q").text());
|
|
|
+ assertEquals("3", expr6.label("r").text());
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void selector() throws IOException {
|
|
|
G4Parser parser = G4Parser.newInstance(ResourceUtils.text("Calculator.g4"));
|
|
|
@@ -53,8 +99,8 @@ public class G4ParserTest {
|
|
|
.prepare();
|
|
|
|
|
|
|
|
|
- assertEquals(6, selectExpression.aggregate(parser.parse("expression", "4 + 6 / 3")).intValue());
|
|
|
- assertEquals(30, selectExpression.aggregate(parser.parse("expression", "(4 + 6) * 3")).intValue());
|
|
|
+ assertEquals(9, selectExpression.aggregate(parser.parse("expression", "6 + 9 / 3")).intValue());
|
|
|
+ assertEquals(5, selectExpression.aggregate(parser.parse("expression", "(6 + 9) / 3")).intValue());
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
@@ -64,45 +110,22 @@ public class G4ParserTest {
|
|
|
G4Node tree1 = parser.parse("withoutLabels", "(4 + 2) * 3 ");
|
|
|
G4Node tree2 = parser.parse("expression", "(4 + 2) * 3 ");
|
|
|
|
|
|
- System.out.println(names(tree1) );
|
|
|
- System.out.printf("%n%n--------------%n%n");
|
|
|
- System.out.println(names(tree2) );
|
|
|
+ System.out.println(G4Support.printTree(tree1) );
|
|
|
+ System.out.println("--------------");
|
|
|
+ System.out.println(G4Support.printTree(tree2) );
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
public void printPaths() throws IOException {
|
|
|
G4Parser g4 = G4Parser.newInstance(ResourceUtils.text("Calculator.g4"));
|
|
|
|
|
|
-
|
|
|
G4Node tree1 = g4.parse("withoutLabels", "(4 + 2) * 3 ");
|
|
|
G4Node tree2 = g4.parse("expression", "(4 + 2) * 3 ");
|
|
|
|
|
|
- System.out.println(paths(tree1) );
|
|
|
- System.out.printf("%n%n--------------%n%n");
|
|
|
- System.out.println(paths(tree2) );
|
|
|
- }
|
|
|
-
|
|
|
- static String names(G4Node node) {
|
|
|
- return names(new StrBuilder(), "", node).toString();
|
|
|
+ System.out.println(G4Support.printPath(tree1) );
|
|
|
+ System.out.println("--------------");
|
|
|
+ System.out.println(G4Support.printPath(tree2) );
|
|
|
}
|
|
|
|
|
|
- static StrBuilder names(StrBuilder writer, String indent, G4Node node) {
|
|
|
- writer.printf("%s%s = '%s'%n", indent, node.name(), node.text());
|
|
|
- node.children().forEach(n -> {
|
|
|
- names(writer, indent+" ", n);
|
|
|
- });
|
|
|
- return writer;
|
|
|
- }
|
|
|
-
|
|
|
- static String paths(G4Node node) {
|
|
|
- return paths(new StrBuilder(), node).toString();
|
|
|
- }
|
|
|
|
|
|
- static StrBuilder paths(StrBuilder writer, G4Node node) {
|
|
|
- writer.printf("%s = '%s'%n", node.path(), node.text());
|
|
|
- node.children().forEach(n -> {
|
|
|
- paths(writer, n);
|
|
|
- });
|
|
|
- return writer;
|
|
|
- }
|
|
|
}
|