package org.eclipse.uml2.diagram.clazz.tests.tool;

import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.tools.ConnectionCreationTool;
import org.eclipse.uml2.diagram.clazz.edit.parts.AssociationEditPart;
import org.eclipse.uml2.diagram.clazz.edit.parts.Class2EditPart;
import org.eclipse.uml2.diagram.clazz.part.CreateAssociationLinkTool;
import org.eclipse.uml2.diagram.clazz.part.UMLVisualIDRegistry;
import org.eclipse.uml2.diagram.clazz.providers.UMLElementTypes;
import org.eclipse.uml2.diagram.common.conventions.AssociationEndConvention;
import org.eclipse.uml2.diagram.common.tests.UMLDiagramFacade;
import org.eclipse.uml2.uml.AggregationKind;
import org.eclipse.uml2.uml.Association;

public class AssociationCreationToolTest extends ClassDiagramCreationToolTest {

	IGraphicalEditPart mySourceEP;

	public AssociationCreationToolTest(String name) {
		super(name);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		createNodeByTool(UMLElementTypes.Class_2001);
		mySourceEP = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(Class2EditPart.VISUAL_ID));
		assertNotNull("ClassEditPart was not created.", mySourceEP);
	}

	@Override
	protected void tearDown() throws Exception {
		mySourceEP = null;
		super.tearDown();
	}

	public void testCompositeAssociationCreation() {
		UMLDiagramFacade.flushEventQueue();
		ConnectionCreationTool tool = new CreateAssociationLinkTool.COMPOSITE();
		createConnectionByTool(tool, mySourceEP, mySourceEP);
		ConnectionEditPart associationEP = findConnection(getDiagramEditPart(), AssociationEditPart.VISUAL_ID);
		assertNotNull("AssociationEditPart was not created.", associationEP);

		assertEquals("Association was created with incorrect Aggregation Kind.", AggregationKind.COMPOSITE_LITERAL.getLiteral(), getAggregationLiteral(associationEP));
	}

	public void testNoneAssociationCreation() {
		UMLDiagramFacade.flushEventQueue();
		ConnectionCreationTool tool = new CreateAssociationLinkTool.NONE();
		createConnectionByTool(tool, mySourceEP, mySourceEP);
		ConnectionEditPart associationEP = findConnection(getDiagramEditPart(), AssociationEditPart.VISUAL_ID);
		assertNotNull("AssociationEditPart was not created.", associationEP);

		assertEquals("Association was created with incorrect Aggregation Kind.", AggregationKind.NONE_LITERAL.getLiteral(), getAggregationLiteral(associationEP));
	}

	public void testSharedAssociationCreation() {
		UMLDiagramFacade.flushEventQueue();
		ConnectionCreationTool tool = new CreateAssociationLinkTool.SHARED();
		createConnectionByTool(tool, mySourceEP, mySourceEP);
		ConnectionEditPart associationEP = findConnection(getDiagramEditPart(), AssociationEditPart.VISUAL_ID);
		assertNotNull("AssociationEditPart was not created.", associationEP);

		assertEquals("Association was created with incorrect Aggregation Kind.", AggregationKind.SHARED_LITERAL.getLiteral(), getAggregationLiteral(associationEP));
	}

	public void testCompositeAssociationCreationOnDoubleClick() {
		ConnectionCreationTool tool = new CreateAssociationLinkTool.COMPOSITE();
		createConnectionByToolDoubleClick(tool);
		ConnectionEditPart associationEP = findConnection(getDiagramEditPart(), AssociationEditPart.VISUAL_ID);
		assertNotNull("AssociationEditPart was not created.", associationEP);
		assertEquals("Association was created with incorrect Aggregation Kind.", AggregationKind.COMPOSITE_LITERAL.getLiteral(), getAggregationLiteral(associationEP));
	}

	public void testNoneAssociationCreationOnDoubleClick() {
		ConnectionCreationTool tool = new CreateAssociationLinkTool.NONE();
		createConnectionByToolDoubleClick(tool);
		ConnectionEditPart associationEP = findConnection(getDiagramEditPart(), AssociationEditPart.VISUAL_ID);
		assertNotNull("AssociationEditPart was not created.", associationEP);
		assertEquals("Association was created with incorrect Aggregation Kind.", AggregationKind.NONE_LITERAL.getLiteral(), getAggregationLiteral(associationEP));
	}

	public void testSharedAssociationCreationOnDoubleClick() {
		ConnectionCreationTool tool = new CreateAssociationLinkTool.SHARED();
		createConnectionByToolDoubleClick(tool);
		ConnectionEditPart associationEP = findConnection(getDiagramEditPart(), AssociationEditPart.VISUAL_ID);
		assertNotNull("AssociationEditPart was not created.", associationEP);
		assertEquals("Association was created with incorrect Aggregation Kind.", AggregationKind.SHARED_LITERAL.getLiteral(), getAggregationLiteral(associationEP));
	}

	private String getAggregationLiteral(ConnectionEditPart associationEP) {
		Association association = (Association) associationEP.getNotationView().getElement();
		return AssociationEndConvention.getTargetEnd(association).getAggregation().getLiteral();
	}

}
