| /* Copyright (c) 2001-2010, The HSQL Development Group |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * Neither the name of the HSQL Development Group nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| |
| package org.hsqldb.test; |
| |
| import java.sql.Connection; |
| import java.sql.PreparedStatement; |
| import java.sql.ResultSet; |
| import java.sql.Statement; |
| import java.text.DateFormat; |
| import java.util.Calendar; |
| |
| import junit.framework.Assert; |
| |
| /** |
| * Tests for normalisation of Time and Date values. |
| * Base on the original test submission. |
| * @author Miro Halas |
| */ |
| public class TestDateTime extends TestBase { |
| |
| public TestDateTime(String s) { |
| super(s); |
| } |
| |
| protected void setUp() { |
| |
| super.setUp(); |
| |
| try { |
| Connection connection = super.newConnection(); |
| Statement statement = connection.createStatement(); |
| |
| statement.execute("drop table time_test if exists"); |
| statement.execute("drop table date_test if exists"); |
| statement.execute("create table time_test(time_test time)"); |
| statement.execute("create table date_test(date_test date)"); |
| connection.close(); |
| } catch (Exception e) {} |
| } |
| |
| /** |
| * Test the database support for Date objects. Date object ignores the time |
| * portion of the Java Date. |
| * |
| * This class inserts date into database, then retrieve it back using |
| * different java time |
| * |
| * @throws Throwable - an error has occured during test |
| */ |
| public void testBasicDateSupport() throws Throwable { |
| |
| final String INSERT_DATE = |
| "insert into date_test(date_test) values (?)"; |
| |
| // See OracleTests class why we need to select tablename.* |
| final String SELECT_DATE = |
| "select date_test.* from date_test where date_test = ?"; |
| final String DELETE_DATE = |
| "delete from date_test where date_test = ?"; |
| Calendar calGenerate = Calendar.getInstance(); |
| java.sql.Date insertDate; |
| Connection connection = super.newConnection(); |
| PreparedStatement insertStatement; |
| int iUpdateCount = 0; |
| |
| // Set date of my birthday ;-) |
| calGenerate.set(1995, 9, 15, 1, 2, 3); |
| |
| insertDate = new java.sql.Date(calGenerate.getTimeInMillis()); |
| insertStatement = connection.prepareStatement(INSERT_DATE); |
| |
| insertStatement.setDate(1, insertDate); |
| |
| iUpdateCount = insertStatement.executeUpdate(); |
| |
| insertStatement.close(); |
| Assert.assertEquals( |
| "Exactly one record with date data shoud have been inserted.", |
| iUpdateCount, 1); |
| |
| // Now select it back to be sure it is there |
| PreparedStatement selectStatement = null; |
| PreparedStatement deleteStatement = null; |
| ResultSet results = null; |
| java.sql.Date retrievedDate = null; |
| boolean bHasMoreThanOne; |
| int iDeletedCount = 0; |
| |
| // Set different time, since when we are dealing with just dates it |
| // shouldn't matter |
| calGenerate.set(1995, 9, 15, 2, 3, 4); |
| |
| java.sql.Date selectDate = |
| new java.sql.Date(calGenerate.getTimeInMillis()); |
| |
| selectStatement = connection.prepareStatement(SELECT_DATE); |
| |
| selectStatement.setDate(1, selectDate); |
| |
| results = selectStatement.executeQuery(); |
| |
| // Get the date from the database |
| Assert.assertTrue("The inserted date is not in the database.", |
| results.next()); |
| |
| retrievedDate = results.getDate(1); |
| deleteStatement = connection.prepareStatement(DELETE_DATE); |
| |
| deleteStatement.setDate(1, insertDate); |
| |
| iDeletedCount = deleteStatement.executeUpdate(); |
| |
| deleteStatement.close(); |
| Assert.assertEquals( |
| "Exactly one record with date data shoud have been deleted.", |
| iDeletedCount, 1); |
| |
| boolean result = retrievedDate.toString().startsWith( |
| insertDate.toString().substring(0, 10)); |
| |
| Assert.assertTrue( |
| "The date retrieved from database " |
| + DateFormat.getDateTimeInstance().format(retrievedDate) |
| + " is not the same as the inserted one " |
| + DateFormat.getDateTimeInstance().format(insertDate), result); |
| } |
| |
| public void testBasicDefaultTimeSupport() throws Throwable { |
| |
| final String INSERT_TIME = |
| "insert into time_test(time_test) values (?)"; |
| |
| // See OracleTests class why we need to select tablename.* |
| final String SELECT_TIME = |
| "select time_test.* from time_test where time_test = ?"; |
| final String DELETE_TIME = |
| "delete from time_test where time_test = ?"; |
| java.sql.Time insertTime; |
| Connection connection = super.newConnection(); |
| PreparedStatement insertStatement; |
| int iUpdateCount = 0; |
| |
| insertTime = new java.sql.Time(3600000); |
| insertStatement = connection.prepareStatement(INSERT_TIME); |
| |
| insertStatement.setTime(1, insertTime); |
| |
| iUpdateCount = insertStatement.executeUpdate(); |
| |
| insertStatement.close(); |
| Assert.assertEquals( |
| "Exactly one record with time data shoud have been inserted.", |
| iUpdateCount, 1); |
| |
| // Now select it back to be sure it is there |
| PreparedStatement selectStatement = null; |
| PreparedStatement deleteStatement = null; |
| ResultSet results = null; |
| java.sql.Time retrievedTime; |
| int iDeletedCount = 0; |
| java.sql.Time selectTime; |
| |
| selectStatement = connection.prepareStatement(SELECT_TIME); |
| |
| selectTime = new java.sql.Time(3600000); |
| |
| selectStatement.setTime(1, selectTime); |
| |
| results = selectStatement.executeQuery(); |
| |
| // Get the date from the database |
| Assert.assertTrue("The inserted time is not in the database.", |
| results.next()); |
| |
| retrievedTime = results.getTime(1); |
| |
| // |
| deleteStatement = connection.prepareStatement(DELETE_TIME); |
| |
| deleteStatement.setTime(1, insertTime); |
| |
| iDeletedCount = deleteStatement.executeUpdate(); |
| |
| Assert.assertEquals( |
| "Exactly one record with time data shoud have been deleted.", |
| iDeletedCount, 1); |
| |
| // And now test the date |
| Assert.assertNotNull( |
| "The inserted time shouldn't be retrieved as null from the database", |
| retrievedTime); |
| |
| // Ignore milliseconds when comparing dates |
| String selectString = selectTime.toString(); |
| String retrievedString = retrievedTime.toString(); |
| |
| boolean result = |
| retrievedString.equals(selectString); |
| |
| Assert.assertTrue( |
| "The time retrieved from database " |
| + DateFormat.getDateTimeInstance().format(retrievedTime) |
| + " is not the same as the inserted one " |
| + DateFormat.getDateTimeInstance().format(insertTime), result); |
| } |
| |
| /** |
| * Test the database support for Time objects. Time object ignores the date |
| * portion of the Java Date. |
| * |
| * This class inserts time into database, then retrieve it back using |
| * different java date and deletes it using cursor. |
| * |
| * Uses the already setup connection and transaction. |
| * No need to close the connection since base class is doing it for us. |
| * |
| * @throws Throwable - an error has occured during test |
| */ |
| public void testBasicTimeSupport() throws Throwable { |
| |
| final String INSERT_TIME = |
| "insert into time_test(time_test) values (?)"; |
| |
| // See OracleTests class why we need to select tablename.* |
| final String SELECT_TIME = |
| "select time_test.* from time_test where time_test = ?"; |
| final String DELETE_TIME = |
| "delete from time_test where time_test = ?"; |
| Calendar calGenerate = Calendar.getInstance(); |
| java.sql.Time insertTime; |
| Connection connection = super.newConnection(); |
| PreparedStatement insertStatement; |
| int iUpdateCount = 0; |
| |
| // Set date of my birthday ;-) |
| calGenerate.set(1995, 9, 15, 1, 2, 3); |
| |
| insertTime = new java.sql.Time(calGenerate.getTime().getTime()); |
| insertStatement = connection.prepareStatement(INSERT_TIME); |
| |
| insertStatement.setTime(1, insertTime, calGenerate); |
| |
| iUpdateCount = insertStatement.executeUpdate(); |
| |
| insertStatement.close(); |
| Assert.assertEquals( |
| "Exactly one record with time data shoud have been inserted.", |
| iUpdateCount, 1); |
| |
| // Now select it back to be sure it is there |
| PreparedStatement selectStatement = null; |
| PreparedStatement deleteStatement = null; |
| ResultSet results = null; |
| java.sql.Time retrievedTime; |
| int iDeletedCount = 0; |
| java.sql.Time selectTime; |
| |
| selectStatement = connection.prepareStatement(SELECT_TIME); |
| |
| // Set different date, since when we are dealing with just time it |
| // shouldn't matter |
| // fredt - but make sure the date is in the same daylight saving range as today ! |
| calGenerate.set(1975, 9, 16, 1, 2, 3); |
| |
| selectTime = new java.sql.Time(calGenerate.getTime().getTime()); |
| |
| selectStatement.setTime(1, selectTime, calGenerate); |
| |
| results = selectStatement.executeQuery(); |
| |
| // Get the date from the database |
| Assert.assertTrue("The inserted time is not in the database.", |
| results.next()); |
| |
| retrievedTime = results.getTime(1, calGenerate); |
| |
| // |
| deleteStatement = connection.prepareStatement(DELETE_TIME); |
| |
| deleteStatement.setTime(1, insertTime, calGenerate); |
| |
| iDeletedCount = deleteStatement.executeUpdate(); |
| |
| Assert.assertEquals( |
| "Exactly one record with time data shoud have been deleted.", |
| iDeletedCount, 1); |
| |
| // And now test the date |
| Assert.assertNotNull( |
| "The inserted time shouldn't be retrieved as null from the database", |
| retrievedTime); |
| |
| // Ignore milliseconds when comparing dates |
| String selectString = selectTime.toString(); |
| String retrievedString = retrievedTime.toString(); |
| |
| boolean result = |
| retrievedString.equals(selectString); |
| |
| Assert.assertTrue( |
| "The time retrieved from database " |
| + DateFormat.getDateTimeInstance().format(retrievedTime) |
| + " is not the same as the inserted one " |
| + DateFormat.getDateTimeInstance().format(insertTime), result); |
| } |
| } |