Author: mbenson Date: Wed Jul 11 12:29:57 2007 New Revision: 555375 URL: http://svn.apache.org/viewvc?view=rev&rev=555375 Log: [JXPATH-95] part 2: fix NaN inequality comparisons
Modified: jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationCompare.java jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationEqual.java jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationNotEqual.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/CoreOperationCompare.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationCompare.java?view=diff&rev=555375&r1=555374&r2=555375 ============================================================================== --- jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationCompare.java (original) +++ jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationCompare.java Wed Jul 11 12:29:57 2007 @@ -34,9 +34,27 @@ * @version $Revision$ $Date$ */ public abstract class CoreOperationCompare extends CoreOperation { + private boolean invert; public CoreOperationCompare(Expression arg1, Expression arg2) { + this(arg1, arg2, false); + } + + protected CoreOperationCompare(Expression arg1, Expression arg2, boolean invert) { super(new Expression[] { arg1, arg2 }); + this.invert = invert; + } + + public Object computeValue(EvalContext context) { + return equal(context, args[0], args[1]) ? Boolean.TRUE : Boolean.FALSE; + } + + protected int getPrecedence() { + return 2; + } + + protected boolean isSymmetric() { + return true; } /** @@ -110,12 +128,6 @@ } protected boolean equal(Object l, Object r) { - if (l instanceof Pointer && r instanceof Pointer) { - if (l.equals(r)) { - return true; - } - } - if (l instanceof Pointer) { l = ((Pointer) l).getValue(); } @@ -124,21 +136,28 @@ r = ((Pointer) r).getValue(); } - if (l == r) { - return true; - } - + boolean result; if (l instanceof Boolean || r instanceof Boolean) { - return (InfoSetUtil.booleanValue(l) == InfoSetUtil.booleanValue(r)); - } - if (l instanceof Number || r instanceof Number) { - return (InfoSetUtil.doubleValue(l) == InfoSetUtil.doubleValue(r)); - } - if (l instanceof String || r instanceof String) { - return ( - InfoSetUtil.stringValue(l).equals(InfoSetUtil.stringValue(r))); + result = l == r || InfoSetUtil.booleanValue(l) == InfoSetUtil.booleanValue(r); + } else if (l instanceof Number || r instanceof Number) { + //if either side is NaN, no comparison returns true: + double ld = InfoSetUtil.doubleValue(l); + if (Double.isNaN(ld)) { + return false; + } + double rd = InfoSetUtil.doubleValue(r); + if (Double.isNaN(rd)) { + return false; + } + result = ld == rd; + } else { + if (l instanceof String || r instanceof String) { + l = InfoSetUtil.stringValue(l); + r = InfoSetUtil.stringValue(r); + } + result = l == r || l != null && l.equals(r); } - return l != null && l.equals(r); + return result ^ invert; } } Modified: jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationEqual.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationEqual.java?view=diff&rev=555375&r1=555374&r2=555375 ============================================================================== --- jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationEqual.java (original) +++ jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationEqual.java Wed Jul 11 12:29:57 2007 @@ -16,8 +16,6 @@ */ package org.apache.commons.jxpath.ri.compiler; -import org.apache.commons.jxpath.ri.EvalContext; - /** * Implementation of Expression for the operation "=". * @@ -30,18 +28,6 @@ super(arg1, arg2); } - public Object computeValue(EvalContext context) { - return equal(context, args[0], args[1]) ? Boolean.TRUE : Boolean.FALSE; - } - - protected int getPrecedence() { - return 2; - } - - protected boolean isSymmetric() { - return true; - } - public String getSymbol() { return "="; } Modified: jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationNotEqual.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationNotEqual.java?view=diff&rev=555375&r1=555374&r2=555375 ============================================================================== --- jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationNotEqual.java (original) +++ jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/compiler/CoreOperationNotEqual.java Wed Jul 11 12:29:57 2007 @@ -16,8 +16,6 @@ */ package org.apache.commons.jxpath.ri.compiler; -import org.apache.commons.jxpath.ri.EvalContext; - /** * Implementation of Expression for the operation "!=". * @@ -27,21 +25,9 @@ public class CoreOperationNotEqual extends CoreOperationCompare { public CoreOperationNotEqual(Expression arg1, Expression arg2) { - super(arg1, arg2); + super(arg1, arg2, true); } - public Object computeValue(EvalContext context) { - return equal(context, args[0], args[1]) ? Boolean.FALSE : Boolean.TRUE; - } - - protected int getPrecedence() { - return 2; - } - - protected boolean isSymmetric() { - return true; - } - public String getSymbol() { return "!="; } 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=555375&r1=555374&r2=555375 ============================================================================== --- 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 12:29:57 2007 @@ -117,9 +117,8 @@ assertXPathValue(context, "$nan < $nan", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan >= $nan", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan <= $nan", Boolean.FALSE, Boolean.class); - //note that "<= and >=" implies a test of numerical, rather than object, equality. ;) assertXPathValue(context, "$nan >= $nan and $nan <= $nan", Boolean.FALSE, Boolean.class); - assertXPathValue(context, "$nan = $nan", Boolean.TRUE, Boolean.class); + assertXPathValue(context, "$nan = $nan", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan != $nan", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan > 0", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan < 0", Boolean.FALSE, Boolean.class); @@ -127,13 +126,13 @@ assertXPathValue(context, "$nan <= 0", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan >= 0 and $nan <= 0", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan = 0", Boolean.FALSE, Boolean.class); - assertXPathValue(context, "$nan != 0", Boolean.TRUE, 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); assertXPathValue(context, "$nan <= 1", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan >= 1 and $nan <= 1", Boolean.FALSE, Boolean.class); assertXPathValue(context, "$nan = 1", Boolean.FALSE, Boolean.class); - assertXPathValue(context, "$nan != 1", Boolean.TRUE, Boolean.class); + assertXPathValue(context, "$nan != 1", Boolean.FALSE, Boolean.class); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]