You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/02/23 13:41:05 UTC

svn commit: r1292767 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/converter/ObjectConverter.java test/java/org/apache/camel/converter/ObjectConverterNaNTest.java test/java/org/apache/camel/converter/ObjectConverterTest.java

Author: davsclaus
Date: Thu Feb 23 12:41:05 2012
New Revision: 1292767

URL: http://svn.apache.org/viewvc?rev=1292767&view=rev
Log:
CAMEL-4959: Fixed type converter issue with NaN being converter to integers.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java
      - copied, changed from r1292757, camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java?rev=1292767&r1=1292766&r2=1292767&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java Thu Feb 23 12:41:05 2012
@@ -80,6 +80,10 @@ public final class ObjectConverter {
         if (value instanceof Byte) {
             return (Byte) value;
         } else if (value instanceof Number) {
+            if (value.equals(Float.NaN) || value.equals(Double.NaN)) {
+                // return zero for a NaN value
+                return Byte.valueOf("0");
+            }
             Number number = (Number) value;
             return number.byteValue();
         } else if (value instanceof String) {
@@ -136,7 +140,8 @@ public final class ObjectConverter {
             return (Short) value;
         } else if (value instanceof Number) {
             if (value.equals(Float.NaN) || value.equals(Double.NaN)) {
-                return null;
+                // return zero for a NaN value
+                return Short.valueOf("0");
             }
             Number number = (Number) value;
             return number.shortValue();
@@ -156,7 +161,8 @@ public final class ObjectConverter {
             return (Integer) value;
         } else if (value instanceof Number) {
             if (value.equals(Float.NaN) || value.equals(Double.NaN)) {
-                return null;
+                // return zero for a NaN value
+                return Integer.valueOf(0);
             }
             Number number = (Number) value;
             return number.intValue();
@@ -176,7 +182,8 @@ public final class ObjectConverter {
             return (Long) value;
         } else if (value instanceof Number) {
             if (value.equals(Float.NaN) || value.equals(Double.NaN)) {
-                return null;
+                // return zero for a NaN value
+                return Long.valueOf(0);
             }
             Number number = (Number) value;
             return number.longValue();
@@ -195,8 +202,8 @@ public final class ObjectConverter {
         if (value instanceof Float) {
             return (Float) value;
         } else if (value instanceof Number) {
-            if (value.equals(Double.NaN)) {
-                return null;
+            if (value.equals(Double.NaN) || value.equals(Float.NaN)) {
+                return Float.NaN;
             }
             Number number = (Number) value;
             return number.floatValue();
@@ -215,8 +222,8 @@ public final class ObjectConverter {
         if (value instanceof Double) {
             return (Double) value;
         } else if (value instanceof Number) {
-            if (value.equals(Float.NaN)) {
-                return null;
+            if (value.equals(Double.NaN) || value.equals(Float.NaN)) {
+                return Double.NaN;
             }
             Number number = (Number) value;
             return number.doubleValue();

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java (from r1292757, camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java&r1=1292757&r2=1292767&rev=1292767&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java Thu Feb 23 12:41:05 2012
@@ -16,95 +16,64 @@
  */
 package org.apache.camel.converter;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-
-import junit.framework.TestCase;
+import org.apache.camel.ContextTestSupport;
 
 /**
  * @version 
  */
-public class ObjectConverterTest extends TestCase {
+public class ObjectConverterNaNTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    public void testDoubleToLongWithNaN() throws Exception {
+        assertEquals(Long.valueOf("4"), context.getTypeConverter().convertTo(Long.class, Double.valueOf("4")));
+        assertEquals(Long.valueOf("0"), context.getTypeConverter().convertTo(Long.class, Double.NaN));
+        assertEquals(Long.valueOf("3"), context.getTypeConverter().convertTo(Long.class, Double.valueOf("3")));
+    }
+
+    public void testFloatToLongWithNaN() throws Exception {
+        assertEquals(Long.valueOf("4"), context.getTypeConverter().convertTo(Long.class, Float.valueOf("4")));
+        assertEquals(Long.valueOf("0"), context.getTypeConverter().convertTo(Long.class, Float.NaN));
+        assertEquals(Long.valueOf("3"), context.getTypeConverter().convertTo(Long.class, Float.valueOf("3")));
+    }
+
+    public void testDoubleToIntegerWithNaN() throws Exception {
+        assertEquals(Integer.valueOf("4"), context.getTypeConverter().convertTo(Integer.class, Double.valueOf("4")));
+        assertEquals(Integer.valueOf("0"), context.getTypeConverter().convertTo(Integer.class, Double.NaN));
+        assertEquals(Integer.valueOf("3"), context.getTypeConverter().convertTo(Integer.class, Double.valueOf("3")));
+    }
+
+    public void testFloatToIntegerWithNaN() throws Exception {
+        assertEquals(Integer.valueOf("4"), context.getTypeConverter().convertTo(Integer.class, Float.valueOf("4")));
+        assertEquals(Integer.valueOf("0"), context.getTypeConverter().convertTo(Integer.class, Float.NaN));
+        assertEquals(Integer.valueOf("3"), context.getTypeConverter().convertTo(Integer.class, Float.valueOf("3")));
+    }
+
+    public void testDoubleToShortWithNaN() throws Exception {
+        assertEquals(Short.valueOf("4"), context.getTypeConverter().convertTo(Short.class, Double.valueOf("4")));
+        assertEquals(Short.valueOf("0"), context.getTypeConverter().convertTo(Short.class, Double.NaN));
+        assertEquals(Short.valueOf("3"), context.getTypeConverter().convertTo(Short.class, Double.valueOf("3")));
+    }
+
+    public void testFloatToShortWithNaN() throws Exception {
+        assertEquals(Short.valueOf("4"), context.getTypeConverter().convertTo(Short.class, Float.valueOf("4")));
+        assertEquals(Short.valueOf("0"), context.getTypeConverter().convertTo(Short.class, Float.NaN));
+        assertEquals(Short.valueOf("3"), context.getTypeConverter().convertTo(Short.class, Float.valueOf("3")));
+    }
+
+    public void testDoubleToByteWithNaN() throws Exception {
+        assertEquals(Byte.valueOf("4"), context.getTypeConverter().convertTo(Byte.class, Double.valueOf("4")));
+        assertEquals(Byte.valueOf("0"), context.getTypeConverter().convertTo(Byte.class, Double.NaN));
+        assertEquals(Byte.valueOf("3"), context.getTypeConverter().convertTo(Byte.class, Double.valueOf("3")));
+    }
 
-    public void testIsCollection() {
-        assertEquals(false, ObjectConverter.isCollection("String"));
-        assertEquals(false, ObjectConverter.isCollection(null));
-        assertEquals(true, ObjectConverter.isCollection(new ArrayList<Object>()));
-        assertEquals(true, ObjectConverter.isCollection(new String[]{"foo", "bar"}));
-    }
-
-    public void testIterator() {
-        Iterator<?> it = ObjectConverter.iterator("Claus,Jonathan");
-        assertEquals("Claus", it.next());
-        assertEquals("Jonathan", it.next());
-        assertEquals(false, it.hasNext());
-    }
-
-    public void testToByte() {
-        assertEquals(Byte.valueOf("4"), ObjectConverter.toByte(Byte.valueOf("4")));
-        assertEquals(Byte.valueOf("4"), ObjectConverter.toByte(Integer.valueOf("4")));
-        assertEquals(Byte.valueOf("4"), ObjectConverter.toByte("4"));
-        assertEquals(null, ObjectConverter.toByte(new Date()));
-    }
-    
-    public void testToClass() {
-        assertEquals(String.class, ObjectConverter.toClass(String.class, null));
-        assertEquals(String.class, ObjectConverter.toClass("java.lang.String", null));
-        assertEquals(null, ObjectConverter.toClass(new Integer(4), null));
-        assertEquals(null, ObjectConverter.toClass("foo.Bar", null));
-    }
-
-    public void testToShort() {
-        assertEquals(Short.valueOf("4"), ObjectConverter.toShort(Short.valueOf("4")));
-        assertEquals(Short.valueOf("4"), ObjectConverter.toShort(Integer.valueOf("4")));
-        assertEquals(Short.valueOf("4"), ObjectConverter.toShort("4"));
-        assertEquals(null, ObjectConverter.toShort(new Date()));
-        assertEquals(null, ObjectConverter.toShort(Double.NaN));
-        assertEquals(null, ObjectConverter.toShort(Float.NaN));
-    }
-
-    public void testToInteger() {
-        assertEquals(Integer.valueOf("4"), ObjectConverter.toInteger(Integer.valueOf("4")));
-        assertEquals(Integer.valueOf("4"), ObjectConverter.toInteger(Long.valueOf("4")));
-        assertEquals(Integer.valueOf("4"), ObjectConverter.toInteger("4"));
-        assertEquals(null, ObjectConverter.toInteger(new Date()));
-        assertEquals(null, ObjectConverter.toInteger(Double.NaN));
-        assertEquals(null, ObjectConverter.toInteger(Float.NaN));
-    }
-
-    public void testToLong() {
-        assertEquals(Long.valueOf("4"), ObjectConverter.toLong(Long.valueOf("4")));
-        assertEquals(Long.valueOf("4"), ObjectConverter.toLong(Integer.valueOf("4")));
-        assertEquals(Long.valueOf("4"), ObjectConverter.toLong("4"));
-        assertEquals(null, ObjectConverter.toLong(new Date()));
-        assertEquals(null, ObjectConverter.toLong(Double.NaN));
-        assertEquals(null, ObjectConverter.toLong(Float.NaN));
-    }
-
-    public void testToFloat() {
-        assertEquals(Float.valueOf("4"), ObjectConverter.toFloat(Float.valueOf("4")));
-        assertEquals(Float.valueOf("4"), ObjectConverter.toFloat(Integer.valueOf("4")));
-        assertEquals(Float.valueOf("4"), ObjectConverter.toFloat("4"));
-        assertEquals(null, ObjectConverter.toFloat(new Date()));
-        assertEquals(null, ObjectConverter.toFloat(Double.NaN));
-        assertEquals(Float.NaN, ObjectConverter.toFloat(Float.NaN));
-    }
-
-    public void testToDouble() {
-        assertEquals(Double.valueOf("4"), ObjectConverter.toDouble(Double.valueOf("4")));
-        assertEquals(Double.valueOf("4"), ObjectConverter.toDouble(Integer.valueOf("4")));
-        assertEquals(Double.valueOf("4"), ObjectConverter.toDouble("4"));
-        assertEquals(null, ObjectConverter.toDouble(new Date()));
-        assertEquals(Double.NaN, ObjectConverter.toDouble(Double.NaN));
-        assertEquals(null, ObjectConverter.toDouble(Float.NaN));
-    }
-
-    public void testToString() {
-        assertEquals("ABC", ObjectConverter.toString(new StringBuffer("ABC")));
-        assertEquals("ABC", ObjectConverter.toString(new StringBuilder("ABC")));
-        assertEquals("", ObjectConverter.toString(new StringBuffer("")));
-        assertEquals("", ObjectConverter.toString(new StringBuilder("")));
+    public void testFloatToByteWithNaN() throws Exception {
+        assertEquals(Byte.valueOf("4"), context.getTypeConverter().convertTo(Byte.class, Float.valueOf("4")));
+        assertEquals(Byte.valueOf("0"), context.getTypeConverter().convertTo(Byte.class, Float.NaN));
+        assertEquals(Byte.valueOf("3"), context.getTypeConverter().convertTo(Byte.class, Float.valueOf("3")));
     }
 
 }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java?rev=1292767&r1=1292766&r2=1292767&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java Thu Feb 23 12:41:05 2012
@@ -60,8 +60,9 @@ public class ObjectConverterTest extends
         assertEquals(Short.valueOf("4"), ObjectConverter.toShort(Integer.valueOf("4")));
         assertEquals(Short.valueOf("4"), ObjectConverter.toShort("4"));
         assertEquals(null, ObjectConverter.toShort(new Date()));
-        assertEquals(null, ObjectConverter.toShort(Double.NaN));
-        assertEquals(null, ObjectConverter.toShort(Float.NaN));
+        assertEquals(Short.valueOf("0"), ObjectConverter.toShort(Double.NaN));
+        assertEquals(Short.valueOf("0"), ObjectConverter.toShort(Float.NaN));
+        assertEquals(Short.valueOf("4"), ObjectConverter.toShort(Short.valueOf("4")));
     }
 
     public void testToInteger() {
@@ -69,8 +70,9 @@ public class ObjectConverterTest extends
         assertEquals(Integer.valueOf("4"), ObjectConverter.toInteger(Long.valueOf("4")));
         assertEquals(Integer.valueOf("4"), ObjectConverter.toInteger("4"));
         assertEquals(null, ObjectConverter.toInteger(new Date()));
-        assertEquals(null, ObjectConverter.toInteger(Double.NaN));
-        assertEquals(null, ObjectConverter.toInteger(Float.NaN));
+        assertEquals(Integer.valueOf("0"), ObjectConverter.toInteger(Double.NaN));
+        assertEquals(Integer.valueOf("0"), ObjectConverter.toInteger(Float.NaN));
+        assertEquals(Integer.valueOf("4"), ObjectConverter.toInteger(Integer.valueOf("4")));
     }
 
     public void testToLong() {
@@ -78,8 +80,9 @@ public class ObjectConverterTest extends
         assertEquals(Long.valueOf("4"), ObjectConverter.toLong(Integer.valueOf("4")));
         assertEquals(Long.valueOf("4"), ObjectConverter.toLong("4"));
         assertEquals(null, ObjectConverter.toLong(new Date()));
-        assertEquals(null, ObjectConverter.toLong(Double.NaN));
-        assertEquals(null, ObjectConverter.toLong(Float.NaN));
+        assertEquals(Long.valueOf("0"), ObjectConverter.toLong(Double.NaN));
+        assertEquals(Long.valueOf("0"), ObjectConverter.toLong(Float.NaN));
+        assertEquals(Long.valueOf("4"), ObjectConverter.toLong(Long.valueOf("4")));
     }
 
     public void testToFloat() {
@@ -87,8 +90,9 @@ public class ObjectConverterTest extends
         assertEquals(Float.valueOf("4"), ObjectConverter.toFloat(Integer.valueOf("4")));
         assertEquals(Float.valueOf("4"), ObjectConverter.toFloat("4"));
         assertEquals(null, ObjectConverter.toFloat(new Date()));
-        assertEquals(null, ObjectConverter.toFloat(Double.NaN));
+        assertEquals(Float.NaN, ObjectConverter.toFloat(Double.NaN));
         assertEquals(Float.NaN, ObjectConverter.toFloat(Float.NaN));
+        assertEquals(Float.valueOf("4"), ObjectConverter.toFloat(Float.valueOf("4")));
     }
 
     public void testToDouble() {
@@ -97,7 +101,8 @@ public class ObjectConverterTest extends
         assertEquals(Double.valueOf("4"), ObjectConverter.toDouble("4"));
         assertEquals(null, ObjectConverter.toDouble(new Date()));
         assertEquals(Double.NaN, ObjectConverter.toDouble(Double.NaN));
-        assertEquals(null, ObjectConverter.toDouble(Float.NaN));
+        assertEquals(Double.NaN, ObjectConverter.toDouble(Float.NaN));
+        assertEquals(Double.valueOf("4"), ObjectConverter.toDouble(Double.valueOf("4")));
     }
 
     public void testToString() {
@@ -107,4 +112,11 @@ public class ObjectConverterTest extends
         assertEquals("", ObjectConverter.toString(new StringBuilder("")));
     }
 
+    public void testNaN() throws Exception {
+        assertEquals(Double.NaN, ObjectConverter.toDouble(Double.NaN));
+        assertEquals(Double.NaN, ObjectConverter.toDouble(Float.NaN));
+        assertEquals(Float.NaN, ObjectConverter.toFloat(Double.NaN));
+        assertEquals(Float.NaN, ObjectConverter.toFloat(Float.NaN));
+    }
+
 }