//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.tests.variability;

import java.util.List;

import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.configuration.DefaultElementRealizer;
import org.eclipse.epf.library.configuration.ElementRealizer;
import org.eclipse.epf.library.tests.LibraryTestHelper;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.uma.Artifact;
import org.eclipse.epf.uma.ContentPackage;
import org.eclipse.epf.uma.Domain;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.ecore.util.OppositeFeature;
import org.eclipse.epf.uma.util.AssociationHelper;

/**
 * Test case for incoming 0..1 feature varaibility.
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public class Incoming01FeatureTest extends VariablityBaseTestCase {

	/**
	 * @param name
	 */
	public Incoming01FeatureTest(String name) {
		super(name);
	}

	public void test_workProduct_Domain() {
		MethodPlugin plugin = LibraryTestHelper.createMethodPlugin("plugin 1");
		ContentPackage pkg = LibraryTestHelper.createContentPackage(plugin, "p1");
		Domain d1 = LibraryTestHelper.createDomain(plugin, "d1");
		Domain d2 = LibraryTestHelper.createDomain(plugin, "d2");
		Artifact a1 = LibraryTestHelper.createArtifact(pkg, "a1");
		Artifact a2 = LibraryTestHelper.createArtifact(pkg, "a2");
				
		MethodConfiguration config = LibraryTestHelper.createConfiguration("config 1");
		config.getMethodPluginSelection().add(plugin);
		config.getMethodPackageSelection().add(pkg);
		LibraryUtil.validateMethodConfiguration(config);	
		ElementRealizer realizer = DefaultElementRealizer.newElementRealizer(config);
		
		OppositeFeature ofeature = AssociationHelper.WorkProduct_Domains;
		
		// since 1.2, this is a to-many feature, not to-one
		// case 1
		d1.getWorkProducts().add(a1);
		d2.getWorkProducts().add(a2);
		List items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d1, items.get(0));
		
		items = ConfigurationHelper.calc0nFeatureValue(a2, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d2, items.get(0));
		
		// case 2: 
		LibraryTestHelper.setContributes(d2, d1);
		items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d1, items.get(0));
		
		items = ConfigurationHelper.calc0nFeatureValue(a2, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d1, items.get(0));
		
		// case 3: 
		// if d2 replaces d1, it's outgoing to-many association is repalced, 
		// i.e the end result is d2 -> a2, but a1 does not have a domain
		LibraryTestHelper.setReplaces(d2, d1);
		items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(0, items.size());
		
		items = ConfigurationHelper.calc0nFeatureValue(a2, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d2, items.get(0));
		
		// case 4: 
		LibraryTestHelper.setExtends(d2, d1);
		items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(2, items.size());
		assertEquals(d1, items.get(0));
		assertEquals(d2, items.get(1));
		
		items = ConfigurationHelper.calc0nFeatureValue(a2, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d2, items.get(0));
	}
	
	public void test_workProduct_Domain_with_contributors() {
		MethodPlugin plugin = LibraryTestHelper.createMethodPlugin("plugin 1");
		ContentPackage pkg = LibraryTestHelper.createContentPackage(plugin, "p1");
		Domain d1 = LibraryTestHelper.createDomain(plugin, "d1");
		Domain d2 = LibraryTestHelper.createDomain(plugin, "d2");
		Domain d3 = LibraryTestHelper.createDomain(plugin, "d3");
		Artifact a1 = LibraryTestHelper.createArtifact(pkg, "a1");
		Artifact a2 = LibraryTestHelper.createArtifact(pkg, "a2");
		Artifact a3 = LibraryTestHelper.createArtifact(pkg, "a3");
				
		MethodConfiguration config = LibraryTestHelper.createConfiguration("config 1");
		config.getMethodPluginSelection().add(plugin);
		config.getMethodPackageSelection().add(pkg);
		LibraryUtil.validateMethodConfiguration(config);	
		ElementRealizer realizer = DefaultElementRealizer.newElementRealizer(config);
		
		OppositeFeature ofeature = AssociationHelper.WorkProduct_Domains;
		
		// case 1
		d2.getWorkProducts().add(a2);
		LibraryTestHelper.setContributes(a2, a1);
		List items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(1, items.size());
		assertEquals(d2, items.get(0));
		
		// case 2: 
		d1.getWorkProducts().add(a1);
		d2.getWorkProducts().add(a2);
		LibraryTestHelper.setContributes(a2, a1);
		items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(2, items.size());
		assertTrue(items.contains(d1));
		assertTrue(items.contains(d2));
				
		// case 3: more than contributors, return null
		d1.getWorkProducts().remove(a1);
		d2.getWorkProducts().add(a2);
		d3.getWorkProducts().add(a3);
		LibraryTestHelper.setContributes(a3, a1);
		items = ConfigurationHelper.calc0nFeatureValue(a1, ofeature, realizer);
		assertEquals(2, items.size());
		assertTrue(items.contains(d2));
		assertTrue(items.contains(d3));
	}
	
}
