]> source.dussan.org Git - jackcess.git/commitdiff
start testing simple math exprs
authorJames Ahlborn <jtahlborn@yahoo.com>
Sun, 18 Dec 2016 21:08:18 +0000 (21:08 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Sun, 18 Dec 2016 21:08:18 +0000 (21:08 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/exprs@1072 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/impl/expr/ExpressionTokenizer.java
src/main/java/com/healthmarketscience/jackcess/impl/expr/Expressionator.java
src/test/java/com/healthmarketscience/jackcess/impl/expr/ExpressionatorTest.java

index 570823add5cba2a6fd85d38024c5361d8776d5dd..8ed9351610be6afe5df6ca57dbbfef4e9a0683a7 100644 (file)
@@ -366,6 +366,7 @@ class ExpressionTokenizer
 
     int startPos = buf.curPos();
     boolean foundNum = false;
+    boolean hasDecimal = false;
 
     try {
 
@@ -376,6 +377,7 @@ class ExpressionTokenizer
           sb.append((char)c);
           buf.next();
         } else if(c == '.') {
+          hasDecimal = true;
           sb.append((char)c);
           buf.next();
         } else if(isSpecialChar((char)c)) {
@@ -394,9 +396,13 @@ class ExpressionTokenizer
       String numStr = sb.toString();
       try {
         // what number type to use here?
-        BigDecimal num = new BigDecimal(numStr);
+        // BigDecimal num = new BigDecimal(numStr);
+        Object num = (hasDecimal ? 
+                      (Number)Double.valueOf(numStr) : 
+                      (Number)Long.valueOf(numStr));
         foundNum = true;
-        return new Token(TokenType.LITERAL, num, numStr, Value.Type.BIG_DEC);
+        return new Token(TokenType.LITERAL, num, numStr, 
+                         (hasDecimal ? Value.Type.DOUBLE : Value.Type.LONG));
       } catch(NumberFormatException ne) {
         throw new IllegalArgumentException(
             "Invalid number literal " + numStr + " " + buf, ne);
index 263e7ff5524867d56ab84b230135c62764cb22cc..d1d5968bc35bdb85af2652fcd3960abe5cbd48dd 100644 (file)
@@ -1274,6 +1274,10 @@ public class Expressionator
       return new TimeValue((Date)value, sdf);
     case DATE_TIME:
       return new DateTimeValue((Date)value, sdf);
+    case LONG:
+      return new LongValue((Long)value);
+    case DOUBLE:
+      return new DoubleValue((Double)value);
     case BIG_DEC:
       return new BigDecimalValue((BigDecimal)value);
     default:
index c7d2edc1281fd4e784bd88acb2a8e6042f8b58a4..b74063a776aebd5bf35dab34cf9e18f48564f658 100644 (file)
@@ -16,9 +16,15 @@ limitations under the License.
 
 package com.healthmarketscience.jackcess.impl.expr;
 
-import junit.framework.TestCase;
+import java.lang.reflect.Type;
+import java.text.SimpleDateFormat;
 
+import com.healthmarketscience.jackcess.DatabaseBuilder;
+import com.healthmarketscience.jackcess.TestUtil;
 import com.healthmarketscience.jackcess.expr.Expression;
+import com.healthmarketscience.jackcess.expr.Function;
+import com.healthmarketscience.jackcess.expr.Value;
+import junit.framework.TestCase;
 
 /**
  *
@@ -26,7 +32,6 @@ import com.healthmarketscience.jackcess.expr.Expression;
  */
 public class ExpressionatorTest extends TestCase 
 {
-
   public ExpressionatorTest(String name) {
     super(name);
   }
@@ -114,6 +119,55 @@ public class ExpressionatorTest extends TestCase
                  "<EBinaryOp>{<ELiteralValue>{\"A\"} + <EBinaryOp>{<EParen>{(<EBetweenOp>{<ELiteralValue>{\"B\"} Not Between <EBinaryOp>{<ELiteralValue>{37} - <ELiteralValue>{15}} And <ELiteralValue>{52}})} / <ELiteralValue>{4}}}");
 
 
+  }
+
+  public void testSimpleMathExpressions() throws Exception
+  {
+    for(int i = -10; i < 10; ++i) {
+      assertEquals((long)-i, eval("=-(" + i + ")"));
+    }
+
+    for(int i = -10; i < 10; ++i) {
+      for(int j = -10; j < 10; ++j) {
+        assertEquals((long)(i + j), eval("=" + i + " + " + j));
+      }
+    }
+
+    for(int i = -10; i < 10; ++i) {
+      for(int j = -10; j < 10; ++j) {
+        assertEquals((long)(i - j), eval("=" + i + " - " + j));
+      }
+    }
+
+    for(int i = -10; i < 10; ++i) {
+      for(int j = -10; j < 10; ++j) {
+        assertEquals((long)(i * j), eval("=" + i + " * " + j));
+      }
+    }
+
+    for(int i = -10; i < 10; ++i) {
+      for(int j = -10; j < 10; ++j) {
+        try {
+          assertEquals((long)(i / j), eval("=" + i + " \\ " + j));
+          if(j == 0) {
+            fail("ArithmeticException should have been thrown");
+          }
+        } catch(ArithmeticException ae) {
+          if(j != 0) {
+            throw ae;
+          }
+        } 
+      }
+    }
+
+    // for(int i = -10; i < 10; ++i) {
+    //   for(int j = -10; j < 10; ++j) {
+    //     System.out.println("FOO " + i + " " + j);
+    //     assertEquals((long)(Math.pow(i, j)), eval("=" + i + " ^ " + j));
+    //   }
+    // }
+
+
   }
 
   private static void validateExpr(String exprStr, String debugStr) {
@@ -127,4 +181,23 @@ public class ExpressionatorTest extends TestCase
     assertEquals(debugStr, expr.toDebugString());
     assertEquals(cleanStr, expr.toString());
   }
+
+  private static Object eval(String exprStr) {
+    Expression expr = Expressionator.parse(
+        Expressionator.Type.DEFAULT_VALUE, exprStr, new TestContext());
+    return expr.evalDefault();
+  }
+
+  private static final class TestContext implements Expressionator.ParseContext
+  {
+    public SimpleDateFormat createDateFormat(String formatStr) {
+      SimpleDateFormat sdf = DatabaseBuilder.createDateFormat(formatStr);
+      sdf.setTimeZone(TestUtil.TEST_TZ);
+      return sdf;
+    }
+
+    public Function getExpressionFunction(String name) {
+      return null;
+    }
+  }
 }