blob: 927d4c2019abdcd37e17cb8bd275cb15a398cd1c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Obeo
* 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:
* Mariot Chauvin <mariot.chauvin@obeo.fr> - initial API and implementation
*******************************************************************************/
package org.eclipse.gef.examples.logic.test.unit;
import static org.eclipse.swtbot.eclipse.gef.finder.matchers.IsInstanceOf.instanceOf;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.examples.logic.test.CreateLogicDiagram;
import org.eclipse.gef.examples.logic.test.NewEmptyEmfProject;
import org.eclipse.gef.examples.logicdesigner.edit.CircuitEditPart;
import org.eclipse.gef.examples.logicdesigner.edit.LogicLabelEditPart;
import org.eclipse.gef.examples.logicdesigner.model.Circuit;
import org.eclipse.gef.examples.logicdesigner.model.Wire;
import org.eclipse.swtbot.eclipse.gef.finder.SWTBotGefTestCase;
import org.eclipse.swtbot.eclipse.gef.finder.SWTGefBot;
import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefConnectionEditPart;
import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart;
import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditor;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.results.VoidResult;
import org.eclipse.ui.PlatformUI;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SWTBotJunit4ClassRunner.class)
public class AllTests extends SWTBotGefTestCase implements LogicModeler {
private static final String PROJECT_NAME = "Test";
private static final String FILE_NAME = "test.logic";
private NewEmptyEmfProject emfProject = new NewEmptyEmfProject();
private CreateLogicDiagram logicDiagram = new CreateLogicDiagram();
private SWTBotGefEditor editor;
@BeforeClass
public static void closeWelcomePage() {
try {
new SWTGefBot().viewByTitle("Welcome").close();
} catch (WidgetNotFoundException e) {
// do nothing
}
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
emfProject.createProject(PROJECT_NAME);
logicDiagram.createFile(PROJECT_NAME, FILE_NAME);
editor = bot.gefEditor(FILE_NAME);
}
@Override
@After
public void tearDown() throws Exception {
if (editor != null)
editor.close();
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME);
project.delete(true, null);
super.tearDown();
}
public void saveCurrentEditor() throws Exception {
bot.menu("File").menu("Save").click();
}
@Test
public void activateTool() {
editor.activateTool(TOOL_CIRCUIT);
assertEquals(TOOL_CIRCUIT, getActiveToolLabel());
editor.activateTool(TOOL_CONNECTION);
assertEquals(TOOL_CONNECTION, getActiveToolLabel());
editor.activateTool(TOOL_OR_GATE);
assertEquals(TOOL_OR_GATE, getActiveToolLabel());
editor.activateTool(TOOL_CIRCUIT);
assertEquals(TOOL_CIRCUIT, getActiveToolLabel());
}
private String getActiveToolLabel() {
return editor.getActiveTool().getLabel();
}
@Test
public void doubleClick() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.click(10, 10);
SWTBotGefEditPart circuitEditPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
Circuit circuit = (Circuit) circuitEditPart.part().getModel();
final String nameBeforeDoubleClick = circuit.getName();
editor.select(circuitEditPart).doubleClick(15, 15);
/* we need to wait that double click have been executed */
syncWithUIThread();
final String nameAfterDoubleClick = circuit.getName();
assertFalse("circuit name was not modified by double click", nameBeforeDoubleClick.equals(nameAfterDoubleClick));
}
@Test
public void getEditPartWithLabelOnCanvas() throws Exception {
editor.activateTool(TOOL_LABEL);
editor.click(10, 10);
SWTBotGefEditPart botPart = editor.getEditPart("Label");
assertNotNull(botPart);
assertTrue(botPart.part() instanceof LogicLabelEditPart);
}
@Test
public void getEditPartWithLabelInsideNode() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.click(10, 10);
editor.activateTool(TOOL_LABEL);
editor.click(10 + 3, 10 + 3);
SWTBotGefEditPart botPart = editor.getEditPart("Label");
assertNotNull(botPart);
assertTrue(botPart.part() instanceof LogicLabelEditPart);
}
@Test
public void drag() throws Exception {
editor.activateTool(TOOL_LABEL);
editor.click(10, 10);
editor.drag("Label", 100, 110);
Rectangle bounds = ((GraphicalEditPart) editor.getEditPart("Label").part()).getFigure().getBounds();
assertEquals(100, bounds.x);
assertEquals(110, bounds.y);
}
@Test
public void dragOnResizableElement() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.click(30, 30);
SWTBotGefEditPart circuitEditPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
Rectangle boundsBeforeDrag = getBounds(circuitEditPart);
editor.drag(circuitEditPart, 50, 50);
syncWithUIThread();
checkSize(getBounds(circuitEditPart), boundsBeforeDrag.width, boundsBeforeDrag.height);
}
@Test
public void dragAndDropWithRelativeCoodinatesFigure() throws Exception {
int offset = 30;
int circuitFigureSize = 100;
editor.activateTool(TOOL_CIRCUIT);
editor.click(offset, offset);
editor.activateTool(TOOL_CIRCUIT);
editor.click(circuitFigureSize * 2 + offset, offset);
SWTBotGefEditPart circuitEditPart1 = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
SWTBotGefEditPart circuitEditPart2 = editor.editParts(instanceOf(CircuitEditPart.class)).get(1);
/* create a child of circuitEditPart1 */
editor.activateTool(TOOL_CIRCUIT);
editor.click(circuitFigureSize / 2 + offset, circuitFigureSize / 2 + offset);
SWTBotGefEditPart circuitEditPart1child = circuitEditPart1.children().get(0);
editor.drag(circuitEditPart1child, 5 * (circuitFigureSize / 2) + offset, circuitFigureSize / 2 + offset);
syncWithUIThread();
assertFalse(circuitEditPart2.children().isEmpty());
}
@Test
public void resize() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.click(30, 30);
SWTBotGefEditPart circuitEditPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
Rectangle boundsBeforeResize = getBounds(circuitEditPart);
circuitEditPart.resize(PositionConstants.SOUTH_WEST, 200, 200);
syncWithUIThread();
Rectangle boundsAfterResize = getBounds(circuitEditPart);
checkLocation(boundsAfterResize, boundsBeforeResize.x, boundsBeforeResize.y);
checkSize(boundsAfterResize, 200, 200);
circuitEditPart.resize(PositionConstants.EAST, 150, 200);
syncWithUIThread();
boundsAfterResize = getBounds(circuitEditPart);
checkLocation(boundsAfterResize, boundsBeforeResize.x + 50, boundsBeforeResize.y);
checkSize(boundsAfterResize, 150, 200);
circuitEditPart.resize(PositionConstants.NORTH, 150, 50);
syncWithUIThread();
boundsAfterResize = getBounds(circuitEditPart);
checkLocation(boundsAfterResize, boundsBeforeResize.x + 50, boundsBeforeResize.y + 150);
checkSize(boundsAfterResize, 150, 50);
circuitEditPart.resize(PositionConstants.NORTH_EAST, 175, 75);
syncWithUIThread();
boundsAfterResize = getBounds(circuitEditPart);
checkLocation(boundsAfterResize, boundsBeforeResize.x + 25, boundsBeforeResize.y + 125);
checkSize(boundsAfterResize, 175, 75);
}
@Test
public void createBendpointFromEditor() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.click(10, 10);
editor.activateTool(TOOL_CIRCUIT);
editor.click(120, 10);
editor.activateTool(TOOL_CONNECTION);
editor.drag(100, 20, 130, 20);
editor.click(130, 20);
final SWTBotGefEditPart circuitPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
final SWTBotGefConnectionEditPart wirePart = circuitPart.sourceConnections().get(0);
final Wire wire = (Wire) (wirePart.part()).getModel();
final Connection connection = (Connection) wirePart.part().getFigure();
editor.activateTool("Select");
assertEquals("Select", getActiveToolLabel());
Point startMove = connection.getPoints().getMidpoint().getCopy();
editor.click(startMove.x, startMove.y);
/* we need to wait element selection before proceed or drag will fail */
syncWithUIThread();
assertTrue(editor.selectedEditParts().contains(wirePart));
assertEquals(0, wire.getBendpoints().size());
editor.drag(startMove.x, startMove.y, 130, 250);
/* we need to wait the drag operates */
syncWithUIThread();
assertEquals(1, wire.getBendpoints().size());
/* we do not check the location, as WireBendpoint overrides getLocation to return null */
}
@Test
public void createBendpointFromEditPart() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.click(10, 10);
editor.activateTool(TOOL_CIRCUIT);
editor.click(120, 10);
editor.activateTool(TOOL_CONNECTION);
editor.drag(100, 20, 130, 20);
editor.click(130, 20);
editor.activateTool("Select");
assertEquals("Select", getActiveToolLabel());
final SWTBotGefEditPart circuitPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
final SWTBotGefConnectionEditPart wirePart = circuitPart.sourceConnections().get(0);
final Wire wire = (Wire) wirePart.part().getModel();
assertEquals(0, wire.getBendpoints().size());
wirePart.createBenpoint(130, 250);
/* we need to wait the drag operates */
syncWithUIThread();
assertEquals(1, wire.getBendpoints().size());
}
@Test
public void directEdit() throws Exception {
// TODO
}
/* Deprecated methods */
@Test
public void deprecatedGetEditPartWithLabelOnCanvas() throws Exception {
editor.activateTool(TOOL_LABEL);
editor.mouseMoveLeftClick(10, 10);
SWTBotGefEditPart botPart = editor.getEditPart("Label");
assertNotNull(botPart);
assertTrue(botPart.part() instanceof LogicLabelEditPart);
}
@Test
public void deprecatedGetEditPartWithLabelInsideNode() throws Exception {
editor.activateTool(TOOL_CIRCUIT);
editor.mouseMoveLeftClick(10, 10);
editor.activateTool("Label");
editor.mouseMoveLeftClick(10 + 3, 10 + 3);
SWTBotGefEditPart botPart = editor.getEditPart("Label");
assertNotNull(botPart);
assertTrue(botPart.part() instanceof LogicLabelEditPart);
}
@Test
public void deprecatedDrag() throws Exception {
editor.activateTool(TOOL_LABEL);
editor.mouseMoveLeftClick(10, 10);
editor.mouseDrag("Label", 100, 110);
Rectangle bounds = ((GraphicalEditPart) editor.getEditPart("Label").part()).getFigure().getBounds();
assertEquals(100, bounds.x);
assertEquals(110, bounds.y);
}
private void syncWithUIThread() {
UIThreadRunnable.syncExec(new VoidResult() {
public void run() {
while (PlatformUI.getWorkbench().getDisplay().readAndDispatch()) {
}
}
});
}
private Rectangle getBounds(SWTBotGefEditPart editPart) throws Exception {
return ((GraphicalEditPart) editPart.part()).getFigure().getBounds().getCopy();
}
private void checkLocation(final Rectangle bounds, int x, int y) throws Exception {
assertEquals(x, bounds.x);
assertEquals(y, bounds.y);
}
private void checkSize(final Rectangle bounds, int width, int height) throws Exception {
assertEquals(width, bounds.width);
assertEquals(height, bounds.height);
}
}