/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.test.mappingsmodel;

import java.util.Collection;
import java.util.Iterator;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.persistence.tools.workbench.mappingsmodel.ProblemConstants;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWDescriptor;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWInterfaceDescriptor;
import org.eclipse.persistence.tools.workbench.mappingsmodel.project.MWProject;
import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProject;
import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProjectDefaultsPolicy;
import org.eclipse.persistence.tools.workbench.test.models.projects.CrimeSceneProject;
import org.eclipse.persistence.tools.workbench.test.models.projects.SimpleContactProject;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;

public class MWProjectTests extends ModelProblemsTestCase {
	
	public static Test suite() {
		return new TestSuite(MWProjectTests.class);
	}
	
	public MWProjectTests(String name) {
		super(name);
	}
	
	private MWDescriptor getDescriptorWithShortName(MWProject project, String name) {
		for (Iterator stream = project.descriptors(); stream.hasNext(); ) {
			MWDescriptor descriptor = (MWDescriptor) stream.next();
			if (descriptor.getMWClass().shortName().equals(name)) {
				return descriptor;
			}
		}
		throw new IllegalArgumentException(name);
	}
		
	public void testGetAllDescriptors() {
		MWRelationalProject project = new CrimeSceneProject().getProject();
		Collection descs = CollectionTools.collection(project.descriptors());
		assertTrue("Expected 10 descriptors. " + descs.size() + " returned.", descs.size() == 10);
		assertTrue("CrimeScene descriptor missing.", descs.contains(getDescriptorWithShortName(project, "CrimeScene")));
		assertTrue("Address descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Address")));
		assertTrue("Detective descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Detective")));
		assertTrue("Fingerprint descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Fingerprint")));
		assertTrue("Firearm descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Firearm")));
		assertTrue("Person descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Person")));
		assertTrue("PieceOfEvidence descriptor missing.", descs.contains(getDescriptorWithShortName(project, "PieceOfEvidence")));
		assertTrue("Suspect descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Suspect")));
		assertTrue("Victim descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Victim")));
		assertTrue("Weapon descriptor missing.", descs.contains(getDescriptorWithShortName(project, "Weapon")));
	}
	
	public void testDescriptorsThatImplement() {
		MWRelationalProject contactProject = new SimpleContactProject().getProject();
		MWInterfaceDescriptor interfaceDescriptor = (MWInterfaceDescriptor) contactProject.descriptorNamed("org.eclipse.persistence.tools.workbench.test.models.contact.Contact");
		Collection descriptors = CollectionTools.collection(contactProject.descriptorsThatImplement(interfaceDescriptor));
		
		assertTrue("2 descriptors should implement the Contact descriptor", descriptors.size() == 2);
	}
	
	public void testCacheAllStatementsAndBindAllParametersProblem() {
		String problem = ProblemConstants.PROJECT_CACHES_QUERY_STATEMENTS_WITHOUT_BINDING_PARAMETERS;
		
		MWRelationalProject project = new CrimeSceneProject().getProject();
		
		assertTrue("The project should not have the problem: " + problem, !hasProblem(problem, project));
		
		((MWRelationalProjectDefaultsPolicy)project.getDefaultsPolicy()).setQueriesCacheAllStatements(true);
		((MWRelationalProjectDefaultsPolicy)project.getDefaultsPolicy()).setQueriesBindAllParameters(false);
		
		assertTrue("The project should have the problem: " + problem, hasProblem(problem, project.getDefaultsPolicy()));
	}
	
	public void testIsSequenceCounterFieldSpecifiedProblem() {
		String problem = ProblemConstants.PROJECT_NO_SEQUENCE_COUNTER_FIELD_SPECIFIED;
		
		MWRelationalProject project = new CrimeSceneProject().getProject();
		
		assertTrue("The project should not have the problem: " + problem, !hasProblem(problem, project.getDefaultsPolicy()));
		
		project.getSequencingPolicy().setCounterColumn(null);
		
		assertTrue("The project should have the problem: " + problem, hasProblem(problem, project));
	}
	
	public void testIsSequenceNameFieldSpecifiedProblem() {
		String problem = ProblemConstants.PROJECT_NO_SEQUENCE_NAME_FIELD_SPECIFIED;
		
		MWRelationalProject project = new CrimeSceneProject().getProject();
		
		assertTrue("The project should not have the problem: " + problem, !hasProblem(problem, project));
		
		project.getSequencingPolicy().setNameColumn(null);
		
		assertTrue("The project should have the problem: " + problem, hasProblem(problem, project));
	}
}
