/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2010 SAP AG.
 * 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:
 *    Stefan Dimov - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.jpt.jpadiagrameditor.ui.tests.internal;

import java.io.File;
import java.util.NoSuchElementException;

import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.editor.CreateDiagramTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.editor.EditorTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.feature.AddAttributeFeatureTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.feature.AddJPAEntityFeatureTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.feature.AddRelationFeatureTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.feature.DeleteRelationFeatureTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.feature.DirectEditAttributeFeatureTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.feature.LayoutEntityFeatureTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.modelintegration.util.ModelIntegrationUtilTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.preferences.JPAEditorPreferenceInitializerTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.preferences.JPAEditorPreferencesPageTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.provider.JPAEditorToolBehaviorProviderTest;
import org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.util.JPASolverTest;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

/**
 * AllJpaEditorTests
 * 
 * Required Java system properties:
 *    -Dorg.eclipse.jpt.jpa.jar=<jpa.jar path>
 *    -Dorg.eclipse.jpt.eclipselink.jar=<eclipselink.jar path>
 */

@RunWith(Suite.class)
@SuiteClasses( {
//				CreateDiagramTest.class,
				JPAEditorPreferenceInitializerTest.class,
	 			JPAEditorPreferencesPageTest.class,
	 			AddJPAEntityFeatureTest.class,
//				ClickAddFeatureTest.class,
//				CreateDeleteEntity.class,
				DirectEditAttributeFeatureTest.class,
				EditorTest.class,	
				JPAEditorToolBehaviorProviderTest.class,
//				JPAEditorUtilTest.class,
				JPASolverTest.class,
//				OpenMiniatureViewFeatureTest.class,
//				RefactorAttributeTypeFeatureTest.class,
//				SaveEntityFeatureTest.class,
				AddRelationFeatureTest.class,
				AddAttributeFeatureTest.class,
//				CreateDeleteOnlyAttributeTest.class,
//				JPAProjectListenerTest.class,
//				ModelIntegrationTest.class,
				ModelIntegrationUtilTest.class,
				LayoutEntityFeatureTest.class,
				DeleteRelationFeatureTest.class,
//				CreateRelationsTest.class
				})

public class AllJpaEditorTests {
	
	/**
	 * This check is necessary to abort the test suite in the build 
	 * when the environment is not setup properly.
	 * 
	 * @throws NoSuchElementException
	 */
    @BeforeClass
    public static void verifyRequiredJarsExists() throws NoSuchElementException {
    	verifyJpaJarExists();
    	verifyEclipseLinkJarExists();
    }

	private static void verifyJpaJarExists() throws NoSuchElementException {
		verifyRequiredPropertyExists(JPACreateFactory.JPA_JAR_NAME_SYSTEM_PROPERTY);
		verifyRequiredFileExists(JPACreateFactory.JPA_JAR_NAME_SYSTEM_PROPERTY);
	}
	
	private static void verifyEclipseLinkJarExists() throws NoSuchElementException {
		verifyRequiredPropertyExists(JPACreateFactory.ECLIPSELINK_JAR_NAME_SYSTEM_PROPERTY);
		verifyRequiredFileExists(JPACreateFactory.ECLIPSELINK_JAR_NAME_SYSTEM_PROPERTY);
	}
		
	private static void verifyRequiredPropertyExists(String propertyName) throws NoSuchElementException {
		if(JPACreateFactory.getSystemProperty(propertyName) == null) {
			throw new NoSuchElementException(errorMissingProperty(propertyName));
		}
	}

	private static void verifyRequiredFileExists(String propertyName) throws NoSuchElementException {
		String fileName = JPACreateFactory.getSystemProperty(propertyName);
		if( ! (new File(fileName)).exists()) {
			throw new NoSuchElementException(errorJarFileDoesNotExist(fileName));
		}
	}

	private static String errorMissingProperty(String propertyName) {
		return "Missing Java system property: \"" + propertyName + "\"";
	}

	private static String errorJarFileDoesNotExist(String fileName) {
		return "JAR file doesn't exist: \"" + fileName + "\"";
	}

}
