Author: mbenson
Date: Wed Jul 11 09:44:01 2007
New Revision: 555334

URL: http://svn.apache.org/viewvc?view=rev&rev=555334
Log:
[JXPATH-95] fix NaN comparisons

Modified:
    
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationRelationalExpression.java
    
jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreOperationTest.java

Modified: 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationRelationalExpression.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationRelationalExpression.java?view=diff&rev=555334&r1=555333&r2=555334
==============================================================================
--- 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationRelationalExpression.java
 (original)
+++ 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationRelationalExpression.java
 Wed Jul 11 09:44:01 2007
@@ -72,7 +72,15 @@
         if (right instanceof Iterator) {
             return containsMatch((Iterator) right, left);
         }
-        return evaluateCompare(compare(left, right));
+        double ld = InfoSetUtil.doubleValue(left);
+        if (Double.isNaN(ld)) {
+            return false;
+        }
+        double rd = InfoSetUtil.doubleValue(right);
+        if (Double.isNaN(rd)) {
+            return false;
+        }
+        return evaluateCompare(ld == rd ? 0 : ld < rd ? -1 : 1);
     }
 
     private Object reduce(Object o) {
@@ -88,7 +96,7 @@
     private boolean containsMatch(Iterator it, Object value) {
         while (it.hasNext()) {
             Object element = it.next();
-            if (evaluateCompare(compare(element, value))) {
+            if (compute(element, value)) {
                 return true;
             }
         }
@@ -106,12 +114,6 @@
             }
         }
         return false;
-    }
-
-    private int compare(Object l, Object r) {
-        double ld = InfoSetUtil.doubleValue(l);
-        double rd = InfoSetUtil.doubleValue(r);
-        return ld == rd ? 0 : ld < rd ? -1 : 1;
     }
 
 }

Modified: 
jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreOperationTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreOperationTest.java?view=diff&rev=555334&r1=555333&r2=555334
==============================================================================
--- 
jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreOperationTest.java
 (original)
+++ 
jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/compiler/CoreOperationTest.java
 Wed Jul 11 09:44:01 2007
@@ -46,6 +46,7 @@
             Variables vars = context.getVariables();
             vars.declareVariable("integer", new Integer(1));
             vars.declareVariable("array", new double[] { 0.25, 0.5, 0.75 });
+            vars.declareVariable("nan", new Double(Double.NaN));
         }
     }
 
@@ -109,5 +110,17 @@
         assertXPathValue(context, "$array = 1", Boolean.FALSE, Boolean.class);
         assertXPathValue(context, "$array > 1", Boolean.FALSE, Boolean.class);
         assertXPathValue(context, "$array < 0", Boolean.FALSE, Boolean.class);
+    }
+
+    public void testNan() {
+        assertXPathValue(context, "$nan > $nan", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan < $nan", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan = $nan", Boolean.TRUE, Boolean.class);
+        assertXPathValue(context, "$nan > 0", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan < 0", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan = 0", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan > 1", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan < 1", Boolean.FALSE, Boolean.class);
+        assertXPathValue(context, "$nan = 1", Boolean.FALSE, Boolean.class);
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to