/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.util; import java.math.BigDecimal; import java.math.BigInteger; import junit.framework.TestCase; import org.geotools.factory.Hints; public class NumericConverterFactoryTest extends TestCase { NumericConverterFactory factory; protected void setUp() throws Exception { factory = new NumericConverterFactory(); } public void testIntegral() throws Exception { //to byte assertEquals( new Byte( (byte)127 ), convert( new Byte( (byte)127 ), Byte.class ) ); assertEquals( new Byte( (byte)127 ), convert( new Short( (short)127 ), Byte.class ) ); assertEquals( new Byte( (byte)127 ), convert( new Integer( 127 ), Byte.class ) ); assertEquals( new Byte( (byte)127 ), convert( new Long( 127 ), Byte.class ) ); assertEquals( new Byte( (byte)127 ), convert( BigInteger.valueOf( 127 ), Byte.class ) ); //to short assertEquals( new Short( (short)127 ), convert( new Byte( (byte)127 ), Short.class ) ); assertEquals( new Short( (short)127 ), convert( new Short( (short)127 ), Short.class ) ); assertEquals( new Short( (short)127 ), convert( new Integer( 127 ), Short.class ) ); assertEquals( new Short( (short)127 ), convert( new Long( 127 ), Short.class ) ); assertEquals( new Short( (short)127 ), convert( BigInteger.valueOf( 127 ), Short.class ) ); //to integer assertEquals( new Integer( 127 ), convert( new Byte( (byte)127 ), Integer.class ) ); assertEquals( new Integer( 127 ), convert( new Short( (short)127 ), Integer.class ) ); assertEquals( new Integer( 127 ), convert( new Integer( 127 ), Integer.class ) ); assertEquals( new Integer( 127 ), convert( new Long( 127 ), Integer.class ) ); assertEquals( new Integer( 127 ), convert( BigInteger.valueOf( 127 ), Integer.class ) ); //to long assertEquals( new Long( 127 ), convert( new Byte( (byte)127 ), Long.class ) ); assertEquals( new Long( 127 ), convert( new Short( (short)127 ), Long.class ) ); assertEquals( new Long( 127 ), convert( new Integer( 127 ), Long.class ) ); assertEquals( new Long( 127 ), convert( new Long( 127 ), Long.class ) ); assertEquals( new Long( 127 ), convert( BigInteger.valueOf( 127 ), Long.class ) ); //to big integer assertEquals( BigInteger.valueOf( 127 ), convert( new Byte( (byte)127 ), BigInteger.class ) ); assertEquals( BigInteger.valueOf( 127 ), convert( new Short( (short)127 ), BigInteger.class ) ); assertEquals( BigInteger.valueOf( 127 ), convert( new Integer( 127 ), BigInteger.class ) ); assertEquals( BigInteger.valueOf( 127 ), convert( new Long( 127 ), BigInteger.class ) ); assertEquals( BigInteger.valueOf( 127 ), convert( BigInteger.valueOf( 127 ), BigInteger.class ) ); } public void testFloat() throws Exception { //to float assertEquals( new Float( 127.127 ), convert( new Float( 127.127 ), Float.class ) ); assertEquals( new Float( 127.127 ), convert( new Double( 127.127 ), Float.class ) ); assertEquals( new Float( 127.127 ), convert( new BigDecimal( 127.127 ), Float.class ) ); //to double assertEquals( new Double( 127.127 ).doubleValue(), ((Double)convert( new Float( 127.127 ), Double.class )).doubleValue(), 1e-10 ); assertEquals( new Double( 127.127 ), convert( new Double( 127.127 ), Double.class ) ); assertEquals( new Double( 127.127 ), convert( new BigDecimal( 127.127 ), Double.class ) ); //to big decimal assertEquals( new BigDecimal( 127.127 ).doubleValue(), ((BigDecimal) convert( new Float( 127.127 ), BigDecimal.class )).doubleValue(), 1e-10 ); assertEquals( new BigDecimal( "127.127" ), convert( new Double( 127.127 ), BigDecimal.class ) ); assertEquals( new BigDecimal( 127.127 ), convert( new BigDecimal( 127.127 ), BigDecimal.class ) ); } public void testIntegralToFloat() throws Exception { assertEquals( new Float( 127.0 ), convert( new Byte( (byte)127 ), Float.class ) ); assertEquals( new Float( 127.0 ), convert( new Short( (short)127 ), Float.class ) ); assertEquals( new Float( 127.0 ), convert( new Integer( 127 ), Float.class ) ); assertEquals( new Float( 127.0 ), convert( new Long( 127 ), Float.class ) ); assertEquals( new Float( 127.0 ), convert( BigInteger.valueOf( 127 ), Float.class ) ); assertEquals( new Double( 127.0 ), convert( new Byte( (byte)127 ), Double.class ) ); assertEquals( new Double( 127.0 ), convert( new Short( (short)127 ), Double.class ) ); assertEquals( new Double( 127.0 ), convert( new Integer( 127 ), Double.class ) ); assertEquals( new Double( 127.0 ), convert( new Long( 127 ), Double.class ) ); assertEquals( new Double( 127.0 ), convert( BigInteger.valueOf( 127 ), Double.class ) ); assertEquals( new BigDecimal( 127.0 ), convert( new Byte( (byte)127 ), BigDecimal.class ) ); assertEquals( new BigDecimal( 127.0 ), convert( new Short( (short)127 ), BigDecimal.class ) ); assertEquals( new BigDecimal( 127.0 ), convert( new Integer( 127 ), BigDecimal.class ) ); assertEquals( new BigDecimal( 127.0 ), convert( new Long( 127 ), BigDecimal.class ) ); assertEquals( new BigDecimal( 127.0 ), convert( BigInteger.valueOf( 127 ), BigDecimal.class ) ); } public void testFloatToIntegral() throws Exception { //to byte assertEquals( new Byte( (byte)127 ), convert( new Float( 127.127 ), Byte.class ) ); assertEquals( new Byte( (byte)127 ), convert( new Double( 127.127 ), Byte.class ) ); assertEquals( new Byte( (byte)127 ), convert( new BigDecimal( 127.127 ), Byte.class ) ); //to short assertEquals( new Short( (short)127 ), convert( new Float( 127.127 ), Short.class ) ); assertEquals( new Short( (short)127 ), convert( new Double( 127.127 ), Short.class ) ); assertEquals( new Short( (short)127 ), convert( new BigDecimal( 127.127 ), Short.class ) ); //to integer assertEquals( new Integer( 127 ), convert( new Float( 127.127 ), Integer.class ) ); assertEquals( new Integer( 127 ), convert( new Double( 127.127 ), Integer.class ) ); assertEquals( new Integer( 127 ), convert( new BigDecimal( 127.127 ), Integer.class ) ); //to long assertEquals( new Long( 127 ), convert( new Float( 127.127 ), Long.class ) ); assertEquals( new Long( 127 ), convert( new Double( 127.127 ), Long.class ) ); assertEquals( new Long( 127 ), convert( new BigDecimal( 127.127 ), Long.class ) ); //to big integer assertEquals( BigInteger.valueOf( 127 ), convert( new Float( 127.127 ), BigInteger.class ) ); assertEquals( BigInteger.valueOf( 127 ), convert( new Double( 127.127 ), BigInteger.class ) ); assertEquals( BigInteger.valueOf( 127 ), convert( new BigDecimal( 127.127 ), BigInteger.class ) ); } public void testStringToInteger() throws Exception { assertEquals( new Integer(127), convert( "127", Integer.class ) ); assertEquals( new Integer(127), convert( " 127 ", Integer.class ) ); assertEquals( new Integer(3), convert( " 3.0 ", Integer.class ) ); assertEquals( new Integer(-3), convert( "-3.0 ", Integer.class ) ); assertEquals( new Integer(3000), convert( "3000.0 ", Integer.class ) ); assertEquals( new Integer(3000), convert( "3000,0 ", Integer.class ) ); } public void testStringToDouble() throws Exception { assertEquals( new Double(4.4), convert( "4.4", Double.class ) ); assertEquals( new Double(127), convert( "127", Double.class ) ); assertEquals( new Double(127), convert( " 127 ", Double.class ) ); assertEquals( new Double(3), convert( " 3.0 ", Double.class ) ); assertEquals( new Double(-3), convert( "-3.0 ", Double.class ) ); assertEquals( new Double(3000), convert( "3000.0 ", Double.class ) ); } public void testStringToNumber() throws Exception { assertEquals( new Double(4.4), convert( "4.4", Number.class )); } Object convert( Object source, Class target ) throws Exception { return factory.createConverter( source.getClass(), target, null ).convert( source, target ); } public static void testIntegralHandling(){ assertEquals( "3", NumericConverterFactory.toIntegral("3")); assertEquals( "3", NumericConverterFactory.toIntegral("3.0")); assertEquals( "-3", NumericConverterFactory.toIntegral("-3")); assertEquals( "-3", NumericConverterFactory.toIntegral("-3.0")); assertEquals( "3000", NumericConverterFactory.toIntegral("3000.0")); assertEquals( "3000", NumericConverterFactory.toIntegral("3000,0")); } Object convertSafe(Object source, Class<?> target) throws Exception { Hints hints = new Hints(); hints.put(ConverterFactory.SAFE_CONVERSION, new Boolean(true)); return factory.createConverter(source.getClass(), target, hints).convert(source, target); } public void testSafeConversion() throws Exception { // byte assertEquals(new Byte((byte) 127), convertSafe(new Byte((byte) 127), Byte.class)); assertNull(convertSafe(new Short((short) 128), Byte.class)); assertNull(convertSafe(new Integer(128), Byte.class)); assertNull(convertSafe(new Long(128), Byte.class)); assertNull(convertSafe(BigInteger.valueOf(128), Byte.class)); assertNull(convertSafe(new Double(128.1), Byte.class)); assertNull(convertSafe(new BigDecimal(128.1), Byte.class)); assertNull(convertSafe(new Float(128.1), Byte.class)); // short assertEquals(new Short((short) 127), convertSafe(new Byte((byte) 127), Short.class)); assertEquals(new Short((short) 1111), convertSafe(new Short((short) 1111), Short.class)); assertNull(convertSafe(new Integer(128), Short.class)); assertNull(convertSafe(new Long(128), Short.class)); assertNull(convertSafe(BigInteger.valueOf(128), Short.class)); assertNull(convertSafe(new Double(128.1), Short.class)); assertNull(convertSafe(new BigDecimal(128.1), Short.class)); assertNull(convertSafe(new Float(128.1), Short.class)); // integer assertEquals(new Integer(127), convertSafe(new Byte((byte) 127), Integer.class)); assertEquals(new Integer(1111), convertSafe(new Short((short) 1111), Integer.class)); assertEquals(new Integer(12345), convertSafe(new Integer(12345), Integer.class)); assertNull(convertSafe(new Long(128), Integer.class)); assertNull(convertSafe(BigInteger.valueOf(128), Integer.class)); assertNull(convertSafe(new Double(128.1), Integer.class)); assertNull(convertSafe(new BigDecimal(128.1), Integer.class)); assertNull(convertSafe(new Float(128.1), Integer.class)); // long assertEquals(new Long(127), convertSafe(new Byte((byte) 127), Long.class)); assertEquals(new Long(1111), convertSafe(new Short((short) 1111), Long.class)); assertEquals(new Long(12345), convertSafe(new Integer(12345), Long.class)); assertEquals(new Long(1234567), convertSafe(new Integer(1234567), Long.class)); assertNull(convertSafe(BigInteger.valueOf(128), Long.class)); assertNull(convertSafe(new Double(128.1), Long.class)); assertNull(convertSafe(new BigDecimal(128.1), Long.class)); assertNull(convertSafe(new Float(128.1), Long.class)); // big integer assertEquals(BigInteger.valueOf(127), convertSafe(new Byte((byte) 127), BigInteger.class)); assertEquals(BigInteger.valueOf(1111), convertSafe(new Short((short) 1111), BigInteger.class)); assertEquals(BigInteger.valueOf(12345), convertSafe(new Integer(12345), BigInteger.class)); assertEquals(BigInteger.valueOf(1234567), convertSafe(new Integer(1234567), BigInteger.class)); assertEquals(BigInteger.valueOf(12345678), convertSafe(BigInteger.valueOf(12345678), BigInteger.class)); assertNull(convertSafe(new Double(128.1), Long.class)); assertNull(convertSafe(new BigDecimal(128.1), Long.class)); assertNull(convertSafe(new Float(128.1), Long.class)); // double assertEquals(new Double(127), convertSafe(new Byte((byte) 127), Double.class)); assertEquals(new Double(1111), convertSafe(new Short((short) 1111), Double.class)); assertEquals(new Double(12345), convertSafe(new Integer(12345), Double.class)); assertEquals(new Double(1234567), convertSafe(new Integer(1234567), Double.class)); //assertEquals(new Double(12345678), convertSafe(BigInteger.valueOf(12345678), Double.class)); assertEquals(new Double(12.123456), convertSafe(new Double(12.123456), Double.class)); assertNull(convertSafe(new BigDecimal(128.1), Long.class)); assertEquals(new Double(12.12), convertSafe(new Float(12.12), Double.class)); // float assertEquals(new Float(127), convertSafe(new Byte((byte) 127), Float.class)); assertEquals(new Float(1111), convertSafe(new Short((short) 1111), Float.class)); assertEquals(new Float(12345), convertSafe(new Integer(12345), Float.class)); assertEquals(new Float(1234567), convertSafe(new Integer(1234567), Float.class)); assertNull(convertSafe(BigInteger.valueOf(12345678), Float.class)); assertNull(convertSafe(new Double(128.1), Float.class)); assertNull(convertSafe(new BigDecimal(128.1), Float.class)); assertEquals(new Float(12.12), convertSafe(new Float(12.12), Float.class)); // Big Decimal assertEquals(new BigDecimal(127), convertSafe(new Byte((byte) 127), BigDecimal.class)); assertEquals(new BigDecimal(1111), convertSafe(new Short((short) 1111), BigDecimal.class)); assertEquals(new BigDecimal(12345), convertSafe(new Integer(12345), BigDecimal.class)); assertEquals(new BigDecimal(1234567), convertSafe(new Integer(1234567), BigDecimal.class)); assertEquals(new BigDecimal(12345678), convertSafe(BigInteger.valueOf(12345678), BigDecimal.class)); assertEquals(new BigDecimal((new Double(12.123456)).toString()), convertSafe(new Double( 12.123456), BigDecimal.class)); assertEquals(new BigDecimal(128.1), convertSafe(new BigDecimal(128.1), BigDecimal.class)); assertEquals(new BigDecimal((new Float(12.12)).toString()), convertSafe(new Float(12.12), BigDecimal.class)); // test strings assertEquals(new BigDecimal(127), convertSafe("127", BigDecimal.class)); assertNull(convertSafe("127f", BigDecimal.class)); assertEquals(new Double(127.123), convertSafe("127.123", Double.class)); assertNull(convertSafe("123.456.456", Double.class)); assertEquals(new Float(127.123), convertSafe("127.123", Float.class)); assertNull(convertSafe("123.456.456", Float.class)); assertEquals(BigInteger.valueOf(1234567), convertSafe("1234567", BigInteger.class)); assertNull(convertSafe("123.456", BigInteger.class)); assertEquals(new Long(54), convertSafe("54", Long.class)); assertNull(convertSafe("123.6", Long.class)); assertEquals(new Integer(54), convertSafe("54", Integer.class)); assertNull(convertSafe("123.6", Integer.class)); assertEquals(new Short((short) 54), convertSafe("54", Short.class)); assertNull(convertSafe("123.6", Short.class)); assertEquals(new Byte("1"), convertSafe("1", Byte.class)); assertNull(convertSafe("123.6", Byte.class)); } public void testPrimitiveTypes() throws Exception { assertEquals(1, convert(new Integer(1), int.class)); assertEquals(new Integer(1), convert(new Integer(1), int.class)); assertEquals(1, convert(1, Integer.class)); assertEquals(new Integer(1), convert(1, Integer.class)); assertEquals(1, convert("1", int.class)); assertEquals(new Integer(1), convert("1", int.class)); assertEquals(1, convert("1", Integer.class)); assertEquals(new Integer(1), convert("1", Integer.class)); } }