Author: henrib
Date: Sun Jul 12 20:46:13 2015
New Revision: 1690529

URL: http://svn.apache.org/r1690529
Log:
JEXL:
JEXL-163 fix, check for double 0.0d instead of long 0L for numbers, updated 
parser to do a better job at parsing doubles, added test, updated changes.xml

Modified:
    
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
    
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
    commons/proper/jexl/trunk/src/site/xdoc/changes.xml
    
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java

Modified: 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java?rev=1690529&r1=1690528&r2=1690529&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
 (original)
+++ 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
 Sun Jul 12 20:46:13 2015
@@ -1227,16 +1227,8 @@ public class Interpreter extends ParserV
             return opcall;
         }
         if (object instanceof Number) {
-            Number number = (Number) object;
-            if (number instanceof Double) {
-                double value = number.doubleValue();
-                return value == 0. || Double.isNaN(value) ? Boolean.TRUE : 
Boolean.FALSE;
-            }
-            if (number instanceof Float) {
-                float value = number.floatValue();
-                return value == 0. || Float.isNaN(value) ? Boolean.TRUE : 
Boolean.FALSE;
-            }
-            return number.intValue() == 0 ? Boolean.TRUE : Boolean.FALSE;
+            double d = ((Number) object).doubleValue();
+            return Double.isNaN(d) || d == 0.d ? Boolean.TRUE : Boolean.FALSE;
         }
         if (object instanceof String) {
             return "".equals(object) ? Boolean.TRUE : Boolean.FALSE;

Modified: 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt?rev=1690529&r1=1690528&r2=1690529&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
 (original)
+++ 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
 Sun Jul 12 20:46:13 2015
@@ -202,7 +202,10 @@ PARSER_END(Parser)
   < FLOAT_LITERAL:
     "#NaN"
     |
-    (<DIGIT>)+ "." (<DIGIT>)+ ((["e","E"])(["+","-"])?(<DIGIT>)+)? 
(["d","D","f","F","b","B"])? >
+    (<DIGIT>)+ "." (<DIGIT>)+ ((["e","E"])(["+","-"])?(<DIGIT>)+)? 
(["d","D","f","F","b","B"])?
+    |
+    (<DIGIT>)+ (".")? ((["e","E"])(["+","-"])?(<DIGIT>)+)? 
["d","D","f","F","b","B"]
+>
 }
 
 <*> TOKEN :

Modified: commons/proper/jexl/trunk/src/site/xdoc/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/site/xdoc/changes.xml?rev=1690529&r1=1690528&r2=1690529&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/jexl/trunk/src/site/xdoc/changes.xml Sun Jul 12 20:46:13 2015
@@ -26,6 +26,9 @@
     </properties>
     <body>
         <release version="3.0" date="unreleased">
+            <action dev="henrib" type="fix" issue="JEXL-163" due-to="Dmitri 
Blinov">
+                empty(new ("java.lang.Long", 4294967296)) returns true
+            </action>
             <action dev="henrib" type="fix" issue="JEXL-162" due-to="Dmitri 
Blinov">
                 empty() function throws an exception : unsupported type
             </action>

Modified: 
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java?rev=1690529&r1=1690528&r2=1690529&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
 (original)
+++ 
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
 Sun Jul 12 20:46:13 2015
@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import javax.xml.parsers.DocumentBuilder;
@@ -34,6 +35,8 @@ import org.w3c.dom.Node;
 
 @SuppressWarnings({"UnnecessaryBoxing", 
"AssertEqualsBetweenInconvertibleTypes"})
 public class ArithmeticTest extends JexlTestCase {
+    /** A small delta to compare doubles. */
+    private static final double EPSILON = 1.e-6;
     private final Asserter asserter;
 
     public ArithmeticTest() {
@@ -833,4 +836,66 @@ public class ArithmeticTest extends Jexl
         size = (Integer) s1.execute(null, x);
         Assert.assertEquals(0, size);
     }
+
+    @Test
+    public void testEmptyLong() throws Exception {
+       Object x;
+       x = JEXL.createScript("new('java.lang.Long', 
4294967296)").execute(null);
+       Assert.assertEquals(4294967296L, ((Long) x).longValue());
+       x = JEXL.createScript("new('java.lang.Long', 
'4294967296')").execute(null);
+       Assert.assertEquals(4294967296L, ((Long) x).longValue());
+       x = JEXL.createScript("4294967296l").execute(null);
+       Assert.assertEquals(4294967296L, ((Long) x).longValue());
+       x = JEXL.createScript("4294967296L").execute(null);
+       Assert.assertEquals(4294967296L, ((Long) x).longValue());
+       checkEmpty(x, false);
+       x = JEXL.createScript("0L").execute(null);
+       Assert.assertEquals(0, ((Long) x).longValue());
+       checkEmpty(x, true);
+    }
+
+    @Test
+    public void testEmptyFloat() throws Exception {
+       Object x;
+       x = JEXL.createScript("4294967296.f").execute(null);
+       Assert.assertEquals(4294967296.0f, (Float) x, EPSILON);
+       checkEmpty(x, false);
+       x = JEXL.createScript("4294967296.0f").execute(null);
+       Assert.assertEquals(4294967296.0f, (Float) x, EPSILON);
+       checkEmpty(x, false);
+       x = JEXL.createScript("0.0f").execute(null);
+       Assert.assertEquals(0.0f, (Float) x, EPSILON);
+       checkEmpty(x, true);
+       x = Float.NaN;
+       checkEmpty(x, true);
+    }
+
+    @Test
+    public void testEmptyDouble() throws Exception {
+       Object x;
+       x = JEXL.createScript("4294967296.d").execute(null);
+       Assert.assertEquals(4294967296.0d, (Double) x, EPSILON);
+       checkEmpty(x, false);
+       x = JEXL.createScript("4294967296.0d").execute(null);
+       Assert.assertEquals(4294967296.0d, (Double) x, EPSILON);
+       checkEmpty(x, false);
+       x = JEXL.createScript("0.0d").execute(null);
+       Assert.assertEquals(0.0d, (Double) x, EPSILON);
+       checkEmpty(x, true);
+       x = Double.NaN;
+       checkEmpty(x, true);
+
+    }
+
+    void checkEmpty(Object x, boolean expect) {
+        JexlScript s0 = JEXL.createScript("empty(x)", "x");
+        boolean empty = (Boolean) s0.execute(null, x);
+        Assert.assertEquals(expect, empty);
+        JexlScript s1 = JEXL.createScript("empty x", "x");
+        empty = (Boolean) s1.execute(null, x);
+        Assert.assertEquals(expect, empty);
+        JexlScript s2 = JEXL.createScript("x.empty()", "x");
+        empty = (Boolean) s2.execute(null, x);
+        Assert.assertEquals(expect, empty);
+    }
 }


Reply via email to