You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2007/08/27 18:49:35 UTC

svn commit: r570179 - in /commons/proper/jxpath/trunk/src: java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java test/org/apache/commons/jxpath/ri/compiler/CoreFunctionTest.java

Author: mbenson
Date: Mon Aug 27 09:49:28 2007
New Revision: 570179

URL: http://svn.apache.org/viewvc?rev=570179&view=rev
Log:
[JXPATH-102] Core rounding functions don't handle NaN or infinite values correctly; from Sergey Vladimirov

Modified:
    commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java
    commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreFunctionTest.java

Modified: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java
URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java?rev=570179&r1=570178&r2=570179&view=diff
==============================================================================
--- commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java (original)
+++ commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java Mon Aug 27 09:49:28 2007
@@ -653,18 +653,27 @@
     protected Object functionFloor(EvalContext context) {
         assertArgCount(1);
         double v = InfoSetUtil.doubleValue(getArg1().computeValue(context));
+        if (Double.isNaN(v) || Double.isInfinite(v)) {
+        	return new Double(v);
+        }
         return new Double(Math.floor(v));
     }
 
     protected Object functionCeiling(EvalContext context) {
         assertArgCount(1);
         double v = InfoSetUtil.doubleValue(getArg1().computeValue(context));
+        if (Double.isNaN(v) || Double.isInfinite(v)) {
+        	return new Double(v);
+        }
         return new Double(Math.ceil(v));
     }
 
     protected Object functionRound(EvalContext context) {
         assertArgCount(1);
         double v = InfoSetUtil.doubleValue(getArg1().computeValue(context));
+        if (Double.isNaN(v) || Double.isInfinite(v)) {
+        	return new Double(v);
+        }
         return new Double(Math.round(v));
     }
 

Modified: commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreFunctionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreFunctionTest.java?rev=570179&r1=570178&r2=570179&view=diff
==============================================================================
--- commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreFunctionTest.java (original)
+++ commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreFunctionTest.java Mon Aug 27 09:49:28 2007
@@ -116,6 +116,16 @@
         assertXPathValue(context, "ceiling(-1.5)", new Double(-1));
         assertXPathValue(context, "round(1.5)", new Double(2));
         assertXPathValue(context, "round(-1.5)", new Double(-1));
+
+        assertXPathValue(context, "floor('NaN')", new Double(Double.NaN));
+        assertXPathValue(context, "floor(-2 div 0)", new Double(Double.NEGATIVE_INFINITY));
+        assertXPathValue(context, "floor(2 div 0)", new Double(Double.POSITIVE_INFINITY));
+        assertXPathValue(context, "ceiling('NaN')", new Double(Double.NaN));
+        assertXPathValue(context, "ceiling(-2 div 0)", new Double(Double.NEGATIVE_INFINITY));
+        assertXPathValue(context, "ceiling(2 div 0)", new Double(Double.POSITIVE_INFINITY));
+        assertXPathValue(context, "round('NaN')", new Double(Double.NaN));
+        assertXPathValue(context, "round(-2 div 0)", new Double(Double.NEGATIVE_INFINITY));
+        assertXPathValue(context, "round(2 div 0)", new Double(Double.POSITIVE_INFINITY));
     }
 
     public void testIDFunction() {