blob: 1f46925b5110051c675f8872ce38a84aefba736a [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.types;
import java.util.*;
import java.sql.*;
import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.testing.framework.*;
/**
* This class will test Date, Time, & Timestamp capabilities
*/
public class TimeDateTester extends TypeTester {
public java.sql.Date sqlDate;
public java.util.Date utilDate;
public Time time;
public Timestamp timestamp;
/**
* Creates a new empty tester. This should only be called by RelationalDescriptor when reading from database row.
*/
public TimeDateTester() {
super("NEW");
}
public TimeDateTester(String nameOfTest, int year, int month, int date, int hrs, int min, int sec, int nano) {
super(nameOfTest);
Calendar c = Calendar.getInstance();
c.set(year, month, date, hrs, min, sec);
c.set(Calendar.MILLISECOND, nano / 1000000);
utilDate = c.getTime();
sqlDate = Helper.dateFromYearMonthDate(year, month, date);
time = Helper.timeFromHourMinuteSecond(hrs, min, sec);
timestamp = Helper.timestampFromYearMonthDateHourMinuteSecondNanos(year, month, date, hrs, min, sec, nano);
}
public TimeDateTester(String nameOfTest, Calendar dateTime) {
this(nameOfTest, dateTime.get(Calendar.YEAR), dateTime.get(Calendar.MONTH), dateTime.get(Calendar.DATE), dateTime.get(Calendar.HOUR), dateTime.get(Calendar.MINUTE), dateTime.get(Calendar.SECOND), 0);
}
public static RelationalDescriptor descriptor() {
RelationalDescriptor descriptor = new RelationalDescriptor();
/* First define the class, table and descriptor properties. */
descriptor.setJavaClass(TimeDateTester.class);
descriptor.setTableName("TIMEDATE");
descriptor.setPrimaryKeyFieldName("NAME");
/* Next define the attribute mappings. */
descriptor.addDirectMapping("testName", "getTestName", "setTestName", "NAME");
descriptor.addDirectMapping("utilDate", "UTILDATE");
descriptor.addDirectMapping("sqlDate", "SQLDATE");
descriptor.addDirectMapping("time", "TTIME");
descriptor.addDirectMapping("timestamp", "TSTAMP");
return descriptor;
}
public static RelationalDescriptor descriptorWithAccessors() {
RelationalDescriptor descriptor = new RelationalDescriptor();
/* First define the class, table and descriptor properties. */
descriptor.setJavaClass(TimeDateTester.class);
descriptor.setTableName("TIMEDATE");
descriptor.setPrimaryKeyFieldName("NAME");
/* Next define the attribute mappings. */
descriptor.addDirectMapping("testName", "getTestName", "setTestName", "NAME");
descriptor.addDirectMapping("utilDate", "getUtilDate", "setUtilDate", "UTILDATE");
descriptor.addDirectMapping("sqlDate", "getSQLDate", "setSQLDate", "SQLDATE");
descriptor.addDirectMapping("time", "getTime", "setTime", "TTIME");
descriptor.addDirectMapping("timestamp", "getTimestamp", "setTimestamp", "TSTAMP");
return descriptor;
}
public java.sql.Date getSQLDate() {
return sqlDate;
}
public java.sql.Time getTime() {
return time;
}
public java.sql.Timestamp getTimestamp() {
return timestamp;
}
public java.util.Date getUtilDate() {
return utilDate;
}
public void setSQLDate(java.sql.Date aDate) {
sqlDate = aDate;
}
public void setTime(java.sql.Time aTime) {
time = aTime;
}
public void setTimestamp(java.sql.Timestamp aTimestamp) {
timestamp = aTimestamp;
}
public void setUtilDate(java.util.Date aDate) {
utilDate = aDate;
}
/**
*Return a platform independant definition of the database table.
*/
public static TableDefinition tableDefinition(Session session) {
TableDefinition definition = TypeTester.tableDefinition();
definition.setName("TIMEDATE");
definition.addField("UTILDATE", Timestamp.class, 6);
definition.addField("SQLDATE", java.sql.Date.class);
definition.addField("TTIME", Time.class);
definition.addField("TSTAMP", Timestamp.class, 6);
return definition;
}
static public Vector testInstances() {
Vector tests = new Vector();
tests.addElement(new TimeDateTester("NOW", Calendar.getInstance()));
tests.addElement(new TimeDateTester("ZERO", 1900, 0, 1, 0, 0, 0, 0));// I don't know if this make any sense
tests.addElement(new TimeDateTester("New Years Eve", 1997, 11, 31, 23, 59, 59, 900000000));
tests.addElement(new TimeDateTester("New Years Day", 1998, 1, 1, 0, 0, 1, 0));
tests.addElement(new TimeDateTester("New Years Eve 1999", 1999, 11, 31, 23, 59, 59, 0));
tests.addElement(new TimeDateTester("New Years Day 2000", 2000, 1, 1, 0, 0, 1, 0));
tests.addElement(new TimeDateTester("Doug's Birth", 1970, 8, 13, 16, 34, 0, 0));
tests.addElement(new TimeDateTester("Doug's 100th Birthday", 2070, 8, 13, 16, 34, 0, 0));
Calendar yearsBack100 = Calendar.getInstance();
yearsBack100.set(Calendar.YEAR, (yearsBack100.get(Calendar.YEAR) - 100));
tests.addElement(new TimeDateTester("100 Years ago", yearsBack100));
Calendar yearsAhead100 = Calendar.getInstance();
yearsAhead100.set(Calendar.YEAR, (yearsAhead100.get(Calendar.YEAR) + 100));
tests.addElement(new TimeDateTester("100 Years from now", yearsAhead100));
tests.addElement(new TimeDateTester("Before 1970", 1902, 8, 13, 16, 34, 25, 900000000));
return tests;
}
public String toString() {
return getTestName() + " -> " + timestamp;
}
@Override
protected void verify(WriteTypeObjectTest testCase) throws TestException {
try {
super.verify(testCase);
} catch (TestException e) {
// JConnect in non native mode
if ((caughtException != null) && caughtException.toString().equals("EXCEPTION: org.eclipse.persistence.exceptions.DatabaseException \n" + "DESCRIPTION: null \n" + "INTERNAL EXCEPTION: java.sql.SQLException: JZ0S8: An escape sequence in a SQL Query was malformed.\n" + "ERROR CODE: 0\n\n")) {
throw new TestProblemException("JConnect does not do dates in non-native SQL:\n" + caughtException.getInternalException());
}
// Some databases miss handle milliseconds
Timestamp objectTimeInCache = getTimestamp();
if (testCase.getObjectFromDatabase() == null) {
throw e;
}
Timestamp objectTimeInDB = ((TimeDateTester)testCase.getObjectFromDatabase()).getTimestamp();
int nunoSecond = objectTimeInCache.getNanos() / 100000000;
objectTimeInCache.setNanos(0);
if (getTimestamp().equals(objectTimeInDB)) {
throw new TestWarningException("The nanoseconds should be: " + nunoSecond + " but were read back as: " + objectTimeInDB.getNanos());
}
throw e;
}
}
}