/*******************************************************************************
 * Copyright (c) 2005, 2009 SAP. 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:
 *     SAP - initial API and implementation
 ******************************************************************************/

package org.eclipse.persistence.testing.tests.wdf.jpa1.embedded;

import static org.junit.Assert.assertEquals;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Trailer;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Assert;
import org.junit.Test;

public class TestEmbeddedIdAsInnerClass extends JPA1Base {

    @Test
    public void testInsert() {
        final EntityManager em = getEnvironment().getEntityManager();
        try {
            Trailer trailer12 = new Trailer(1, 2, 12);
            Trailer trailer13 = new Trailer(1, 3, 13);
            Trailer trailer23 = new Trailer(2, 3, 23);
            getEnvironment().beginTransaction(em);
            em.persist(trailer12);
            em.persist(trailer13);
            em.persist(trailer23);
            getEnvironment().commitTransactionAndClear(em);

            Query query = em.createQuery("select t from Trailer t");
            assertEquals(query.getResultList().size(), 3);

            query = em.createQuery("select t from Trailer t where t.pk.low = ?1 and t.pk.high = ?2");
            query.setParameter(1, Integer.valueOf(new Trailer.PK(1, 2).getLow()));
            query.setParameter(2, Integer.valueOf(new Trailer.PK(1, 2).getHigh()));
            final Trailer result = (Trailer) query.getSingleResult();
            Assert.assertEquals("wrong load", trailer12.getLoad(), result.getLoad(), 0.0);
        } finally {
            closeEntityManager(em);
        }

    }

}
