/*******************************************************************************
 * 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.editionsets;

import static example.PersonModelExample.T2;
import static example.PersonModelExample.T6;
import junit.framework.Assert;
import model.Person;

import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.mappings.OneToManyMapping;
import org.eclipse.persistence.mappings.VariableOneToOneMapping;
import org.eclipse.persistence.sessions.server.Server;
import org.junit.Test;

import temporal.EditionSet;
import temporal.TemporalEntityManager;
import temporal.TemporalHelper;
import tests.BaseTestCase;
import example.PersonModelExample;

/**
 * Tests verifying the {@link EditionSet} capabilities.
 * 
 * @author dclarke
 * @since EclipseLink 2.3.1
 */
public class EditionSetConfigTests extends BaseTestCase {

    private static PersonModelExample example = new PersonModelExample();

    private Person getSample() {
        return example.fullPerson;
    }

    @Test
    public void verifyEditionSetMapping() {
        TemporalEntityManager em = getEntityManager();

        ClassDescriptor desc = em.unwrap(Server.class).getClassDescriptorForAlias("EditionSet");
        Assert.assertNotNull(desc);

        OneToManyMapping otmMapping = (OneToManyMapping) desc.getMappingForAttributeName("entries");
        Assert.assertNotNull(otmMapping);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Test
    public void verifyEditionSetEntryMapping() {
        TemporalEntityManager em = getEntityManager();

        ClassDescriptor desc = em.unwrap(Server.class).getClassDescriptorForAlias("EditionSetEntry");
        Assert.assertNotNull(desc);

        VariableOneToOneMapping votoMapping = (VariableOneToOneMapping) desc.getMappingForAttributeName("temporal");
        Assert.assertNotNull(votoMapping);

        Assert.assertEquals(8, votoMapping.getTypeIndicatorTranslation().size());

        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("Person"));
        Assert.assertTrue(TemporalHelper.isEditionClass((Class) votoMapping.getTypeIndicatorTranslation().get("Person")));

        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("Phone"));
        Assert.assertTrue(TemporalHelper.isEditionClass((Class) votoMapping.getTypeIndicatorTranslation().get("Phone")));

        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("Address"));
        Assert.assertTrue(TemporalHelper.isEditionClass((Class) votoMapping.getTypeIndicatorTranslation().get("Address")));

        Assert.assertTrue(votoMapping.getTypeIndicatorTranslation().containsKey("PersonHobby"));
        Assert.assertTrue(TemporalHelper.isTemporal((Class) votoMapping.getTypeIndicatorTranslation().get("PersonHobby"), false));
    }

    @Test
    public void verifySetEffectiveInitialize() {
        TemporalEntityManager em = getEntityManager();

        em.setEffectiveTime(T6);
        EditionSet es = em.getEditionSet();

        Assert.assertNotNull(es);
        Assert.assertEquals(T6, es.getEffective());
    }

    @Test
    public void verifyEditionSetPerEffective() {
        TemporalEntityManager em = getEntityManager();

        em.setEffectiveTime(T2);
        EditionSet esT2 = em.getEditionSet();
        Assert.assertNotNull(esT2);
        Assert.assertEquals(T2, esT2.getEffective());

        em.setEffectiveTime(T6);
        EditionSet esT6 = em.getEditionSet();
        Assert.assertNotNull(esT6);
        Assert.assertEquals(T6, esT6.getEffective());
        
        Assert.assertNotSame(esT2, esT6);
    }

    @Test
    public void verifyNotInitialized() {
        TemporalEntityManager em = getEntityManager();
        Assert.assertFalse(em.hasEditionSet());

        em.setEffectiveTime(T6);

        Assert.assertFalse(em.hasEditionSet());
    }

    /**
     * Populate initial sample entity
     */
    @Override
    public void populate(TemporalEntityManager em) {
        System.out.println("\nEditionSetTests.populate:START");
        example.populateHobbies(em);
        em.persist(getSample());
        System.out.println("\nEditionSetTests.populate::DONE");
    }

}
