/*******************************************************************************
 * Copyright (c) 2006, 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.model;

import junit.framework.TestCase;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jpt.core.internal.IJpaModel;
import org.eclipse.jpt.core.internal.IJpaProject;
import org.eclipse.jpt.core.internal.JptCorePlugin;
import org.eclipse.jpt.core.tests.internal.ProjectUtility;
import org.eclipse.jpt.core.tests.internal.projects.TestFacetedProject;
import org.eclipse.jpt.utility.internal.ClassTools;
import org.eclipse.jpt.utility.internal.CollectionTools;

public class ModelInitializationTests extends TestCase {
	private IJpaModel jpaModel;
	
	
	public ModelInitializationTests(String name) {
		super(name);
	}
	
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		ProjectUtility.deleteAllProjects();
		this.jpaModel = JptCorePlugin.getJpaModel();
	}
	
	@Override
	protected void tearDown() throws Exception {
		ProjectUtility.deleteAllProjects();
		this.jpaModel = null;
		super.tearDown();
	}

	/** 
	 * Builds a project with the java and utility facets installed, and with
	 * pre-existing entities added.
	 */
	private TestFacetedProject buildTestProject() throws CoreException {
		TestFacetedProject testProject = new TestFacetedProject(ClassTools.shortClassNameForObject(this), true);
		testProject.installFacet("jst.java", "5.0");
		testProject.installFacet("jst.utility", "1.0");
		testProject.createFile(
			new Path("src/test.pkg/TestEntity.java"),
			"package test.pkg; @Entity public class TestEntity {}");
		testProject.createFile(
			new Path("src/test.pkg/TestEntity2.java"),
			"package test.pkg; @Entity public class TestEntity2 {}");
		return testProject;
	}	
		
	public void testBasic() {
		assertNotNull(this.jpaModel);
	}
	
	public void testFacetInstallation() throws CoreException {
		TestFacetedProject testProject = buildTestProject();
		assertNull(this.jpaModel.getJpaProject(testProject.getProject()));
		testProject.installFacet("jpt.jpa", "1.0");
		assertEquals(1, CollectionTools.size(this.jpaModel.jpaProjects()));
		IJpaProject jpaProject = this.jpaModel.getJpaProject(testProject.getProject());
		assertNotNull(jpaProject);
		assertEquals(4, CollectionTools.size(jpaProject.jpaFiles()));
		assertNotNull(jpaProject.getJpaFile(testProject.getProject().getFile(new Path("src/test.pkg/TestEntity.java"))));
		assertNotNull(jpaProject.getJpaFile(testProject.getProject().getFile(new Path("src/test.pkg/TestEntity2.java"))));
	}
	
	public void testProjectOpening() throws CoreException {
		TestFacetedProject testProject = buildTestProject();
		testProject.installFacet("jpt.jpa", "1.0");
		testProject.close();
		assertTrue(! testProject.getProject().isOpen());
		testProject.open();
		IJpaProject jpaProject = this.jpaModel.getJpaProject(testProject.getProject());
		assertNotNull(jpaProject);
		assertNotNull(jpaProject.getJpaFile(testProject.getProject().getFile(new Path("src/test.pkg/TestEntity.java"))));
		assertNotNull(jpaProject.getJpaFile(testProject.getProject().getFile(new Path("src/test.pkg/TestEntity2.java"))));
	}
	
}
