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

import junit.framework.TestCase;
import org.eclipse.jpt.core.internal.IJpaPlatform;
import org.eclipse.jpt.core.internal.IJpaProject;
import org.eclipse.jpt.core.internal.IMappingKeys;
import org.eclipse.jpt.core.internal.content.java.IJavaAttributeMappingProvider;
import org.eclipse.jpt.core.internal.content.java.IJavaTypeMappingProvider;
import org.eclipse.jpt.core.internal.content.java.mappings.JavaBasicProvider;
import org.eclipse.jpt.core.internal.content.java.mappings.JavaEntityProvider;
import org.eclipse.jpt.core.internal.platform.generic.GenericJpaFactory;
import org.eclipse.jpt.core.internal.platform.generic.GenericPlatform;
import org.eclipse.jpt.core.tests.extension.resource.ExtensionTestPlugin;
import org.eclipse.jpt.core.tests.extension.resource.TestAttributeMappingProvider;
import org.eclipse.jpt.core.tests.extension.resource.TestJpaFactory;
import org.eclipse.jpt.core.tests.extension.resource.TestJpaPlatform;
import org.eclipse.jpt.core.tests.extension.resource.TestTypeMappingProvider;
import org.eclipse.jpt.core.tests.internal.ProjectUtility;
import org.eclipse.jpt.core.tests.internal.projects.TestJpaProject;

public class JpaPlatformTests extends TestCase
{
	protected TestJpaProject testProject;

	protected static final String PROJECT_NAME = "ExtensionTestProject";
	protected static final String PACKAGE_NAME = "extension.test";
	
	public static final String TEST_PLUGIN_CLASS = ExtensionTestPlugin.class.getName();
	public static final String TEST_PLUGIN_ID = "org.eclipse.jpt.core.tests.extension.resource";

	public static final String TEST_PLATFORM_ID = TestJpaPlatform.PLATFORM_ID;
	public static final String TEST_PLATFORM_CLASS = TestJpaPlatform.class.getName();
	public static final String TEST_PLATFORM_LABEL = "Test Jpa Platform";
	public static final String TEST_JPA_FACTORY = TestJpaFactory.class.getName();
	public static final String TEST_TYPE_MAPPING_PROVIDER_CLASS = TestTypeMappingProvider.class.getName();
	public static final String TEST_ATTRIBUTE_MAPPING_PROVIDER_CLASS = TestAttributeMappingProvider.class.getName();
	
	public JpaPlatformTests(String name) {
		super(name);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		JpaPlatformExtensionTests.verifyExtensionTestProjectExists();
		ProjectUtility.deleteAllProjects();
		testProject = this.buildJpaProject(TestJpaProject.uniqueProjectName(PROJECT_NAME), false);  // false = no auto-build
	}

	protected TestJpaProject buildJpaProject(String projectName, boolean autoBuild) throws Exception {
		return new TestJpaProject(projectName, autoBuild);  // false = no auto-build
	}

	@Override
	protected void tearDown() throws Exception {
		testProject = null;
		ProjectUtility.deleteAllProjects();
//		testProject.dispose();
		super.tearDown();
	}
	
	protected IJpaProject jpaProject() {
		return this.testProject.getJpaProject();
	}
	
	public void testSetPlatform() {
		assertTrue(jpaPlatform() instanceof GenericPlatform);
		
		jpaProject().setPlatform(TEST_PLATFORM_ID);

		assertTrue(jpaPlatform().getClass().getName().equals(TEST_PLATFORM_CLASS));
	}
	
	public void testGetJpaFactory() {
		assertTrue(jpaPlatform().getJpaFactory() instanceof GenericJpaFactory);
		jpaProject().setPlatform(TEST_PLATFORM_ID);
		
		assertTrue(jpaPlatform().getJpaFactory().getClass().getName().equals(TEST_JPA_FACTORY));
	}
	
	public void testJavaTypeMappingProvider() {
		IJavaTypeMappingProvider provider = jpaProject().getPlatform().javaTypeMappingProvider(IMappingKeys.ENTITY_TYPE_MAPPING_KEY);
		assertTrue(provider instanceof JavaEntityProvider);
		boolean exceptionCaught = false;
		try {
			provider = jpaProject().getPlatform().javaTypeMappingProvider("test");
		}
		catch (IllegalArgumentException e) {
			exceptionCaught = true;
		}
		assertTrue(exceptionCaught);
		
		jpaProject().setPlatform(TEST_PLATFORM_ID);
		
		provider = jpaProject().getPlatform().javaTypeMappingProvider(IMappingKeys.ENTITY_TYPE_MAPPING_KEY);
		assertTrue(provider instanceof JavaEntityProvider);

		provider = jpaProject().getPlatform().javaTypeMappingProvider("test");
		assertTrue(provider.getClass().getName().equals(TEST_TYPE_MAPPING_PROVIDER_CLASS));
	}
	
	public void testJavaAttributeMappingProvider() {
		IJavaAttributeMappingProvider provider = jpaProject().getPlatform().javaAttributeMappingProvider(IMappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
		assertTrue(provider instanceof JavaBasicProvider);
		boolean exceptionCaught = false;
		try {
			provider = jpaProject().getPlatform().javaAttributeMappingProvider("test");
		}
		catch (IllegalArgumentException e) {
			exceptionCaught = true;
		}
		assertTrue(exceptionCaught);
		
		jpaProject().setPlatform(TEST_PLATFORM_ID);
		
		provider = jpaProject().getPlatform().javaAttributeMappingProvider(IMappingKeys.BASIC_ATTRIBUTE_MAPPING_KEY);
		assertTrue(provider instanceof JavaBasicProvider);

		provider = jpaProject().getPlatform().javaAttributeMappingProvider("test");
		assertTrue(provider.getClass().getName().equals(TEST_ATTRIBUTE_MAPPING_PROVIDER_CLASS));
	}
	
	private IJpaPlatform jpaPlatform() {
		return jpaProject().jpaPlatform();
	}
}
