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]