/*******************************************************************************
 * 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.mapping;

import java.util.Collection;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.persistence.tools.workbench.mappingsmodel.ProblemConstants;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.MWMapContainerPolicy;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWCollectionMapping;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWOneToManyMapping;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWRelationalDirectCollectionMapping;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWMethod;
import org.eclipse.persistence.tools.workbench.test.mappingsmodel.ModelProblemsTestCase;
import org.eclipse.persistence.tools.workbench.test.models.crimescene.Victim;
import org.eclipse.persistence.tools.workbench.test.models.projects.CrimeSceneProject;

public class MWCollectionMappingTests extends ModelProblemsTestCase {

	public static Test suite() {
		return new TestSuite(MWCollectionMappingTests.class);
	}
	
	public MWCollectionMappingTests(String name) {
		super(name);
	}
	
	public void testMWCollectionMapping() {
		CrimeSceneProject crimeSceneProject = new CrimeSceneProject();
		MWOneToManyMapping original = crimeSceneProject.getEvidenceMappingInCrimeScene();
	
		assertCommonAttributesEqual(original, original.asMWManyToManyMapping());
		assertCommonAttributesEqual(original, original.asMWOneToManyMapping());
		assertCommonAttributesEqual(original, (MWRelationalDirectCollectionMapping) original.asMWDirectCollectionMapping());
	}
	
	public void testContainerClassNotNullProblem() {
		String problem = ProblemConstants.MAPPING_CONTAINER_CLASS_NOT_SPECIFIED;
		
		CrimeSceneProject csp = new CrimeSceneProject();
		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
		
		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
		
		mapping.getContainerPolicy().getDefaultingContainerClass().setContainerClass(null);
		
		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
	}
	
	public void testContainerClassIsInstantiableProblem() {
		String problem = ProblemConstants.MAPPING_CONTAINER_CLASS_NOT_INSTANTIABLE;
		
		CrimeSceneProject csp = new CrimeSceneProject();
		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
		
		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
		
		mapping.getContainerPolicy().getDefaultingContainerClass().setContainerClass(csp.getProject().typeFor(Collection.class));
		
		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
	}
	
	// Until we can reliably verify what a user's class extends or implements,
	// this test has been temporarily removed.
//	public void testContainerClassAgreesWithContainerTypeProblem() {
//		String problem = ProblemConstants.MAPPING_CONTAINER_CLASS_NOT_COLLECTION;
//		
//		CrimeSceneProject csp = new CrimeSceneProject();
//		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
//		mapping.setCollectionContainerPolicy();
//		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
//		
//		mapping.getContainerPolicy().setContainerClass(csp.getProject().typeFor(Person.class));
//		
//		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
//		
//		problem = ProblemConstants.MAPPING_CONTAINER_CLASS_NOT_MAP;
//		
//		mapping.getContainerPolicy().setContainerClass(csp.getProject().typeFor(HashMap.class));
//		mapping.setMapContainerPolicy();
//		
//		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
//		
//		mapping.getContainerPolicy().setContainerClass(csp.getProject().typeFor(Person.class));
//		
//		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
//	}
	
	// Until we can reliably verify what a user's class extends or implements,
	// this test has been temporarily removed.
//	public void testContainerClassAgreesWithAttributeProblem() {
//		String problem = ProblemConstants.MAPPING_CONTAINER_CLASS_DISAGREES_WITH_ATTRIBUTE;
//		
//		CrimeSceneProject csp = new CrimeSceneProject();
//		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
//		MWMapping timeMapping = csp.getCrimeSceneDescriptor().mappingNamed("time");
//		
//		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
//		
//		mapping.setInstanceVariable(timeMapping.getInstanceVariable());
//		
//		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
//	}
	
	// Until we can reliably verify what a user's class extends or implements,
	// this test has been temporarily removed.
//	public void testContainerClassIsValidForTransparentIndirectionProblem() {
//		String problem = ProblemConstants.MAPPING_CONTAINER_CLASS_INVALID_FOR_TRANSPARENT_INDIRECTION;
//		
//		CrimeSceneProject csp = new CrimeSceneProject();
//		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
//		
//		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
//		
//		mapping.getContainerPolicy().setContainerClass(csp.getProject().typeFor(Person.class));
//		mapping.setUseTransparentIndirection();
//		
//		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
//	}
	
	public void testKeyMethodNotNullProblem() {
		String problem = ProblemConstants.MAPPING_KEY_METHOD_NOT_SPECIFIED;
		
		CrimeSceneProject csp = new CrimeSceneProject();
		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
		
		assertTrue("The mapping should not have problem: " + problem, !hasProblem(problem, mapping));
		
		mapping.setMapContainerPolicy();
		
		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
	}
	
	public void testKeyMethodIsLegitimateProblem() {
		String problem = ProblemConstants.MAPPING_KEY_METHOD_NOT_VALID;
		
		CrimeSceneProject csp = new CrimeSceneProject();
		MWCollectionMapping mapping = csp.getEvidenceMappingInCrimeScene();
		
		assertFalse("The mapping should not have problem: " + problem, hasProblem(problem, mapping));
		
		MWMapContainerPolicy containerPolicy = mapping.setMapContainerPolicy();
		containerPolicy.setKeyMethod((MWMethod) csp.getProject().typeFor(Victim.class).methods().next());
		
		assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping));
	}

}
