/*******************************************************************************
 * 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.context.AccessType;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkAccessType;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkPersistenceUnitDefaults;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
import org.eclipse.jpt.jpa.eclipselink.core.tests.internal.context.EclipseLink2_1ContextModelTestCase;

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

	public void testUpdateSpecifiedAccess() throws Exception {
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
		
		//set access in the resource model, verify context model updated
		getXmlEntityMappings().setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.PROPERTY);
		assertEquals(AccessType.PROPERTY, getEntityMappings().getSpecifiedAccess());
		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.PROPERTY, getXmlEntityMappings().getAccess());

		//set access to VIRTUAL in the resource model, verify context model updated
		getXmlEntityMappings().setAccess(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_1.EclipseLinkAccessType.VIRTUAL);
		assertEquals(EclipseLinkAccessType.VIRTUAL, getEntityMappings().getSpecifiedAccess());
		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_1.EclipseLinkAccessType.VIRTUAL, getXmlEntityMappings().getAccess());
		
		//set access to null in the resource model
		getXmlEntityMappings().setAccess(null);
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
	}
	
	public void testModifySpecifiedAccess() throws Exception {
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
		
		//set access in the context model, verify resource model modified
		getEntityMappings().setSpecifiedAccess(AccessType.PROPERTY);
		assertEquals(AccessType.PROPERTY, getEntityMappings().getSpecifiedAccess());
		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.PROPERTY, getXmlEntityMappings().getAccess());

		//set access in the context model, verify resource model modified
		getEntityMappings().setSpecifiedAccess(EclipseLinkAccessType.VIRTUAL);
		assertEquals(EclipseLinkAccessType.VIRTUAL, getEntityMappings().getSpecifiedAccess());
		assertEquals(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_1.EclipseLinkAccessType.VIRTUAL, getXmlEntityMappings().getAccess());
		
		//set access to null in the context model
		getEntityMappings().setSpecifiedAccess(null);
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
	}
	
	public void testUpdateDefaultAccess() throws Exception {
		assertNull(getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
	
		getXmlEntityMappings().setPersistenceUnitMetadata(EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitMetadata());
		org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlPersistenceUnitDefaults persistenceUnitDefaults = EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults();
		getXmlEntityMappings().getPersistenceUnitMetadata().setPersistenceUnitDefaults(persistenceUnitDefaults);
		persistenceUnitDefaults.setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.PROPERTY);
		assertEquals(AccessType.PROPERTY, getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
		
		persistenceUnitDefaults.setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD);
		assertEquals(AccessType.FIELD, getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
		
		persistenceUnitDefaults.setAccess(org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_1.EclipseLinkAccessType.VIRTUAL);
		assertEquals(EclipseLinkAccessType.VIRTUAL, getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
		
		persistenceUnitDefaults.setAccess(null);
		assertNull(getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
	}

	public void testUpdateAccess() throws Exception {
		assertNull(getEntityMappings().getAccess());
		assertNull(getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
	
		getXmlEntityMappings().setAccess(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD);
		assertNull(getEntityMappings().getDefaultAccess());
		assertEquals(AccessType.FIELD, getEntityMappings().getAccess());
		assertEquals(AccessType.FIELD, getEntityMappings().getSpecifiedAccess());
		assertEquals(org.eclipse.jpt.jpa.core.resource.orm.AccessType.FIELD, getXmlEntityMappings().getAccess());
		
		getXmlEntityMappings().setAccess(null);
		assertNull(getEntityMappings().getAccess());
		assertNull(getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());

		getEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setSpecifiedAccess(AccessType.FIELD);
		assertEquals(AccessType.FIELD, getEntityMappings().getDefaultAccess());
		assertEquals(AccessType.FIELD, getEntityMappings().getAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());

		getEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setSpecifiedAccess(EclipseLinkAccessType.VIRTUAL);
		assertEquals(EclipseLinkAccessType.VIRTUAL, getEntityMappings().getDefaultAccess());
		assertEquals(EclipseLinkAccessType.VIRTUAL, getEntityMappings().getAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
		
		getEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults().setSpecifiedAccess(null);
		assertNull(getEntityMappings().getDefaultAccess());
		assertNull(getEntityMappings().getAccess());
		assertNull(getEntityMappings().getSpecifiedAccess());
		assertNull(getXmlEntityMappings().getAccess());
	}	

	public void testUpdateSpecifiedGetMethod() throws Exception {
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getSpecifiedGetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());
		
		//set getMethod in the resource model, verify context model updated
		getXmlEntityMappings().setAccessMethods(EclipseLinkOrmFactory.eINSTANCE.createXmlAccessMethods());
		getXmlEntityMappings().getAccessMethods().setGetMethod("getFoo");
		assertEquals("getFoo", entityMappings.getSpecifiedGetMethod());
		assertEquals("getFoo", getXmlEntityMappings().getAccessMethods().getGetMethod());

		//set getMethod to null in the resource model
		getXmlEntityMappings().getAccessMethods().setGetMethod(null);
		assertNull(entityMappings.getSpecifiedGetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods().getGetMethod());
	}

	public void testModifySpecifiedGetMethod() throws Exception {		
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getSpecifiedGetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());

		//set getMethod in the context model, verify resource model modified
		entityMappings.setSpecifiedGetMethod("getMe");
		assertEquals("getMe", entityMappings.getSpecifiedGetMethod());
		assertEquals("getMe", getXmlEntityMappings().getAccessMethods().getGetMethod());

		//set getMethod to null in the context model
		entityMappings.setSpecifiedGetMethod(null);
		assertNull(entityMappings.getSpecifiedGetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());
	}

	public void testModifySpecifiedGetMethod2() throws Exception {
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getSpecifiedGetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());

		//set getMethod in the context model, verify resource model modified
		entityMappings.setSpecifiedGetMethod("getMe");
		assertEquals("getMe", entityMappings.getGetMethod());
		assertEquals("getMe", getXmlEntityMappings().getAccessMethods().getGetMethod());

		//set another element on the access-methods element so it doesn't get removed
		getXmlEntityMappings().getAccessMethods().setSetMethod("setMe");
		//set getMethod to null in the context model
		entityMappings.setSpecifiedGetMethod(null);
		assertNull(entityMappings.getGetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods().getGetMethod());
	}

	public void testGetDefaultGetMethod() throws Exception {
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getDefaultGetMethod());
		assertNull(entityMappings.getGetMethod());

		getPersistenceUnitDefaults().setSpecifiedGetMethod("getFoo");
		assertEquals("getFoo", entityMappings.getDefaultGetMethod());
		assertEquals("getFoo", entityMappings.getGetMethod());

		entityMappings.setSpecifiedGetMethod("getBar");
		assertEquals("getFoo", entityMappings.getDefaultGetMethod());
		assertEquals("getBar", entityMappings.getGetMethod());

		getPersistenceUnitDefaults().setSpecifiedGetMethod(null);
		assertNull(entityMappings.getDefaultGetMethod());
		assertEquals("getBar", entityMappings.getGetMethod());		
	}

	public void testGetDefaultSetMethod() throws Exception {
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getDefaultSetMethod());
		assertNull(entityMappings.getSetMethod());

		getPersistenceUnitDefaults().setSpecifiedSetMethod("setFoo");
		assertEquals("setFoo", entityMappings.getDefaultSetMethod());
		assertEquals("setFoo", entityMappings.getSetMethod());

		entityMappings.setSpecifiedSetMethod("setBar");
		assertEquals("setFoo", entityMappings.getDefaultSetMethod());
		assertEquals("setBar", entityMappings.getSetMethod());

		getPersistenceUnitDefaults().setSpecifiedSetMethod(null);
		assertNull(entityMappings.getDefaultSetMethod());
		assertEquals("setBar", entityMappings.getSetMethod());		
	}

	public void testUpdateSpecifiedSetMethod() throws Exception {
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getSpecifiedSetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());

		//set setMethod in the resource model, verify context model updated
		getXmlEntityMappings().setAccessMethods(EclipseLinkOrmFactory.eINSTANCE.createXmlAccessMethods());

		getXmlEntityMappings().getAccessMethods().setSetMethod("setFoo");
		assertEquals("setFoo", entityMappings.getSetMethod());
		assertEquals("setFoo", getXmlEntityMappings().getAccessMethods().getSetMethod());

		//set setMethod to null in the resource model
		getXmlEntityMappings().getAccessMethods().setSetMethod(null);
		assertNull(entityMappings.getSetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods().getSetMethod());
	}

	public void testModifySpecifiedSetMethod() throws Exception {		
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getSpecifiedSetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());

		//set setMethod in the context model, verify resource model modified
		entityMappings.setSpecifiedSetMethod("setMe");
		assertEquals("setMe", entityMappings.getSetMethod());
		assertEquals("setMe", getXmlEntityMappings().getAccessMethods().getSetMethod());

		//set setMethod to null in the context model
		entityMappings.setSpecifiedSetMethod(null);
		assertNull(entityMappings.getSetMethod());
		assertNull(getXmlEntityMappings().getPersistenceUnitMetadata());
	}

	public void testModifySpecifiedSetMethod2() throws Exception {
		EclipseLinkEntityMappings entityMappings = getEntityMappings();
		assertNull(entityMappings.getSpecifiedSetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods());

		//set setMethod in the context model, verify resource model modified
		entityMappings.setSpecifiedSetMethod("setMe");
		assertEquals("setMe", entityMappings.getSetMethod());
		assertEquals("setMe", getXmlEntityMappings().getAccessMethods().getSetMethod());

		//set another element on the access-methods element so it doesn't get removed
		getXmlEntityMappings().getAccessMethods().setGetMethod("getMe");
		//set getMethod to null in the context model
		entityMappings.setSpecifiedSetMethod(null);
		assertNull(entityMappings.getSetMethod());
		assertNull(getXmlEntityMappings().getAccessMethods().getSetMethod());
	}

	protected EclipseLinkPersistenceUnitDefaults getPersistenceUnitDefaults() {
		return (EclipseLinkPersistenceUnitDefaults) getEntityMappings().getPersistenceUnitMetadata().getPersistenceUnitDefaults();
	}
}