From e3024b140ea8f94e8dd1b21161b2081baec72e09 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 9 May 2019 11:18:09 +0200
Subject: [PATCH] More tests and a fix for the expression sub-language.

---
 eraser-base/src/main/jastadd/eraser.flex      |  6 +-
 eraser-base/src/main/jastadd/eraser.parser    |  2 +-
 .../inf/st/eraser/ExpressionParserTest.java   | 69 ++++++++++++++++++-
 3 files changed, 72 insertions(+), 5 deletions(-)

diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex
index ffb7bdeb..0dd979a6 100644
--- a/eraser-base/src/main/jastadd/eraser.flex
+++ b/eraser-base/src/main/jastadd/eraser.flex
@@ -102,12 +102,12 @@ Comment = "//" [^\n\r]+
 // special characters
 "="            { return sym(Terminals.EQUALS); }
 //"\""           { return sym(Terminals.QUOTE); }
-"<"            { return sym(Terminals.LE); }
-"<="           { return sym(Terminals.LT); }
+"<"            { return sym(Terminals.LT); }
+"<="           { return sym(Terminals.LE); }
 "=="           { return sym(Terminals.EQ); }
 "!="           { return sym(Terminals.NE); }
+"=>"           { return sym(Terminals.GE); }
 ">"            { return sym(Terminals.GT); }
-">="           { return sym(Terminals.GE); }
 "+"            { return sym(Terminals.PLUS); }
 "*"            { return sym(Terminals.MULT); }
 "-"            { return sym(Terminals.MINUS); }
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 0639a0fa..0d4cf28d 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -74,7 +74,7 @@ NumberExpression number_expression =
 LogicalExpression logical_expression =
     LB_ROUND logical_expression.a AND   logical_expression.b RB_ROUND     {: return new AndExpression(a, b); :}
   | LB_ROUND logical_expression.a OR    logical_expression.b RB_ROUND     {: return new OrExpression(a, b); :}
-  | LB_ROUND EXCLAMATION logical_expression.e RB_ROUND                    {: return new NotExpression(e); :}
+  | EXCLAMATION logical_expression.e                                      {: return new NotExpression(e); :}
   | LB_ROUND logical_expression.e RB_ROUND                                {: return new ParenthesizedLogicalExpression(e); :}
   | LB_ROUND number_expression.a LT    number_expression.b RB_ROUND       {: return new ComparingExpression(a, b, ComparatorType.LessThan); :}
   | LB_ROUND number_expression.a LE    number_expression.b RB_ROUND       {: return new ComparingExpression(a, b, ComparatorType.LessOrEqualThan); :}
diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java
index a7f95965..3d6fb52e 100644
--- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java
+++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java
@@ -95,7 +95,6 @@ public class ExpressionParserTest {
 
   @Test
   public void complexExpression() throws IOException, Parser.Exception {
-    ParserUtils.setVerboseLoading(true);
     NumberExpression sut = ParserUtils.parseNumberExpression("((3 + 4) * (1 / (12 - 8)))");
     assertThat(sut, instanceOf(MultExpression.class));
     MultExpression multExpression = (MultExpression) sut;
@@ -128,4 +127,72 @@ public class ExpressionParserTest {
     NumberLiteralExpression rightOfSub = (NumberLiteralExpression) rightofDiv.getRightOperand();
     assertThat(rightOfSub.getValue(), equalTo(8.0));
   }
+
+  @Test
+  public void comparingExpressions() throws IOException, Parser.Exception {
+    comparingExpression("<",  ComparatorType.LessThan, 1, 2);
+    comparingExpression("<=", ComparatorType.LessOrEqualThan, 3, 4);
+    comparingExpression("==", ComparatorType.Equals, 5, 6);
+    comparingExpression("!=", ComparatorType.NotEquals, 7, 8);
+    comparingExpression("=>", ComparatorType.GreaterOrEqualThan, 9, 10);
+    comparingExpression(">",  ComparatorType.GreaterThan, 11, 12);
+  }
+
+  private void comparingExpression(String actualComparatorString, ComparatorType expectedComparatorType, double left, double right) throws IOException, Parser.Exception {
+    LogicalExpression sut = ParserUtils.parseLogicalExpression(String.format("(%f %s %f)", left, actualComparatorString, right));
+    assertThat(sut, instanceOf(ComparingExpression.class));
+    ComparingExpression comparingExpression = (ComparingExpression) sut;
+    assertThat(comparingExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class));
+    NumberLiteralExpression leftExpression = (NumberLiteralExpression) comparingExpression.getLeftOperand();
+    assertThat(leftExpression.getValue(), equalTo(left));
+    assertThat(comparingExpression.getRightOperand(), instanceOf(NumberLiteralExpression.class));
+    NumberLiteralExpression rightExpression = (NumberLiteralExpression) comparingExpression.getRightOperand();
+    assertThat(rightExpression.getValue(), equalTo(right));
+    assertThat(comparingExpression.getComparator(), equalTo(expectedComparatorType));
+  }
+
+  @Test
+  public void notExpression() throws IOException, Parser.Exception {
+    LogicalExpression sut = ParserUtils.parseLogicalExpression("!(0==0)");
+    assertThat(sut, instanceOf(NotExpression.class));
+    NotExpression notExpression = (NotExpression) sut;
+    checkZeroEqualsZero(notExpression.getOperand());
+  }
+
+  @Test
+  public void andExpression() throws IOException, Parser.Exception {
+    LogicalExpression sut = ParserUtils.parseLogicalExpression("((0==0) & (0==0))");
+    assertThat(sut, instanceOf(AndExpression.class));
+    AndExpression notExpression = (AndExpression) sut;
+    checkZeroEqualsZero(notExpression.getLeftOperand());
+    checkZeroEqualsZero(notExpression.getRightOperand());
+  }
+
+  @Test
+  public void orExpression() throws IOException, Parser.Exception {
+    LogicalExpression sut = ParserUtils.parseLogicalExpression("((0==0) | (0==0))");
+    assertThat(sut, instanceOf(OrExpression.class));
+    OrExpression notExpression = (OrExpression) sut;
+    checkZeroEqualsZero(notExpression.getLeftOperand());
+    checkZeroEqualsZero(notExpression.getRightOperand());
+  }
+
+  @Test
+  public void parenthesizedLogicalExpression() throws IOException, Parser.Exception {
+    LogicalExpression sut = ParserUtils.parseLogicalExpression("((0==0))");
+    assertThat(sut, instanceOf(ParenthesizedLogicalExpression.class));
+    ParenthesizedLogicalExpression parenthesizedLogicalExpression = (ParenthesizedLogicalExpression) sut;
+    checkZeroEqualsZero(parenthesizedLogicalExpression.getOperand());
+  }
+
+  private void checkZeroEqualsZero(LogicalExpression logicalExpression) {
+    assertThat(logicalExpression, instanceOf(ComparingExpression.class));
+    ComparingExpression comparingExpression = (ComparingExpression) logicalExpression;
+    assertThat(comparingExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class));
+    NumberLiteralExpression leftOfSSub = (NumberLiteralExpression) comparingExpression.getLeftOperand();
+    assertThat(leftOfSSub.getValue(), equalTo(0.0));
+    assertThat(comparingExpression.getRightOperand(), instanceOf(NumberLiteralExpression.class));
+    NumberLiteralExpression rightOfSub = (NumberLiteralExpression) comparingExpression.getRightOperand();
+    assertThat(rightOfSub.getValue(), equalTo(0.0));
+  }
 }
-- 
GitLab