blob: b576b1ebae0c35f4db5cd8983a7aada84dd0a39b [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
// 06/20/2008-1.0 Guy Pelletier
// - 232975: Failure when attribute type is generic
// 08/15/2008-1.0.1 Chris Delahunt
// - 237545: List attribute types on OneToMany using @OrderBy does not work with attribute change tracking
package org.eclipse.persistence.testing.tests.jpa.inherited;
import java.util.Date;
import java.util.Vector;
import jakarta.persistence.EntityManager;
import junit.framework.*;
import org.eclipse.persistence.testing.models.jpa.inherited.Alpine;
import org.eclipse.persistence.testing.models.jpa.inherited.BeerConsumer;
import org.eclipse.persistence.testing.models.jpa.inherited.SerialNumber;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.inherited.InheritedTableManager;
@SuppressWarnings("deprecation")
public class OrderedListJunitTest extends JUnitTestCase {
private static Integer m_beerConsumerId;
public OrderedListJunitTest() {
super();
}
public OrderedListJunitTest(String name) {
super(name);
}
@Override
public void setUp() {
super.setUp();
clearCache();
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("OrderedListJunitTest");
suite.addTest(new OrderedListJunitTest("testSetup"));
suite.addTest(new OrderedListJunitTest("testInitialize"));
suite.addTest(new OrderedListJunitTest("test1"));
suite.addTest(new OrderedListJunitTest("testInitialize"));
suite.addTest(new OrderedListJunitTest("test2"));
suite.addTest(new OrderedListJunitTest("testInitialize"));
suite.addTest(new OrderedListJunitTest("test3"));
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 InheritedTableManager().replaceTables(JUnitTestCase.getServerSession());
clearCache();
}
public void testInitialize() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
BeerConsumer beerConsumer = new BeerConsumer();
beerConsumer.setName("Guy Pelletier");
em.persist(beerConsumer);
m_beerConsumerId = beerConsumer.getId();
SerialNumber serialNumber1 = new SerialNumber();
em.persist(serialNumber1);
Alpine alpine1 = new Alpine(serialNumber1);
em.persist(alpine1);
alpine1.setBestBeforeDate(new Date(2005, 8, 17));
alpine1.setAlcoholContent(5.0);
alpine1.setClassification(Alpine.Classification.STRONG);
beerConsumer.addAlpineBeerToConsume(alpine1);
SerialNumber serialNumber2 = new SerialNumber();
em.persist(serialNumber2);
Alpine alpine2 = new Alpine(serialNumber2);
em.persist(alpine2);
alpine2.setBestBeforeDate(new Date(2005, 8, 19));
alpine2.setAlcoholContent(4.0);
alpine2.setClassification(Alpine.Classification.STRONG);
beerConsumer.addAlpineBeerToConsume(alpine2);
SerialNumber serialNumber3 = new SerialNumber();
em.persist(serialNumber3);
Alpine alpine3 = new Alpine(serialNumber3);
em.persist(alpine3);
alpine3.setBestBeforeDate(new Date(2005, 8, 21));
alpine3.setAlcoholContent(3.0);
alpine3.setClassification(Alpine.Classification.STRONG);
beerConsumer.addAlpineBeerToConsume(alpine3);
SerialNumber serialNumber4 = new SerialNumber();
em.persist(serialNumber4);
Alpine alpine4 = new Alpine(serialNumber4);
em.persist(alpine4);
alpine4.setBestBeforeDate(new Date(2005, 8, 23));
alpine4.setAlcoholContent(2.0);
alpine4.setClassification(Alpine.Classification.BITTER);
beerConsumer.addAlpineBeerToConsume(alpine4);
SerialNumber serialNumber5 = new SerialNumber();
em.persist(serialNumber5);
Alpine alpine5 = new Alpine(serialNumber5);
em.persist(alpine5);
alpine5.setBestBeforeDate(new Date(2005, 8, 25));
alpine5.setAlcoholContent(1.0);
alpine5.setClassification(Alpine.Classification.SWEET);
beerConsumer.addAlpineBeerToConsume(alpine5);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
}
public void test1() {
BeerConsumer beerConsumer = null;
Alpine alpine1 = null;
Alpine alpine2 = null;
EntityManager em = createEntityManager();
try {
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
beginTransaction(em);
beerConsumer = em.merge(beerConsumer);
alpine1 = beerConsumer.removeAlpineBeerToConsume(1);
alpine2 = beerConsumer.removeAlpineBeerToConsume(1);
commitTransaction(em);
}catch (RuntimeException ex){
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during test1 : [" + ex.getMessage() + "]");
}
// Read the beerConsumer back from the EM.
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
Vector alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("Incorrect number of alpines in the list", alpinesFromCache.size() == 3);
assertFalse("Alpine 1 was not removed from the list", alpinesFromCache.contains(alpine1));
assertFalse("Alpine 2 was not removed from the list", alpinesFromCache.contains(alpine2));
// Read the beerConsumer back from the shared cache.
em.clear();
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("Shared cache: Incorrect number of alpines in the list", alpinesFromCache.size() == 3);
assertFalse("Shared cache: Alpine 1 was not removed from the list", alpinesFromCache.contains(alpine1));
assertFalse("Shared cache: Alpine 2 was not removed from the list", alpinesFromCache.contains(alpine2));
// Read the beerConsumer back from the database.
this.clearCache();
em.clear();
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("database: Incorrect number of alpines in the list", alpinesFromCache.size() == 3);
assertFalse("database: Alpine 1 was not removed from the list", alpinesFromCache.contains(alpine1));
assertFalse("database: Alpine 2 was not removed from the list", alpinesFromCache.contains(alpine2));
}
public void test2() {
BeerConsumer beerConsumer = null;
Alpine alpine1 = null;
Alpine alpine2 = null;
EntityManager em = createEntityManager();
try {
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
beginTransaction(em);
beerConsumer = em.merge(beerConsumer);
alpine1 = beerConsumer.moveAlpineBeerToConsume(2, 4);
alpine2 = beerConsumer.moveAlpineBeerToConsume(1, 3);
commitTransaction(em);
}catch (RuntimeException ex){
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught while adding the new alpine at a specific index: [" + ex.getMessage() + "]");
}
// Read the beerConsumer back from the EM.
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
Vector alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("Incorrect number of alpines in the list", alpinesFromCache.size() == 5);
assertTrue("Alpine 1 was not at the correct index.", alpinesFromCache.indexOf(alpine1) == 4);
assertTrue("Alpine 2 was not at the correct index.", alpinesFromCache.indexOf(alpine2) == 3);
// Read the beerConsumer back from the shared cache.
em.clear();
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("Shared cache: Incorrect number of alpines in the list", alpinesFromCache.size() == 5);
assertTrue("Shared cache: Alpine 1 was not at the correct index.", alpinesFromCache.indexOf(alpine1) == 4);
assertTrue("Shared cache: Alpine 2 was not at the correct index.", alpinesFromCache.indexOf(alpine2) == 3);
// Read the beerConsumer back from the database.
this.clearCache();
em.clear();
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
//ensure the collection was reordered correctly
assertTrue("database: Incorrect number of alpines in the list", alpinesFromCache.size() == 5);
assertTrue("database: Alpine 1 was not at the correct index.", alpinesFromCache.indexOf(alpine1) == 2);
assertTrue("database: Alpine 2 was not at the correct index.", alpinesFromCache.indexOf(alpine2) == 1);
}
public void test3() {
BeerConsumer beerConsumer = null;
Alpine alpine1 = null, alpine2 = null, alpine3 = null, alpine4 = null;
EntityManager em = createEntityManager();
//beerConsumer = (BeerConsumer)em.createQuery("select b from BeerConsumer b JOIN FETCH b.alpineBeersToConsume where b.id = "+m_beerConsumerId+" order by b.alpineBeersToConsume.bestBeforeDate").getSingleResult();
try {
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
beginTransaction(em);
beerConsumer = em.merge(beerConsumer);
alpine1 = beerConsumer.moveAlpineBeerToConsume(4, 1);
alpine2 = beerConsumer.removeAlpineBeerToConsume(0);
alpine3 = beerConsumer.moveAlpineBeerToConsume(1, 3);
SerialNumber serialNumber = new SerialNumber();
em.persist(serialNumber);
alpine4 = new Alpine(serialNumber);
em.persist(alpine4);
alpine4.setBestBeforeDate(new Date(2005, 8, 29));
alpine4.setAlcoholContent(7.0);
alpine4.setClassification(Alpine.Classification.SWEET);
beerConsumer.addAlpineBeerToConsume(alpine4, 3);
commitTransaction(em);
}catch (RuntimeException ex){
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught while adding the new alpine at a specific index: [" + ex.getMessage() + "]");
}
// Read the beerConsumer back from the shared cache.
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
Vector alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("Incorrect number of alpines in the list", alpinesFromCache.size() == 5);
assertTrue("Alpine 1 was not at the correct index.", alpinesFromCache.indexOf(alpine1) == 0);
assertFalse("Alpine 2 was not removed from the list", alpinesFromCache.contains(alpine2));
assertTrue("Alpine 3 was not at the correct index.", alpinesFromCache.indexOf(alpine3) == 4);
assertTrue("Alpine 4 was not at the correct index.", alpinesFromCache.indexOf(alpine4) == 3);
// Read the beerConsumer back from the shared cache.
em.clear();
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
assertTrue("Shared cache: Incorrect number of alpines in the list", alpinesFromCache.size() == 5);
assertTrue("Shared cache: Alpine 1 was not at the correct index.", alpinesFromCache.indexOf(alpine1) == 0);
assertFalse("Shared cache: Alpine 2 was not removed from the list", alpinesFromCache.contains(alpine2));
assertTrue("Shared cache: Alpine 3 was not at the correct index.", alpinesFromCache.indexOf(alpine3) == 4);
assertTrue("Shared cache: Alpine 4 was not at the correct index.", alpinesFromCache.indexOf(alpine4) == 3);
// Read the beerConsumer back from the database.
this.clearCache();
em.clear();
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
alpinesFromCache = (Vector) beerConsumer.getAlpineBeersToConsume();
//ensure the collection was reordered correctly
assertTrue("database: Incorrect number of alpines in the list", alpinesFromCache.size() == 5);
assertTrue("database: Alpine 1 was not at the correct index.", alpinesFromCache.indexOf(alpine1) == 3);
assertFalse("database: Alpine 2 was not removed from the list", alpinesFromCache.contains(alpine2));
assertTrue("database: Alpine 3 was not at the correct index.", alpinesFromCache.indexOf(alpine3) == 0);
assertTrue("database: Alpine 4 was not at the correct index.", alpinesFromCache.indexOf(alpine4) == 4);
}
}