/**
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.apache.openjpa.enhance;

import org.apache.openjpa.persistence.test.SingleEMTestCase;

public class TestUnenhancedCompoundPKSubclass extends SingleEMTestCase {

    public void setUp() {
        setUp(UnenhancedCompoundPKFieldAccessSuperclass.class,
            UnenhancedCompoundPKFieldAccessSubclass.class, CLEAR_TABLES);
    }

    public void testCompoundPKFieldAccessUserDefined() {
        UnenhancedCompoundPKFieldAccessSuperclass un =
            new UnenhancedCompoundPKFieldAccessSubclass(17, 31);
        UnenhancedCompoundPKFieldAccessSuperclass.PK oid =
            new UnenhancedCompoundPKFieldAccessSuperclass.PK(17, 31);
        compoundPKHelper(un, oid, true);
    }

    public void testCompoundPKFieldAccessOpenJPADefined() {
        UnenhancedCompoundPKFieldAccessSuperclass un =
            new UnenhancedCompoundPKFieldAccessSubclass(17, 31);
        UnenhancedCompoundPKFieldAccessSuperclass.PK oid =
            new UnenhancedCompoundPKFieldAccessSuperclass.PK(17, 31);
        compoundPKHelper(un, oid, false);
    }

    private void compoundPKHelper(Object o, Object oid, boolean userDefined) {
        em.getTransaction().begin();
        em.persist(o);
        em.getTransaction().commit();

        if (!userDefined) {
            em.close();
            em = emf.createEntityManager();
        }

        em.find(o.getClass(), oid);
    }
}
