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

import org.eclipse.jpt.eclipselink.core.internal.context.persistence.PersistenceUnitProperties;
import org.eclipse.jpt.eclipselink.core.internal.context.persistence.general.GeneralProperties;
import org.eclipse.jpt.eclipselink.core.tests.internal.context.persistence.PersistenceUnitTestCase;
import org.eclipse.jpt.utility.model.listener.PropertyChangeListener;

/**
 *  GeneralAdapterTests
 */
@SuppressWarnings("nls")
public class GeneralPropertiesAdapterTests extends PersistenceUnitTestCase
{
	private GeneralProperties generalProperties;

	public static final String EXCLUDE_ECLIPSELINK_ORM_KEY = GeneralProperties.ECLIPSELINK_EXCLUDE_ECLIPSELINK_ORM;
	public static final Boolean EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE = false;
	public static final Boolean EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE_2 = ! EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE;

	
	public GeneralPropertiesAdapterTests(String name) {
		super(name);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.generalProperties = this.subject.getGeneralProperties();
		PropertyChangeListener propertyChangeListener = this.buildPropertyChangeListener();
		
		this.generalProperties.addPropertyChangeListener(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY, propertyChangeListener);

		this.clearEvent();
	}

	/**
	 * Initializes directly the PU properties before testing.
	 */
	@Override
	protected void populatePu() {
		this.modelPropertiesSizeOriginal = 1;
		this.propertiesTotal = this.modelPropertiesSizeOriginal + 2; // misc properties
		this.modelPropertiesSize = this.modelPropertiesSizeOriginal;
		
		this.persistenceUnitSetProperty("misc.property.1", "value.1");
		this.persistenceUnitSetProperty(EXCLUDE_ECLIPSELINK_ORM_KEY, EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE.toString());
		this.persistenceUnitSetProperty("misc.property.2", "value.2");

		return;
	}

	
	// ********** ExcludeEclipselinkOrm tests **********
	public void testSetExcludeEclipselinkOrm() throws Exception {
		this.verifyModelInitialized(
			EXCLUDE_ECLIPSELINK_ORM_KEY,
			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE);
		this.verifySetProperty(
			EXCLUDE_ECLIPSELINK_ORM_KEY,
			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE,
			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE_2);
	}

	public void testAddRemoveExcludeEclipselinkOrm() throws Exception {
		this.verifyAddRemoveProperty(
			EXCLUDE_ECLIPSELINK_ORM_KEY,
			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE,
			EXCLUDE_ECLIPSELINK_ORM_TEST_VALUE_2);
	}



	// ********** get/set property **********
	@Override
	protected Object getProperty(String propertyName) throws NoSuchFieldException {
		Object modelValue = null;
		if (propertyName.equals(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY))
			modelValue = this.generalProperties.getExcludeEclipselinkOrm();
		else
			this.throwMissingDefinition("getProperty", propertyName);
		return modelValue;
	}

	@Override
	protected void setProperty(String propertyName, Object newValue) throws Exception {
		if (propertyName.equals(GeneralProperties.EXCLUDE_ECLIPSELINK_ORM_PROPERTY))
			this.generalProperties.setExcludeEclipselinkOrm((Boolean) newValue);
		else
			this.throwMissingDefinition("setProperty", propertyName);
	}
	
	@Override
	protected PersistenceUnitProperties getModel() {
		return this.generalProperties;
	}
}
