/* * Copyright 2009 Udai Gupta, Ralf Joachim * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.castor.cpa.test.test12; import java.math.BigDecimal; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Enumeration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.castor.cpa.test.framework.CPATestCase; import org.castor.cpa.test.framework.xml.types.DatabaseEngineType; import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.PersistenceException; /** * Test on different type conversions. */ public final class TestTypeConversion extends CPATestCase { private static final Log LOG = LogFactory.getLog(TestTypeConversion.class); private static final String DBNAME = "test12"; private static final String MAPPING = "/org/castor/cpa/test/test12/mapping.xml"; private Database _db; private OQLQuery _oql; private static final String REASON = "Conversion failed because some value does not match what is expected."; /** * Constructor * * @param category The test suite of these tests */ public TestTypeConversion(final String name) { super(name); } // Test are only included/excluded for engines that have been tested with this test suite. public boolean include(final DatabaseEngineType engine) { return (engine == DatabaseEngineType.DERBY) || (engine == DatabaseEngineType.HSQL) || (engine == DatabaseEngineType.MYSQL) || (engine == DatabaseEngineType.ORACLE) || (engine == DatabaseEngineType.POSTGRESQL) || (engine == DatabaseEngineType.SAPDB); } public void setUp() throws Exception { // Open transaction in order to perform JDO operations _db = getJDOManager(DBNAME, MAPPING).getDatabase(); // Determine if test object exists, if not create it. // If it exists, set the name to some predefined value // that this test will later override. _db.begin(); _oql = _db.getOQLQuery("SELECT types FROM " + TypeConversion.class.getName() + " types WHERE id = $1"); // This one tests that bind performs type conversion _oql.bind(new Integer(TypeConversion.DEFAULT_ID)); Enumeration<?> enumeration = _oql.execute(); if (enumeration.hasMoreElements()) { TypeConversion types = (TypeConversion) enumeration.nextElement(); // reset all value to default types.setBoolInt(false); types.setBoolIntMinus(false); types.setBoolBigdec(false); types.setBoolBigdecMinus(false); types.setByteInt((byte) 0); types.setShortInt((short) 0); types.setLongInt(0); types.setDoubleInt(0.0); types.setFloatInt(0.0f); types.setIntBigdec(0); types.setFloatBigdec(0.0f); types.setDoubleBigdec(0.0); types.setIntString(0); types.setLongString(0); types.setBigdecString(new BigDecimal(0)); types.setFloatString(0.0f); types.setDoubleString(0.0d); LOG.debug("Updating object: " + types); } else { TypeConversion types = new TypeConversion(); LOG.debug("Creating new object: " + types); types.setId(TypeConversion.DEFAULT_ID); _db.create(types); } _db.commit(); } public void runTest() throws Exception { testConversion(); testValuesInDB(); } public void tearDown() throws PersistenceException { if (_db.isActive()) { _db.rollback(); } _db.close(); } public void testConversion() throws PersistenceException { // This one tests that bind performs type conversion LOG.debug("Testing date/time conversion"); _db.begin(); TypeConversion types = _db.load(TypeConversion.class, new Integer(TypeConversion.DEFAULT_ID)); types.setBoolInt(true); types.setBoolIntMinus(true); types.setBoolBigdec(true); types.setBoolBigdecMinus(true); types.setByteInt((byte) 123); types.setShortInt((short) 123); types.setLongInt(123); types.setDoubleInt(123.0); types.setFloatInt(123.0f); types.setIntBigdec(123); types.setFloatBigdec(123.0f); types.setDoubleBigdec(123.0); types.setIntString(123); types.setLongString(123); types.setBigdecString(new BigDecimal(123)); types.setFloatString(123.45f); types.setDoubleString(123.45); _db.commit(); _db.begin(); types = _db.load(TypeConversion.class, new Integer(TypeConversion.DEFAULT_ID)); if (types.getBoolInt() && types.getBoolIntMinus() && types.getBoolBigdec() && types.getBoolBigdecMinus() && (types.getByteInt() != (byte) 123) && (types.getShortInt() != (short) 123) && (types.getLongInt() != 123) && (types.getDoubleInt() != 123.0d) && (types.getFloatInt() != 123.0) && (types.getIntBigdec() != 123) && (types.getFloatBigdec() != 123.0) && (types.getDoubleBigdec() != 123.0d) && (types.getIntString() != 123) && (types.getLongString() != 123) && (types.getBigdecString() != new BigDecimal(123)) && (types.getFloatString() != 123.0) && (types.getDoubleString() != 123.0d)) { LOG.error(REASON); fail(REASON); } _db.commit(); LOG.debug("OK: Handled date/time types"); } public void testValuesInDB() throws Exception { LOG.debug("Test values in database"); // Create a statement and a resultset _db.begin(); Connection conn = _db.getJdbcConnection(); Statement stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery( "select bool_int, " + "bool_int_minus, bool_bigdec, bool_bigdec_minus " + "from test12_conv where id = " + TypeConversion.DEFAULT_ID); rs.next(); BigDecimal bigPlus = rs.getBigDecimal("bool_bigdec"); BigDecimal bigMinus = rs.getBigDecimal("bool_bigdec_minus"); if ((rs.getInt("bool_int") != 1) && (rs.getInt("bool_int_minus") != -1) && !bigPlus.equals(new BigDecimal(1)) && !bigMinus.equals(new BigDecimal(-1))) { LOG.error(REASON); fail(REASON); } _db.commit(); LOG.debug("OK: Found the expected Values in database"); } }