package org.eclipse.uml2.diagram.clazz.tests.action;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.uml2.diagram.clazz.action.ChangeDependencyType;
import org.eclipse.uml2.diagram.clazz.edit.parts.Class2EditPart;
import org.eclipse.uml2.diagram.clazz.edit.parts.DataType2EditPart;
import org.eclipse.uml2.diagram.clazz.edit.parts.Dependency2EditPart;
import org.eclipse.uml2.diagram.clazz.edit.parts.DependencyName3EditPart;
import org.eclipse.uml2.diagram.clazz.part.CreateDependencyLinkTool;
import org.eclipse.uml2.diagram.clazz.part.UMLVisualIDRegistry;
import org.eclipse.uml2.diagram.clazz.providers.UMLElementTypes;
import org.eclipse.uml2.diagram.clazz.tests.tool.ClassDiagramCreationToolTest;
import org.eclipse.uml2.diagram.common.part.CreateLinkToolBase;
import org.eclipse.uml2.diagram.common.tests.UMLDiagramFacade;
import org.eclipse.uml2.uml.UMLPackage;
public class ChangeDependencyTypeTest extends ClassDiagramCreationToolTest {
private IGraphicalEditPart mySourceEP;
private IGraphicalEditPart myTargetEP;
private ConnectionEditPart myDependencyEP;
public ChangeDependencyTypeTest(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
protected void setUp() throws Exception {
super.setUp();
DiagramEditPart diagram = getDiagramEditPart();
createNodeByTool(UMLElementTypes.Class_2001, 10, 10);
mySourceEP = diagram.getChildBySemanticHint(UMLVisualIDRegistry.getType(Class2EditPart.VISUAL_ID));
assertNotNull("ClassEditPart was not created.", mySourceEP);
createNodeByTool(UMLElementTypes.DataType_2004, 100, 100);
myTargetEP = diagram.getChildBySemanticHint(UMLVisualIDRegistry.getType(DataType2EditPart.VISUAL_ID));
assertNotNull("DataTypeEditPart was not created.", myTargetEP);
UMLDiagramFacade.flushEventQueue();
CreateLinkToolBase tool = oursCreationToolList.get(myIndex1);
createConnectionByTool(tool, mySourceEP, myTargetEP);
myDependencyEP = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull("DependencyLink should be created.", myDependencyEP);
UMLDiagramFacade.flushEventQueue();
}
private void runChangeDependencyTypeAction(EClass type) {
assertFalse("Selection should not be empty to run action correctly.", getDiagramEditPart().getViewer().getSelection().isEmpty());
DiagramAction action = new ChangeDependencyType(getWorkbenchPage(), type, "testID");
action.init();
assertTrue("Action should be enabled in correct cases: DependencyType: " + oursDependencyTypes.get(myIndex1).getName() + ", Actiontype: " + oursDependencyTypes.get(myIndex1).getName(), action
.isEnabled());
action.run();
}
public void testChangeDependencyTypeActionEnablement1() {
EClass type = oursDependencyTypes.get(myIndex1);
DiagramAction action = new ChangeDependencyType(getWorkbenchPage(), type, "testID");
action.init();
assertFalse("Action should be disabled for action with same type as current type: " + type.getName() + " .", action.isEnabled());
}
public void testChangeDependencyTypeActionEnablement2() {
EClass type = oursDependencyTypes.get(myIndex2);
DiagramAction action = new ChangeDependencyType(getWorkbenchPage(), type, "testID");
action.init();
assertTrue("DependencyType: " + oursDependencyTypes.get(myIndex1).getName() + ", Actiontype: " + oursDependencyTypes.get(myIndex1).getName(), action.isEnabled());
}
public void testDependency2EditPartExistenceAfterTypeChange() {
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
}
public void testDependencySourceAfterTypeChange1() {
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
assertEquals("Source EditPart should be changed after DependencyType change", mySourceEP, dependency.getSource());
}
public void testDependencyTargetAfterTypeChange1() {
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
assertEquals("Connection Target EditPart should be changed after DependencyType change", myTargetEP, dependency.getTarget());
}
public void testDependencyType() {
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
assertEquals(type, dependency.getNotationView().getElement().eClass());
}
public void testDependencyEditPartSource() {
Point point = myDependencyEP.getConnectionFigure().getPoints().getFirstPoint().getCopy();
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
UMLDiagramFacade.flushEventQueue();
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
assertEquals(point, dependency.getConnectionFigure().getPoints().getFirstPoint());
}
public void testDependencyEditPartTarget() {
Point point = myDependencyEP.getConnectionFigure().getPoints().getLastPoint().getCopy();
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
UMLDiagramFacade.flushEventQueue();
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
assertEquals(point, dependency.getConnectionFigure().getPoints().getLastPoint());
}
public void testDependencyEditPartLabel() {
EClass type = oursDependencyTypes.get(myIndex2);
runChangeDependencyTypeAction(type);
UMLDiagramFacade.flushEventQueue();
ConnectionEditPart dependency = findConnection(getDiagramEditPart(), Dependency2EditPart.VISUAL_ID);
assertNotNull(dependency);
DependencyName3EditPart label = (DependencyName3EditPart) dependency.getChildBySemanticHint(UMLVisualIDRegistry.getType(DependencyName3EditPart.VISUAL_ID));
assertNotNull(label);
String editText = label.getEditText();
assertEquals(editText, type.getName().toLowerCase());
}
private static List<CreateLinkToolBase> oursCreationToolList = new ArrayList<CreateLinkToolBase>(4);
private static List<EClass> oursDependencyTypes = new ArrayList<EClass>(4);
private static int myIndex1 = new Random(System.currentTimeMillis()).nextInt(4);
private static int myIndex2 = initIndex2();
static {
oursCreationToolList.add(new CreateDependencyLinkTool.DEPENDENCY());
oursCreationToolList.add(new CreateDependencyLinkTool.ABSTRACTION());
oursCreationToolList.add(new CreateDependencyLinkTool.SUBSTITUTION());
oursCreationToolList.add(new CreateDependencyLinkTool.USAGE());
oursDependencyTypes.add(UMLPackage.eINSTANCE.getDependency());
oursDependencyTypes.add(UMLPackage.eINSTANCE.getAbstraction());
oursDependencyTypes.add(UMLPackage.eINSTANCE.getSubstitution());
oursDependencyTypes.add(UMLPackage.eINSTANCE.getUsage());
}
private static int initIndex2() {
Random random = new Random(System.currentTimeMillis());
int index2 = random.nextInt(4);
while (myIndex1 == index2) {
index2 = random.nextInt(4);
}
return index2;
}
}