/*******************************************************************************
 * Copyright (c) 2011-2012 Oracle. 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: dclarke - Bug 361016: Future Versions Examples
 ******************************************************************************/
package tests;

import static example.PersonModelExample.T1;

import javax.persistence.EntityManager;

import model.Person;

import org.junit.After;
import org.junit.Assert;
import org.junit.Test;

import temporal.EditionWrapperHelper;
import temporal.TemporalEntityManager;
import example.PersonModelExample;

/**
 * Tests to verify delete use cases. In this temporal usage delete is equivalent
 * to setting the end date to a point in time in the future. Then any queries
 * after that time result in no edition being returned.
 * 
 * @author dclarke
 * @since EclipseLink 2.3.1
 */
public class DeleteTests extends BaseTestCase {

    private static PersonModelExample examples = new PersonModelExample();

    @Test
    public void deleteCurrentSimple() {
        TemporalEntityManager em = getEntityManager();
        em.getTransaction().begin();
        em.persist(examples.simplePerson);
        em.getTransaction().commit();
        closeEntityManager();
        
        em = getEntityManager();
            
        Assert.assertEquals(1,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
        Person p = em.createQuery("SELECT p FROM Person p", Person.class).getSingleResult();
        
        Assert.assertNotNull(p);
        
        em.getTransaction().begin();
        em.remove(p);
        em.getTransaction().commit();
        
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
    }

    @Test
    public void deleteCurrentSimpleAtT1() {
        TemporalEntityManager em = getEntityManager();
        em.getTransaction().begin();
        em.persist(examples.simplePerson);
        em.getTransaction().commit();
        closeEntityManager();
        
        em = getEntityManager();
            
        Assert.assertEquals(1,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
        Person p = em.createQuery("SELECT p FROM Person p", Person.class).getSingleResult();
        
        Assert.assertNotNull(p);
        
        em.getTransaction().begin();

        Person pWrapper = EditionWrapperHelper.wrap(em, p);
        pWrapper.getEffectivity().setEnd(T1);
        
        em.getTransaction().commit();
        
        Assert.assertEquals(1,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());

        em.setEffectiveTime( T1);
        
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Person p", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(a) FROM Address a", Number.class).getSingleResult().intValue());
        Assert.assertEquals(0,  em.createQuery("SELECT COUNT(p) FROM Phone p", Number.class).getSingleResult().intValue());
    }

    @After
    public void deleteAll() {
        EntityManager em = TemporalEntityManager.getInstance(getEMF().createEntityManager());
        em.getTransaction().begin();
        em.createQuery("DELETE FROM PersonHobby ph").executeUpdate();
        em.createQuery("DELETE FROM Hobby h").executeUpdate();
        em.createNativeQuery("DELETE FROM TADDRESS").executeUpdate();
        em.createNativeQuery("DELETE FROM TPERSON_NNAMES").executeUpdate();
        em.createNativeQuery("UPDATE TPERSON SET CID = NULL").executeUpdate();
        em.createNativeQuery("DELETE FROM TPERSON").executeUpdate();
        em.createNativeQuery("DELETE FROM TPHONE").executeUpdate();
        em.getTransaction().commit();
        em.close();
    }
}
