/* * Copyright (c) 2007, 2009 Borland Software Corporation * * 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: * Sergey Gribovsky (Borland) - initial API and implementation */ package org.eclipse.uml2.diagram.statemachine.tests.tools; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditDomain; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool; import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.notation.Node; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.widgets.Event; import org.eclipse.uml2.diagram.common.tests.UMLDiagramFacade; import org.eclipse.uml2.diagram.statemachine.edit.parts.ChoicePseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.CompositeStateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.DeepHistoryPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.EntryPointPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.ExitPointPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.FinalStateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.ForkPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.InitialPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.JoinPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.JunctionPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.ShallowHistoryPseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.SimpleStateEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.StateMachineEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.StateMachine_RegionEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.StateMachine_RegionSubverticesEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.State_RegionEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.State_RegionSubverticesEditPart; import org.eclipse.uml2.diagram.statemachine.edit.parts.TerminatePseudostateEditPart; import org.eclipse.uml2.diagram.statemachine.part.UMLVisualIDRegistry; import org.eclipse.uml2.diagram.statemachine.providers.UMLElementTypes; import org.eclipse.uml2.diagram.statemachine.tests.StateMachineDiagramTestCase; import org.eclipse.uml2.uml.Pseudostate; import org.eclipse.uml2.uml.PseudostateKind; import org.eclipse.uml2.uml.State; public class CreationToolTest extends StateMachineDiagramTestCase { public CreationToolTest() { super("Testing element creation by tools"); //$NON-NLS-1$ } public void test_rootEditPart() { assertNotNull("Root edit part is NULL.", getDiagramEditPart()); //$NON-NLS-1$ } public void test_stateMachineCreation() { createNodeByTool(UMLElementTypes.StateMachine_2005); IGraphicalEditPart statemachineEditPart = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachineEditPart.VISUAL_ID)); assertNotNull("StateMachine edit part was not found.", statemachineEditPart); //$NON-NLS-1$ IGraphicalEditPart regionEditPart = statemachineEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionEditPart.VISUAL_ID)); assertNotNull("Region was not created.", regionEditPart); //$NON-NLS-1$ } public void test_regionCreation() throws Exception { createNodeByTool(UMLElementTypes.StateMachine_2005, 10, 10); IGraphicalEditPart stateMachineEditPart = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachineEditPart.VISUAL_ID)); assertNotNull("StateMachine edit part was not found.", stateMachineEditPart); //$NON-NLS-1$ UMLDiagramFacade.flushEventQueue(); Rectangle stateMachineBounds = stateMachineEditPart.getFigure().getBounds(); createNodeByTool(UMLElementTypes.Region_3013, stateMachineBounds.x + 10, stateMachineBounds.y + 10); List children = stateMachineEditPart.getChildren(); int counter = 0; for (Iterator childrenIterator = children.iterator(); childrenIterator.hasNext();) { IGraphicalEditPart childEditPart = (IGraphicalEditPart) childrenIterator.next(); if (childEditPart instanceof StateMachine_RegionEditPart) { counter++; } } assertEquals("Only one region is found", 2, counter); //$NON-NLS-1$ } public void test_entryExitPointCreation() { createNodeByTool(UMLElementTypes.StateMachine_2005, 10, 10); IGraphicalEditPart stateMachineEditPart = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachineEditPart.VISUAL_ID)); assertNotNull("StateMachine edit part was not found.", stateMachineEditPart); //$NON-NLS-1$ UMLDiagramFacade.flushEventQueue(); Rectangle stateMachineBounds = stateMachineEditPart.getFigure().getBounds(); createNodeByTool(UMLElementTypes.Pseudostate_3014, stateMachineBounds.x + 10, stateMachineBounds.y + 10); createNodeByTool(UMLElementTypes.Pseudostate_3015, stateMachineBounds.x + 10, stateMachineBounds.y + 10); IGraphicalEditPart entryPointEditPart = stateMachineEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(EntryPointPseudostateEditPart.VISUAL_ID)); assertNotNull("Entry point was not created.", entryPointEditPart); //$NON-NLS-1$ assertEquals("Created entry point had incorrect kind.", //$NON-NLS-1$ PseudostateKind.ENTRY_POINT_LITERAL, ((Pseudostate) ((Node) entryPointEditPart.getModel()).getElement()).getKind()); IGraphicalEditPart exitPointEditPart = stateMachineEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(ExitPointPseudostateEditPart.VISUAL_ID)); assertNotNull("Entry point was not created.", exitPointEditPart); //$NON-NLS-1$ assertEquals("Created exit point had incorrect kind.", //$NON-NLS-1$ PseudostateKind.EXIT_POINT_LITERAL, ((Pseudostate) ((Node) exitPointEditPart.getModel()).getElement()).getKind()); } public void test_stateCreation() { createNodeByTool(UMLElementTypes.StateMachine_2005, 10, 10); IGraphicalEditPart stateMachineEditPart = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachineEditPart.VISUAL_ID)); assertNotNull("StateMachine edit part was not found.", stateMachineEditPart); //$NON-NLS-1$ IGraphicalEditPart regionEditPart = stateMachineEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionEditPart.VISUAL_ID)); assertNotNull("Region edit part was not found.", regionEditPart); //$NON-NLS-1$ IGraphicalEditPart subverticesEditPart = regionEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionSubverticesEditPart.VISUAL_ID)); assertNotNull("Region subvertices edit part was not found.", subverticesEditPart); //$NON-NLS-1$ UMLDiagramFacade.flushEventQueue(); Rectangle subverticesBounds = subverticesEditPart.getFigure().getBounds(); createNodeByTool(UMLElementTypes.State_3001, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart simpleStateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(SimpleStateEditPart.VISUAL_ID)); assertNotNull("Simple state was not created.", simpleStateEditPart); //$NON-NLS-1$ createNodeByTool(UMLElementTypes.State_3012, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart compositeStateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(CompositeStateEditPart.VISUAL_ID)); assertNotNull("Composite state was not created.", compositeStateEditPart); //$NON-NLS-1$ assertEquals("Created composite state didn't contain a region.", //$NON-NLS-1$ 1, ((State) ((Node) compositeStateEditPart.getModel()).getElement()).getRegions().size()); createNodeByTool(UMLElementTypes.FinalState_3003, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart finalStateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(FinalStateEditPart.VISUAL_ID)); assertNotNull("Final state was not created.", finalStateEditPart); //$NON-NLS-1$ } public void test_pseudostateCreation() { createNodeByTool(UMLElementTypes.StateMachine_2005, 10, 10); IGraphicalEditPart statemachineEditPart = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachineEditPart.VISUAL_ID)); assertNotNull("StateMachine edit part was not found.", statemachineEditPart); //$NON-NLS-1$ IGraphicalEditPart regionEditPart = statemachineEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionEditPart.VISUAL_ID)); assertNotNull("Region edit part was not found.", regionEditPart); //$NON-NLS-1$ IGraphicalEditPart subverticesEditPart = regionEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionSubverticesEditPart.VISUAL_ID)); assertNotNull("Region subvertices edit part was not found.", subverticesEditPart); //$NON-NLS-1$ UMLDiagramFacade.flushEventQueue(); Rectangle subverticesBounds = subverticesEditPart.getFigure().getBounds(); createNodeByTool(UMLElementTypes.Pseudostate_3004, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart initialPseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(InitialPseudostateEditPart.VISUAL_ID)); assertNotNull("Initial pseudostate was not created.", initialPseudostateEditPart); //$NON-NLS-1$ assertEquals("Created pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.INITIAL_LITERAL, ((Pseudostate) ((Node) initialPseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3005, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart shallowHistoryPseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(ShallowHistoryPseudostateEditPart.VISUAL_ID)); assertNotNull("Shallow history pseudostate was not created.", shallowHistoryPseudostateEditPart); //$NON-NLS-1$ assertEquals("Created pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.SHALLOW_HISTORY_LITERAL, ((Pseudostate) ((Node) shallowHistoryPseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3006, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart deepHistoryPseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(DeepHistoryPseudostateEditPart.VISUAL_ID)); assertNotNull("Deep history pseudostate was not created.", deepHistoryPseudostateEditPart); //$NON-NLS-1$ assertEquals("Created pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.DEEP_HISTORY_LITERAL, ((Pseudostate) ((Node) deepHistoryPseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3007, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart forkPseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(ForkPseudostateEditPart.VISUAL_ID)); assertNotNull("Fork pseudostate was not created.", forkPseudostateEditPart); //$NON-NLS-1$ assertEquals("Created pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.FORK_LITERAL, ((Pseudostate) ((Node) forkPseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3008, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart joinPseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(JoinPseudostateEditPart.VISUAL_ID)); assertNotNull("Join pseudostate was not created.", joinPseudostateEditPart); //$NON-NLS-1$ assertEquals("Created pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.JOIN_LITERAL, ((Pseudostate) ((Node) joinPseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3009, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart junctionPseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(JunctionPseudostateEditPart.VISUAL_ID)); assertNotNull("Junction pseudostate was not created.", junctionPseudostateEditPart); //$NON-NLS-1$ assertEquals("Created pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.JUNCTION_LITERAL, ((Pseudostate) ((Node) junctionPseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3010, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart choicePseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(ChoicePseudostateEditPart.VISUAL_ID)); assertNotNull("Junction pseudostate was not created.", choicePseudostateEditPart); //$NON-NLS-1$ assertEquals("Choice pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.CHOICE_LITERAL, ((Pseudostate) ((Node) choicePseudostateEditPart.getModel()).getElement()).getKind()); createNodeByTool(UMLElementTypes.Pseudostate_3011, subverticesBounds.x + 10, subverticesBounds.y + 10); IGraphicalEditPart terminatePseudostateEditPart = subverticesEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(TerminatePseudostateEditPart.VISUAL_ID)); assertNotNull("Terminate pseudostate was not created.", terminatePseudostateEditPart); //$NON-NLS-1$ assertEquals("Choice pseudostate had incorrect kind.", //$NON-NLS-1$ PseudostateKind.TERMINATE_LITERAL, ((Pseudostate) ((Node) terminatePseudostateEditPart.getModel()).getElement()).getKind()); } public void test_transitionCreation() { createNodeByTool(UMLElementTypes.StateMachine_2005, 10, 10); IGraphicalEditPart statemachineEditPart = getDiagramEditPart().getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachineEditPart.VISUAL_ID)); assertNotNull("StateMachine edit part was not found.", statemachineEditPart); //$NON-NLS-1$ IGraphicalEditPart regionEditPart = statemachineEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionEditPart.VISUAL_ID)); assertNotNull("Region edit part was not found.", regionEditPart); //$NON-NLS-1$ IGraphicalEditPart subverticesEditPart = regionEditPart.getChildBySemanticHint(UMLVisualIDRegistry.getType(StateMachine_RegionSubverticesEditPart.VISUAL_ID)); assertNotNull("Region subvertices edit part was not found.", subverticesEditPart); //$NON-NLS-1$ UMLDiagramFacade.flushEventQueue(); Rectangle subverticesBounds = subverticesEditPart.getFigure().getBounds(); createNodeByTool(UMLElementTypes.State_3001, subverticesBounds.x + 10, subverticesBounds.y + 10); createNodeByTool(UMLElementTypes.State_3001, subverticesBounds.x + 10, subverticesBounds.y + 10); getDiagramEditPart().getViewer().setSelection(new StructuredSelection(subverticesEditPart.getChildren())); createConnectionByTool(UMLElementTypes.Transition_4001); assertEquals("Transition wasn't created.", 1, getDiagramEditPart().getConnections().size()); //$NON-NLS-1$ } private void createConnectionByTool(IElementType elementType) { UnspecifiedTypeConnectionTool tool = new UnspecifiedTypeConnectionTool(Collections.singletonList(elementType)); tool.setEditDomain((EditDomain) getDiagramWorkbenchPart().getDiagramEditDomain()); tool.activate(); tool.mouseDoubleClick(createMouseEvent(0, 0), getDiagramEditPart().getViewer()); tool.deactivate(); } private void createNodeByTool(IElementType elementType) { createNodeByTool(elementType, 70, 70); } private void createNodeByTool(IElementType elementType, int x, int y) { UnspecifiedTypeCreationTool tool = new UnspecifiedTypeCreationTool(Collections.singletonList(elementType)); tool.setEditDomain((EditDomain) getDiagramWorkbenchPart().getDiagramEditDomain()); tool.activate(); tool.mouseMove(createMouseEvent(x, y), getDiagramEditPart().getViewer()); tool.mouseDown(createMouseEvent(x, y), getDiagramEditPart().getViewer()); tool.mouseUp(createMouseEvent(x, y), getDiagramEditPart().getViewer()); tool.deactivate(); } private MouseEvent createMouseEvent(int x, int y) { Event e = new Event(); e.widget = getDiagramEditPart().getViewer().getControl(); e.display = e.widget.getDisplay(); e.button = 1; // left button e.x = x; e.y = y; return new MouseEvent(e); } }