/*******************************************************************************
* Copyright (c) 1998, 2015 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
* 07/07/2014-2.5.3 Rick Curtis
* - 375101: Date and Calendar should not require @Temporal.
******************************************************************************/
package org.eclipse.persistence.testing.tests.jpa.datetime;
import java.util.Date;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.datetime.DateTime;
import org.eclipse.persistence.testing.models.jpa.datetime.DateTimeTableCreator;
/**
* <p>
* <b>Purpose</b>: Test binding of null values to temporal type fields in TopLink's JPA
* implementation.
* <p>
* <b>Description</b>: This class creates a test suite and adds tests to the suite. The database
* gets initialized prior to the test methods.
* <p>
* <b>Responsibilities</b>:
* <ul>
* <li>Run tests for binding of null values to temporal type fields in TopLink's JPA implementation.
* </ul>
*
* @see org.eclipse.persistence.testing.models.jpa.datetime.DateTimeTableCreator
*/
public class NullBindingJUnitTestCase extends JUnitTestCase {
private static int datetimeId;
public NullBindingJUnitTestCase() {
super();
}
public NullBindingJUnitTestCase(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite("Null Binding DateTime");
suite.addTest(new NullBindingJUnitTestCase("testSetup"));
suite.addTest(new NullBindingJUnitTestCase("testCreateDateTime"));
suite.addTest(new NullBindingJUnitTestCase("testNullifySqlDate"));
suite.addTest(new NullBindingJUnitTestCase("testNullifyTime"));
suite.addTest(new NullBindingJUnitTestCase("testNullifyTimestamp"));
suite.addTest(new NullBindingJUnitTestCase("testNullifyUtilDate"));
suite.addTest(new NullBindingJUnitTestCase("testNullifyCalendar"));
suite.addTest(new NullBindingJUnitTestCase("testDateTimeMap"));
return suite;
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the
* server.
*/
public void testSetup() {
new DateTimeTableCreator().replaceTables(JUnitTestCase.getServerSession());
clearCache();
}
/**
* Creates the DateTime instance used in later tests.
*/
public void testCreateDateTime() {
EntityManager em = createEntityManager();
DateTime dt;
beginTransaction(em);
dt =
new DateTime(new java.sql.Date(0), new java.sql.Time(0), new java.sql.Timestamp(0), new java.util.Date(0),
java.util.Calendar.getInstance());
em.persist(dt);
datetimeId = dt.getId();
commitTransaction(em);
}
/**
*/
public void testNullifySqlDate() {
EntityManager em = createEntityManager();
Query q;
DateTime dt, dt2;
try {
beginTransaction(em);
dt = em.find(DateTime.class, datetimeId);
dt.setDate(null);
commitTransaction(em);
q = em.createQuery("SELECT dt FROM DateTime dt WHERE dt.id = " + datetimeId);
dt2 = (DateTime) q.getSingleResult();
assertTrue("Error setting java.sql.Date field to null", dt2.getDate() == null);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
/**
*/
public void testNullifyTime() {
EntityManager em = createEntityManager();
Query q;
DateTime dt, dt2;
try {
beginTransaction(em);
dt = em.find(DateTime.class, datetimeId);
dt.setTime(null);
commitTransaction(em);
q = em.createQuery("SELECT dt FROM DateTime dt WHERE dt.id = " + datetimeId);
dt2 = (DateTime) q.getSingleResult();
assertTrue("Error setting java.sql.Time field to null", dt2.getTime() == null);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
/**
*/
public void testNullifyTimestamp() {
EntityManager em = createEntityManager();
Query q;
DateTime dt, dt2;
try {
beginTransaction(em);
dt = em.find(DateTime.class, datetimeId);
dt.setTimestamp(null);
commitTransaction(em);
q = em.createQuery("SELECT dt FROM DateTime dt WHERE dt.id = " + datetimeId);
dt2 = (DateTime) q.getSingleResult();
assertTrue("Error setting java.sql.Timestamp field to null", dt2.getTimestamp() == null);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
/**
*/
public void testNullifyUtilDate() {
EntityManager em = createEntityManager();
Query q;
DateTime dt, dt2;
try {
beginTransaction(em);
dt = em.find(DateTime.class, datetimeId);
dt.setUtilDate(null);
commitTransaction(em);
q = em.createQuery("SELECT dt FROM DateTime dt WHERE dt.id = " + datetimeId);
dt2 = (DateTime) q.getSingleResult();
assertTrue("Error setting java.util.Date field to null", dt2.getUtilDate() == null);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
/**
*/
public void testNullifyCalendar() {
EntityManager em = createEntityManager();
Query q;
DateTime dt, dt2;
try {
beginTransaction(em);
dt = em.find(DateTime.class, datetimeId);
dt.setCalendar(null);
commitTransaction(em);
q = em.createQuery("SELECT dt FROM DateTime dt WHERE dt.id = " + datetimeId);
dt2 = (DateTime) q.getSingleResult();
assertTrue("Error setting java.util.Calendar field to null", dt2.getCalendar() == null);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
public void testDateTimeMap() {
EntityManager em = createEntityManager();
try {
beginTransaction(em);
DateTime dt = em.find(DateTime.class, datetimeId);
assertNotNull(dt);
Map<Date, DateTime> map = dt.getUniSelfMap();
assertNotNull(map);
// Make sure that we find ourselves in the map!
assertTrue(map.values().contains(dt));
closeEntityManagerAndTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
}