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]