/*******************************************************************************
 * Copyright (c) 2007, 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.core.tests.internal.context.persistence;

import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistence;
import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistenceUnit;
import org.eclipse.jpt.jpa.core.tests.internal.context.ContextModelTestCase;

@SuppressWarnings("nls")
public class PersistenceTests extends ContextModelTestCase
{
	public PersistenceTests(String name) {
		super(name);
	}
	
	protected Persistence persistence() {
		return getRootContextNode().getPersistenceXml().getPersistence();
	}
	
	public void testUpdateAddPersistenceUnit() throws Exception {
		XmlPersistence xmlPersistence = getXmlPersistence();
		Persistence persistence = getRootContextNode().getPersistenceXml().getPersistence();
		
		// clear xml persistence units, test that it's clear in context
		xmlPersistence.getPersistenceUnits().clear();
		
		assertEquals(0, persistence.getPersistenceUnitsSize());
		
		// add xml persistence unit, test that it's added to context
		XmlPersistenceUnit xmlPersistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
		xmlPersistenceUnit.setName("test");
		xmlPersistence.getPersistenceUnits().add(xmlPersistenceUnit);
		
		assertEquals(1, persistence.getPersistenceUnitsSize());
		
		// add another, test that it *isn't* add to context
		xmlPersistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
		xmlPersistenceUnit.setName("test2");
		xmlPersistence.getPersistenceUnits().add(xmlPersistenceUnit);
		
		assertEquals(1, persistence.getPersistenceUnitsSize());
	}
	
	public void testModifyAddPersistencUnit() {
		XmlPersistence xmlPersistence = getXmlPersistence();
		Persistence persistence = persistence();
		
		// clear xml persistence units, test that it's clear in context
		xmlPersistence.getPersistenceUnits().clear();
		assertEquals(0, persistence.getPersistenceUnitsSize());
		
		// add persistence unit, test that it's added to resource
		persistence.addPersistenceUnit();
		
		assertEquals(1, persistence.getPersistenceUnitsSize());
		
		// add another, test that we get an exception
		boolean exception = false;
		try {
			persistence.addPersistenceUnit();
		}
		catch (IndexOutOfBoundsException e) {
			exception = true;
		}
		
		assertTrue(exception);
	}
	
	public void testUpdateRemovePersistenceUnit() throws Exception {
		XmlPersistence xmlPersistence = getXmlPersistence();
		Persistence persistence = getRootContextNode().getPersistenceXml().getPersistence();
		
		// add a persistence unit and test that there are two existing xml and 
		// one context persistence unit
		XmlPersistenceUnit xmlPersistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
		xmlPersistenceUnit.setName("test");
		xmlPersistence.getPersistenceUnits().add(xmlPersistenceUnit);
		
		assertEquals(2, xmlPersistence.getPersistenceUnits().size());
		assertEquals(1, persistence.getPersistenceUnitsSize());
		
		// remove persistence unit from xml, test that context remains unchanged
		xmlPersistenceUnit = xmlPersistence.getPersistenceUnits().get(0);
		xmlPersistence.getPersistenceUnits().remove(xmlPersistenceUnit);
		
		assertEquals(1, xmlPersistence.getPersistenceUnits().size());
		assertEquals(1, persistence.getPersistenceUnitsSize());
		
		// remove another one from xml, text that it's now removed from context
		xmlPersistenceUnit = xmlPersistence.getPersistenceUnits().get(0);
		xmlPersistence.getPersistenceUnits().remove(xmlPersistenceUnit);
		
		assertEquals(0, xmlPersistence.getPersistenceUnits().size());
		assertEquals(0, persistence.getPersistenceUnitsSize());
	}
	
	public void testModifyRemovePersistenceUnit() {
		XmlPersistence xmlPersistence = getXmlPersistence();
		Persistence persistence = persistence();
		
		// add a persistence unit and test that there are two existing xml and 
		// one context persistence unit
		XmlPersistenceUnit xmlPersistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
		xmlPersistenceUnit.setName("test");
		xmlPersistence.getPersistenceUnits().add(xmlPersistenceUnit);
		
		assertEquals(2, xmlPersistence.getPersistenceUnits().size());
		assertEquals(1, persistence.getPersistenceUnitsSize());
		
		// remove persistence unit, test that it's removed from resource and that
		// a *new* persistence unit representing the previously unrepresented one
		// is present
		persistence.removePersistenceUnit(0);
		
		assertEquals(1, xmlPersistence.getPersistenceUnits().size());
		assertEquals(1, persistence.getPersistenceUnitsSize());
		
		// remove new persistence unit, test that it's removed from resource and 
		// context
		persistence.removePersistenceUnit(0);
		
		assertEquals(0, xmlPersistence.getPersistenceUnits().size());
		assertEquals(0, persistence.getPersistenceUnitsSize());
	}
}
