/*******************************************************************************
 * Copyright (c) 2012 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.orm;

import org.eclipse.jpt.jpa.core.MappingKeys;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkOrmTypeMapping;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkOrmPersistentType;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeMapping;
import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLink2_1ContextModelTestCase;

@SuppressWarnings("nls")
public class EclipseLink2_1OrmEntityTests
	extends EclipseLink2_1ContextModelTestCase
{
	public EclipseLink2_1OrmEntityTests(String name) {
		super(name);
	}

	public void testUpdateSpecifiedParentClass() throws Exception {
		EclipseLinkOrmPersistentType persistentType = (EclipseLinkOrmPersistentType) getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Employee");
		EclipseLinkOrmTypeMapping ormTypeMapping = persistentType.getMapping();
		XmlTypeMapping xmlTypeMapping = (XmlTypeMapping) ormTypeMapping.getXmlTypeMapping();
		assertNull(ormTypeMapping.getSpecifiedParentClass());
		assertNull(xmlTypeMapping.getParentClass());

		//set parentClass in the resource model, verify context model updated
		xmlTypeMapping.setParentClass("model.Parent");
		assertEquals("model.Parent", ormTypeMapping.getSpecifiedParentClass());
		assertEquals("model.Parent", xmlTypeMapping.getParentClass());
		
		//set parentClass to null in the resource model
		xmlTypeMapping.setParentClass(null);
		assertNull(ormTypeMapping.getSpecifiedParentClass());
		assertNull(xmlTypeMapping.getParentClass());
	}

	public void testModifySpecifiedParentClass() throws Exception {		
		EclipseLinkOrmPersistentType persistentType = (EclipseLinkOrmPersistentType) getEntityMappings().addPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Employee");
		EclipseLinkOrmTypeMapping ormTypeMapping = persistentType.getMapping();
		XmlTypeMapping xmlTypeMapping = (XmlTypeMapping) ormTypeMapping.getXmlTypeMapping();
		assertNull(ormTypeMapping.getSpecifiedParentClass());
		assertNull(xmlTypeMapping.getParentClass());
		
		//set parentClass in the context model, verify resource model modified
		ormTypeMapping.setSpecifiedParentClass("model.Parent");
		assertEquals("model.Parent", ormTypeMapping.getSpecifiedParentClass());
		assertEquals("model.Parent", xmlTypeMapping.getParentClass());
		
		//set parentClass to null in the context model
		ormTypeMapping.setSpecifiedParentClass(null);
		assertNull(ormTypeMapping.getSpecifiedParentClass());
		assertNull(xmlTypeMapping.getParentClass());
	}
}