/* * Copyright (c) 2005, 2010 Borland Software 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: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.gen; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gmf.codegen.gmfgen.DefaultSizeAttributes; import org.eclipse.gmf.codegen.gmfgen.FigureViewmap; import org.eclipse.gmf.codegen.gmfgen.InnerClassViewmap; import org.eclipse.gmf.codegen.gmfgen.ParentAssignedViewmap; import org.eclipse.gmf.codegen.gmfgen.ResizeConstraints; import org.eclipse.gmf.codegen.gmfgen.StyleAttributes; import org.eclipse.gmf.codegen.gmfgen.Viewmap; import org.eclipse.gmf.codegen.gmfgen.ViewmapLayoutType; import org.eclipse.gmf.gmfgraph.BasicFont; import org.eclipse.gmf.gmfgraph.BorderRef; import org.eclipse.gmf.gmfgraph.ChildAccess; import org.eclipse.gmf.gmfgraph.Color; import org.eclipse.gmf.gmfgraph.ColorConstants; import org.eclipse.gmf.gmfgraph.Compartment; import org.eclipse.gmf.gmfgraph.CompoundBorder; import org.eclipse.gmf.gmfgraph.Connection; import org.eclipse.gmf.gmfgraph.ConnectionFigure; import org.eclipse.gmf.gmfgraph.ConstantColor; import org.eclipse.gmf.gmfgraph.CustomBorder; import org.eclipse.gmf.gmfgraph.CustomConnection; import org.eclipse.gmf.gmfgraph.CustomFigure; import org.eclipse.gmf.gmfgraph.CustomLayout; import org.eclipse.gmf.gmfgraph.DefaultSizeFacet; import org.eclipse.gmf.gmfgraph.DiagramLabel; import org.eclipse.gmf.gmfgraph.Dimension; import org.eclipse.gmf.gmfgraph.Direction; import org.eclipse.gmf.gmfgraph.Ellipse; import org.eclipse.gmf.gmfgraph.Figure; import org.eclipse.gmf.gmfgraph.FigureAccessor; import org.eclipse.gmf.gmfgraph.FigureDescriptor; import org.eclipse.gmf.gmfgraph.FigureGallery; import org.eclipse.gmf.gmfgraph.FigureRef; import org.eclipse.gmf.gmfgraph.FlowLayout; import org.eclipse.gmf.gmfgraph.FontStyle; import org.eclipse.gmf.gmfgraph.GMFGraphFactory; import org.eclipse.gmf.gmfgraph.Label; import org.eclipse.gmf.gmfgraph.Layout; import org.eclipse.gmf.gmfgraph.LayoutRef; import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.gmfgraph.RealFigure; import org.eclipse.gmf.gmfgraph.Rectangle; import org.eclipse.gmf.gmfgraph.RoundedRectangle; import org.eclipse.gmf.internal.bridge.genmodel.InnerClassViewmapProducer; import org.eclipse.gmf.internal.bridge.genmodel.ViewmapProducer; import org.eclipse.gmf.tests.setup.DiaDefSetup; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.TypeDeclaration; /** * @author artem * */ public class ViewmapProducersTest extends TestCase { private ViewmapProducer myProducer; private final GMFGraphFactory eFact = GMFGraphFactory.eINSTANCE; public ViewmapProducersTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); myProducer = new InnerClassViewmapProducer(); } public void testInnerViewmapProducerBareFigure() { final Ellipse ellipseFig = eFact.createEllipse(); ellipseFig.setName("elli"); Node n = createNode("n1", ellipseFig); Viewmap v = getProducer().create(n); assertNotNull(v); assertTrue(v.getClass().getName(), v instanceof FigureViewmap); assertEquals("org.eclipse.draw2d.Ellipse", ((FigureViewmap) v).getFigureQualifiedClassName()); } public void testAbleToProcessFigureAccessor() { final CustomFigure nodeFigure = eFact.createCustomFigure(); Node n = createNode("n1", nodeFigure); nodeFigure.setName("ScrollPane"); nodeFigure.setQualifiedClassName("org.eclipse.draw2d.ScrollPane"); final FigureAccessor figureAccess1 = eFact.createFigureAccessor(); nodeFigure.getCustomChildren().add(figureAccess1); figureAccess1.setAccessor("getContents"); // XXX this is to create ChildAccess, but there should be means to point to FigureAccess // without typedFigure final CustomFigure accessor1Type = eFact.createCustomFigure(); accessor1Type.setName("Accessor1Type"); accessor1Type.setQualifiedClassName("org.eclipse.draw2d.Figure"); figureAccess1.setTypedFigure(accessor1Type); final CustomFigure accessor2Type = eFact.createCustomFigure(); accessor2Type.setQualifiedClassName("org.eclipse.draw2d.Viewport"); final FigureAccessor figureAccess2 = eFact.createFigureAccessor(); figureAccess2.setAccessor("getViewport"); figureAccess2.setTypedFigure(accessor2Type); nodeFigure.getCustomChildren().add(figureAccess2); final DiagramLabel l1 = eFact.createDiagramLabel(); l1.setName("L1"); l1.setFigure(n.getFigure()); l1.setAccessor(DiaDefSetup.newAccess(n.getFigure(), figureAccess1.getTypedFigure())); final DiagramLabel l2 = eFact.createDiagramLabel(); l2.setName("L2"); l2.setFigure(n.getFigure()); l2.setAccessor(DiaDefSetup.newAccess(n.getFigure(), figureAccess2.getTypedFigure())); final Viewmap nodeViewmap = getProducer().create(n); final Viewmap label1Viewmap = getProducer().create(l1); final Viewmap label2Viewmap = getProducer().create(l2); assertNotNull(nodeViewmap); assertNotNull(label1Viewmap); assertNotNull(label2Viewmap); // don't care about kind of nodeViewmap, should be insignificant assertTrue(label1Viewmap.getClass().getName(), label1Viewmap instanceof ParentAssignedViewmap); assertTrue(label2Viewmap.getClass().getName(), label2Viewmap instanceof ParentAssignedViewmap); assertEquals(figureAccess1.getAccessor(), ((ParentAssignedViewmap) label1Viewmap).getGetterName()); // XXX If we decide to make FigureAccessor#typedFigure optional some day, we might want to // assertNull instead of assertNotNull //assertNull(((ParentAssignedViewmap) label1Viewmap).getFigureQualifiedClassName()); assertNotNull(((ParentAssignedViewmap) label1Viewmap).getFigureQualifiedClassName()); assertNull(((ParentAssignedViewmap) label1Viewmap).getSetterName()); assertEquals(figureAccess2.getAccessor(), ((ParentAssignedViewmap) label2Viewmap).getGetterName()); assertNotNull(((ParentAssignedViewmap) label2Viewmap).getFigureQualifiedClassName()); assertEquals(((CustomFigure) figureAccess2.getTypedFigure()).getQualifiedClassName(), ((ParentAssignedViewmap) label2Viewmap).getFigureQualifiedClassName()); assertNull(((ParentAssignedViewmap) label2Viewmap).getSetterName()); } /** * check that viewmap producer correctly processes labels inside nodes * and produces {@link ParentAssignedViewmap} to handle their placement correctly */ public void testRecognizesParentAssignedCases() { final RoundedRectangle rootRect = eFact.createRoundedRectangle(); final Node n = createNode("n1", rootRect); rootRect.setName("RouRe"); final Label lf = eFact.createLabel(); lf.setName("Lf"); rootRect.getChildren().add(lf); final DiagramLabel innerLabel = eFact.createDiagramLabel(); innerLabel.setName("DL1"); innerLabel.setFigure(n.getFigure()); innerLabel.setAccessor(DiaDefSetup.newAccess(n.getFigure(), lf)); final Label topLevelLabelFigure = eFact.createLabel(); topLevelLabelFigure.setName("topLevelLabelFigure"); final DiagramLabel externalLabel = eFact.createDiagramLabel(); externalLabel.setName("DL2"); externalLabel.setFigure(DiaDefSetup.newDescriptor(topLevelLabelFigure)); final ViewmapProducer p = getProducer(); p.create(n); Viewmap innerLabelViewmap = p.create(innerLabel); Viewmap externalLabelViewmap = p.create(externalLabel); assertNotNull(innerLabelViewmap); assertTrue(innerLabelViewmap.getClass().getName(), innerLabelViewmap instanceof ParentAssignedViewmap); ParentAssignedViewmap pav = (ParentAssignedViewmap) innerLabelViewmap; assertEquals(innerLabel.getAccessor().getAccessor(), pav.getGetterName()); assertNotNull(pav.getFigureQualifiedClassName()); assertEquals("org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel", pav.getFigureQualifiedClassName()); assertNotNull(externalLabelViewmap); assertFalse(externalLabelViewmap instanceof ParentAssignedViewmap); } public void testFindAncestorGallery(){ Figure external = eFact.createRectangle(); assertNull(InnerClassViewmapProducer.findAncestorFigureGallery(external)); FigureGallery figureGallery = eFact.createFigureGallery(); figureGallery.setName("Any"); RealFigure normal = eFact.createRectangle(); normal.setName("Normal"); figureGallery.getFigures().add(normal); RealFigure deep = eFact.createRectangle(); deep.setName("Deep"); normal.getChildren().add(deep); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(normal)); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(deep)); deep.setBorder(eFact.createLineBorder()); deep.setLayout(eFact.createFlowLayout()); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(deep.getBorder())); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(deep.getLayout())); FigureDescriptor fd = eFact.createFigureDescriptor(); fd.setActualFigure(normal); figureGallery.getDescriptors().add(fd); assertFalse("sanity check", figureGallery.getFigures().contains(normal)); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(deep)); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(deep.getLayout())); assertSame(figureGallery, InnerClassViewmapProducer.findAncestorFigureGallery(deep.getBorder())); } public void testFindAllGalleriesForImport() { FigureGallery g1 = eFact.createFigureGallery(); g1.setName("G1 - borders"); FigureGallery g2 = eFact.createFigureGallery(); g2.setName("G2 - layouts"); FigureGallery g3 = eFact.createFigureGallery(); g3.setName("G3 - figures"); CustomBorder b1 = eFact.createCustomBorder(); g1.getBorders().add(b1); CompoundBorder b2 = eFact.createCompoundBorder(); BorderRef br = eFact.createBorderRef(); br.setActual(b1); b2.setOuter(br); g1.getBorders().add(b2); Rectangle r1 = eFact.createRectangle(); Rectangle r2 = eFact.createRectangle(); g3.getFigures().add(r2); FigureDescriptor fd1 = eFact.createFigureDescriptor(); // FD which owns figure directly fd1.setActualFigure(r1); FigureDescriptor fd2 = eFact.createFigureDescriptor(); // one that references figure FigureRef fr = eFact.createFigureRef(); fr.setFigure(r2); fd2.setActualFigure(fr); g3.getDescriptors().add(fd1); g3.getDescriptors().add(fd2); Rectangle r1c = eFact.createRectangle(); Rectangle r2c = eFact.createRectangle(); r1.getChildren().add(r1c); r2.getChildren().add(r2c); // br = eFact.createBorderRef(); br.setActual(b2); r1c.setBorder(br); br = eFact.createBorderRef(); br.setActual(b1); r2c.setBorder(br); Iterator<FigureGallery> r; // sanity Rectangle r4 = eFact.createRectangle(); g3.getFigures().add(r4); r4.setBorder(eFact.createLineBorder()); r = InnerClassViewmapProducer.findAllGalleriesForImport(r4).iterator(); assertTrue(r.hasNext() && r.next() == g3 && !r.hasNext()); // r = InnerClassViewmapProducer.findAllGalleriesForImport(fd1.getActualFigure()).iterator(); assertTrue(r.hasNext() && r.next() == g3 && r.hasNext() && r.next() == g1 && !r.hasNext()); r = InnerClassViewmapProducer.findAllGalleriesForImport(fd2.getActualFigure()).iterator(); assertTrue(r.hasNext() && r.next() == g3 && r.hasNext() && r.next() == g1 && !r.hasNext()); g2.getLayouts().add(eFact.createCustomLayout()); LayoutRef lref = eFact.createLayoutRef(); lref.setActual(g2.getLayouts().get(0)); r1c.setLayout(lref); r1c.setBorder(null); r = InnerClassViewmapProducer.findAllGalleriesForImport(fd1.getActualFigure()).iterator(); assertTrue(r.hasNext() && r.next() == g3 && r.hasNext() && r.next() == g2 && !r.hasNext()); // both layout and border present r2c.setLayout(lref); r = InnerClassViewmapProducer.findAllGalleriesForImport(fd2.getActualFigure()).iterator(); assertTrue(r.hasNext() && r.next() == g3 && r.hasNext() && r.next() == g2 && r.hasNext() && r.next() == g1 && !r.hasNext()); } public void testViewmapRequiredPluginIDs() { final String BUNDLE = "com.mycompany.figures"; final String BUNDLE2 = "com.thirparty.figures"; FigureGallery figureGallery = eFact.createFigureGallery(); figureGallery.setName("Any"); figureGallery.setImplementationBundle(BUNDLE); FigureGallery figureGallery2 = eFact.createFigureGallery(); figureGallery2.setName("Any"); figureGallery2.setImplementationBundle(BUNDLE2); CustomBorder cb = eFact.createCustomBorder(); cb.setQualifiedClassName("com.thirparty.figures.borders.BorderA"); figureGallery2.getBorders().add(cb); CustomLayout cl = eFact.createCustomLayout(); cl.setQualifiedClassName("com.thirparty.figures.layouts.LA"); figureGallery2.getLayouts().add(cl); CustomFigure customFigure = eFact.createCustomFigure(); customFigure.setName("ExternalFigure"); customFigure.setQualifiedClassName("com.mycompany.figures.TheFigure"); Rectangle r = eFact.createRectangle(); r.setName("RectWithCustomBorderAndChild"); r.getChildren().add(customFigure); CompoundBorder b = eFact.createCompoundBorder(); BorderRef br = eFact.createBorderRef(); br.setActual(cb); // from another gallery b.setInner(br); r.setBorder(b); LayoutRef lref = eFact.createLayoutRef(); lref.setActual(cl); r.setLayout(lref); Node node = eFact.createNode(); node.setName("Node"); node.setFigure(DiaDefSetup.newDescriptor(r)); figureGallery.getDescriptors().add(node.getFigure()); Compartment compartment = eFact.createCompartment(); compartment.setName("Compartment"); compartment.setFigure(DiaDefSetup.newDescriptor(EcoreUtil.copy(customFigure))); figureGallery.getDescriptors().add(compartment.getFigure()); Connection connection = eFact.createConnection(); connection.setName("Link"); CustomConnection customLinkFigure = eFact.createCustomConnection(); customLinkFigure.setName("ExternalLink"); customLinkFigure.setQualifiedClassName("com.mycompany.figures.TheLink"); connection.setFigure(DiaDefSetup.newDescriptor(customLinkFigure)); figureGallery.getDescriptors().add(connection.getFigure()); Viewmap viewmap; assertNotNull(viewmap = getProducer().create(compartment)); assertTrue(viewmapOrProducerRequire(BUNDLE, viewmap)); assertFalse(viewmapOrProducerRequire(BUNDLE2, viewmap)); // sanity assertNotNull(viewmap = getProducer().create(connection)); assertTrue(viewmapOrProducerRequire(BUNDLE, viewmap)); assertFalse(viewmapOrProducerRequire(BUNDLE2, viewmap)); // sanity assertNotNull(viewmap = getProducer().create(node)); assertTrue(viewmapOrProducerRequire(BUNDLE, viewmap)); assertTrue(viewmapOrProducerRequire(BUNDLE2, viewmap)); } private boolean viewmapOrProducerRequire(String bundle, Viewmap viewmap) { return viewmap.getRequiredPluginIDs().contains(bundle) || Arrays.asList(getProducer().dependencies()).contains(bundle); } public void testInnerViewmapProducerForNode() { RealFigure figure; Node node = createNode("n1", figure = eFact.createRoundedRectangle()); ConstantColor c = eFact.createConstantColor(); c.setValue(ColorConstants.CYAN_LITERAL); figure.setBackgroundColor(c); figure.setName("RouRec1"); Viewmap v = getProducer().create(node); assertNotNull(v); assertTrue(v instanceof InnerClassViewmap); InnerClassViewmap icv = (InnerClassViewmap) v; assertNotNull(icv.getClassName()); assertNotNull(icv.getClassBody()); TypeDeclaration typeDecl = parseFirstType(icv.getClassBody()); assertNotNull(typeDecl); String innerClassGenName = typeDecl.getName().getFullyQualifiedName(); assertEquals(icv.getClassName(), innerClassGenName); } public void testPinnedCompartment(){ final Rectangle rect = eFact.createRectangle(); Node rootNode = createNode("Root", rect); rect.setName("RootFig"); RealFigure compartmentPaneA = eFact.createRectangle(); compartmentPaneA.setName("CompartmentA"); rect.getChildren().add(compartmentPaneA); RealFigure intermediate = eFact.createEllipse(); intermediate.setName("Intermediate"); rect.getChildren().add(intermediate); RealFigure compartmentPaneB = eFact.createRectangle(); compartmentPaneB.setName("CompartmentB"); intermediate.getChildren().add(compartmentPaneB); Compartment compartmentA = createCompartment("CompartmentA", rootNode.getFigure(), compartmentPaneA); Compartment compartmentB = createCompartment("CompartmentB", rootNode.getFigure(), compartmentPaneB); getProducer().create(rootNode); Viewmap viewmapA = getProducer().create(compartmentA); Viewmap viewmapB = getProducer().create(compartmentB); assertNotNull(viewmapA); assertNotNull(viewmapB); assertTrue(viewmapA.getClass().getName(), viewmapA instanceof ParentAssignedViewmap); assertTrue(viewmapB.getClass().getName(), viewmapB instanceof ParentAssignedViewmap); assertEquals(((ParentAssignedViewmap) viewmapA).getGetterName(), compartmentA.getAccessor().getAccessor()); assertEquals(((ParentAssignedViewmap) viewmapB).getGetterName(), compartmentB.getAccessor().getAccessor()); } public void testFloatingCompartment(){ Compartment compartment = createCompartment("Floating", null, eFact.createEllipse()); final Viewmap viewmapFloat = getProducer().create(compartment); assertNotNull(viewmapFloat); assertFalse(ParentAssignedViewmap.class.getName(), viewmapFloat instanceof ParentAssignedViewmap); Compartment noFigure = createCompartment("NoFigure", null, eFact.createCustomFigure()); noFigure.setFigure(null); final Viewmap viewmapNoFigure = getProducer().create(noFigure); assertNotNull(viewmapNoFigure); assertFalse(ParentAssignedViewmap.class.getName(), viewmapNoFigure instanceof ParentAssignedViewmap); } public void testResizeConstaintsSingleDiagonals(){ RealFigure f = eFact.createRoundedRectangle(); f.setName("Figure"); new ResizeConstraintsChecker(new Direction[] { Direction.NORTH_LITERAL, Direction.WEST_LITERAL, }).checkNode(createNode("NW", f, Direction.NORTH_WEST_LITERAL)); new ResizeConstraintsChecker(new Direction[] { Direction.NORTH_LITERAL, Direction.EAST_LITERAL, }).checkNode(createNode("NE", f, Direction.NORTH_EAST_LITERAL)); new ResizeConstraintsChecker(new Direction[] { Direction.SOUTH_LITERAL, Direction.WEST_LITERAL, }).checkNode(createNode("SW", f, Direction.SOUTH_WEST_LITERAL)); new ResizeConstraintsChecker(new Direction[] { Direction.SOUTH_LITERAL, Direction.EAST_LITERAL, }).checkNode(createNode("SE", f, Direction.SOUTH_EAST_LITERAL)); } public void testResizeConstraintsMulty(){ Node explicitAny = createNode("ExplicitAll", eFact.createRoundedRectangle(), Direction.NSEW_LITERAL); Node implicitAny = createNode("ImplicitAll", eFact.createRoundedRectangle(), null); Node horizontal = createNode("Horizontal", eFact.createRoundedRectangle(), Direction.EAST_WEST_LITERAL); Node vertical = createNode("Vertical", eFact.createRoundedRectangle(), Direction.NORTH_SOUTH_LITERAL); NoUselessResizeConstraintsChecker allDirectionsChecker = new NoUselessResizeConstraintsChecker(); allDirectionsChecker.checkNode(implicitAny); allDirectionsChecker.checkNode(explicitAny); new ResizeConstraintsChecker(new Direction[] {Direction.EAST_LITERAL, Direction.WEST_LITERAL}).checkNode(horizontal); new ResizeConstraintsChecker(new Direction[] {Direction.SOUTH_LITERAL, Direction.NORTH_LITERAL}).checkNode(vertical); } public void testResizeConstaintsSingleCartesians(){ RealFigure f = eFact.createRoundedRectangle(); f.setName("Figure"); Direction[] CARTESIANS = new Direction[] { Direction.NORTH_LITERAL, Direction.SOUTH_LITERAL, Direction.EAST_LITERAL, Direction.WEST_LITERAL, }; for (int i = 0; i < CARTESIANS.length; i++){ Direction next = CARTESIANS[i]; Node node = createNode("Single" + next.getName(), f, next); new ResizeConstraintsChecker(next).checkNode(node); } } public void testDefaultSizeAttribute(){ Dimension DIMENSION = eFact.createDimension(); DIMENSION.setDx(321); DIMENSION.setDy(123); class Checker { private final Dimension myExpectedSize; public Checker(Figure expected){ this(expected.getPreferredSize()); } public Checker(Dimension expected){ myExpectedSize = expected == null ? null : (Dimension)EcoreUtil.copy(expected); } public void check(RealFigure figure){ check(getProducer().create(createNode(figure.getName(), figure))); } public void check(Viewmap viewmap){ DefaultSizeAttributes actual = (DefaultSizeAttributes) viewmap.find(DefaultSizeAttributes.class); if (myExpectedSize == null){ assertNull(actual); } else { assertNotNull(actual); assertEquals(myExpectedSize.getDx(), actual.getWidth()); assertEquals(myExpectedSize.getDy(), actual.getHeight()); } } } RealFigure withPrefSize = eFact.createRoundedRectangle(); withPrefSize.setName("WithPreferredSize"); withPrefSize.setPreferredSize(EcoreUtil.copy(DIMENSION)); new Checker(withPrefSize).check(withPrefSize); RealFigure noPrefSize = eFact.createRectangle(); noPrefSize.setName("NoPrefSize"); new Checker(noPrefSize).check(noPrefSize); RealFigure childHasPrefSizeButFigureDoesNot = eFact.createEllipse(); childHasPrefSizeButFigureDoesNot.setName("Parent"); RealFigure child = eFact.createRectangle(); child.setName("child"); child.setPreferredSize(EcoreUtil.copy(DIMENSION)); new Checker((Dimension)null).check(childHasPrefSizeButFigureDoesNot); new Checker(DIMENSION).check(child); RealFigure noPrefSizeButFacet = eFact.createScalablePolygon(); Node facetNode = createNode("NoPrefSizeButFacet", noPrefSizeButFacet); DefaultSizeFacet facet = eFact.createDefaultSizeFacet(); facet.setDefaultSize(EcoreUtil.copy(DIMENSION)); facetNode.getFacets().add(facet); new Checker(DIMENSION).check(getProducer().create(facetNode)); final int FACET_VALUE = 42; final int PREF_SIZE_VALUE = 42 * 2; RealFigure bothFacetAndPrefSize = eFact.createRectangle(); Node bothSizesNode = createNode("BothPrefSizeAndFacet", bothFacetAndPrefSize); facet = eFact.createDefaultSizeFacet(); facet.setDefaultSize(eFact.createDimension()); facet.getDefaultSize().setDx(FACET_VALUE); facet.getDefaultSize().setDy(FACET_VALUE); bothSizesNode.getFacets().add(facet); Dimension prefSize = eFact.createDimension(); prefSize.setDx(PREF_SIZE_VALUE); prefSize.setDy(PREF_SIZE_VALUE); bothFacetAndPrefSize.setPreferredSize(prefSize); //facet should have a precedence new Checker(facet.getDefaultSize()).check(getProducer().create(bothSizesNode)); } public void testViewmapLayoutType(){ ViewmapLayoutTypeChecker checker = new ViewmapLayoutTypeChecker(); GMFGraphFactory gmf = eFact; checker.check(null, ViewmapLayoutType.UNKNOWN_LITERAL); checker.check(gmf.createCustomLayout(), ViewmapLayoutType.UNKNOWN_LITERAL); checker.check(gmf.createGridLayout(), ViewmapLayoutType.UNKNOWN_LITERAL); checker.check(gmf.createBorderLayout(), ViewmapLayoutType.UNKNOWN_LITERAL); checker.check(gmf.createXYLayout(), ViewmapLayoutType.XY_LAYOUT_LITERAL); FlowLayout flow = gmf.createFlowLayout(); flow.setForceSingleLine(false); checker.check(flow, ViewmapLayoutType.FLOW_LAYOUT_LITERAL); FlowLayout toolbar = gmf.createFlowLayout(); toolbar.setForceSingleLine(true); checker.check(toolbar, ViewmapLayoutType.TOOLBAR_LAYOUT_LITERAL); } public void testStyleAttributes(){ class Checker { public void check(Viewmap viewmap, boolean font, boolean fore, boolean back){ StyleAttributes attributes = (StyleAttributes) viewmap.find(StyleAttributes.class); if (font || fore || back){ assertNotNull(attributes); assertEquals(font, attributes.isFixedFont()); assertEquals(fore, attributes.isFixedForeground()); assertEquals(back, attributes.isFixedBackground()); } else { assertNull(attributes); } } public void check(Node node, boolean font, boolean fore, boolean back){ Viewmap viewmap = getProducer().create(node); check(viewmap, font, fore, back); } public void check(Connection link, boolean font, boolean fore, boolean back){ Viewmap viewmap = getProducer().create(link); check(viewmap, font, fore, back); } } Checker checker = new Checker(); checker.check(createNode("NODE_Empty", eFact.createRectangle()), false, false, false); checker.check(createLink("LINK_Empty", eFact.createPolylineConnection()), false, false, false); RealFigure hasFont = eFact.createRectangle(); BasicFont font = eFact.createBasicFont(); font.setFaceName("Arial"); font.setHeight(12); font.setStyle(FontStyle.BOLD_LITERAL); hasFont.setFont(font); checker.check(createNode("NODE_Font", hasFont), true, false, false); RealFigure hasFore = eFact.createRectangle(); hasFore.setForegroundColor(createColor(ColorConstants.GRAY_LITERAL)); checker.check(createNode("NODE_Fore_Color", hasFore), false, true, false); RealFigure hasBack = eFact.createRectangle(); hasBack.setBackgroundColor(createColor(ColorConstants.LIGHT_BLUE_LITERAL)) ; checker.check(createNode("NODE_Back_Color", hasBack), false, false, true); ConnectionFigure polylineWithFont = eFact.createPolylineConnection(); polylineWithFont.setFont(font); checker.check(createLink("Link_Font", polylineWithFont), true, false, false); ConnectionFigure polylineWithColor = eFact.createPolylineConnection(); polylineWithColor.setForegroundColor(createColor(ColorConstants.RED_LITERAL)); checker.check(createLink("Link_Font", polylineWithColor), false, true, false); RealFigure parent = eFact.createRoundedRectangle(); parent.setName("ParentNoColor"); RealFigure child = eFact.createEllipse(); child.setName("ChildWithColor"); child.setForegroundColor(createColor(ColorConstants.GREEN_LITERAL)); parent.getChildren().add(child); //only properties of top-level figure should be considered checker.check(createNode("ParentOfColoredChild", parent), false, false, false); Label externalWithFont = eFact.createLabel(); externalWithFont.setText("LabelText"); externalWithFont.setName("ExternalWithFont"); externalWithFont.setFont(font); DiagramLabel diagramExternalLabel = eFact.createDiagramLabel(); diagramExternalLabel.setName("DiagramExternalLabelWithFont"); diagramExternalLabel.setFigure(DiaDefSetup.newDescriptor(externalWithFont)); checker.check(getProducer().create(diagramExternalLabel), true, false, false); RealFigure labelParent = eFact.createRectangle(); labelParent.setName("LabelParent"); Label innerWithFont = EcoreUtil.copy(externalWithFont); labelParent.getChildren().add(innerWithFont); DiagramLabel diagramInnerLabel = eFact.createDiagramLabel(); diagramInnerLabel.setName("DiagramInnerLabelWithFont"); final FigureDescriptor fd = DiaDefSetup.newDescriptor(labelParent); ChildAccess ca = DiaDefSetup.newAccess(fd, innerWithFont); diagramInnerLabel.setFigure(fd); diagramInnerLabel.setAccessor(ca); checker.check(getProducer().create(diagramInnerLabel), true, false, false); } private TypeDeclaration parseFirstType(String classContents) { ASTParser p = ASTParser.newParser(AST.JLS3); p.setSource(classContents.toCharArray()); p.setKind(ASTParser.K_COMPILATION_UNIT); ASTNode astNode = p.createAST(null); assertEquals(ASTNode.COMPILATION_UNIT, astNode.getNodeType()); CompilationUnit cu = (CompilationUnit) astNode; assertNull(cu.getPackage()); assertTrue(cu.types().size() > 0); assertTrue(cu.types().get(0) instanceof TypeDeclaration); return (TypeDeclaration) cu.types().get(0); } private static Node createNode(String name, RealFigure figure){ return createNode(name, figure, null); } private static Connection createLink(String name, ConnectionFigure connectionFigure) { Connection connection = GMFGraphFactory.eINSTANCE.createConnection(); connectionFigure.setName(name); connection.setName(name); connection.setFigure(DiaDefSetup.newDescriptor(connectionFigure)); return connection; } private static Compartment createCompartment(String name, FigureDescriptor owner, RealFigure figure){ assertNotNull(name); assertNotNull(figure); Compartment result = GMFGraphFactory.eINSTANCE.createCompartment(); result.setName(name); if (owner == null) { result.setFigure(DiaDefSetup.newDescriptor(name + "Fig", figure)); } else { result.setFigure(owner); result.setAccessor(DiaDefSetup.newAccess(owner, figure)); } return result; } private static Node createNode(String name, RealFigure figure, Direction optionalConstaint){ assertNotNull(name); assertNotNull(figure); Node result = GMFGraphFactory.eINSTANCE.createNode(); result.setName(name); figure.setName(name); result.setFigure(DiaDefSetup.newDescriptor(figure)); if (optionalConstaint != null){ result.setResizeConstraint(optionalConstaint); } return result; } protected ViewmapProducer getProducer() { return myProducer; } private static Color createColor(ColorConstants color) { ConstantColor result = GMFGraphFactory.eINSTANCE.createConstantColor(); result.setValue(color); return result; } private class ResizeConstraintsChecker { private final List<String> myExpectedNames; public ResizeConstraintsChecker(Direction[] expectedDirectionNames){ myExpectedNames = new ArrayList<String>(expectedDirectionNames.length); for (int i = 0; i < expectedDirectionNames.length; i++){ myExpectedNames.add(expectedDirectionNames[i].getName()); } } public ResizeConstraintsChecker(Direction theOnly){ this(new Direction[] {theOnly}); } protected ResizeConstraintsChecker() { myExpectedNames = Collections.emptyList(); } public void checkNode(Node node){ Viewmap viewmap = getProducer().create(node); checkViewmap(node.getName(), viewmap); } public void checkViewmap(String nodeName, Viewmap v){ assertNotNull(v); ResizeConstraints genConstraint = (ResizeConstraints)v.find(ResizeConstraints.class); assertNotNull("Problem node:" + nodeName, genConstraint); assertEquals("Problem node:" + nodeName, myExpectedNames.size(), genConstraint.getResizeHandleNames().size()); assertTrue("Problem node:" + nodeName, genConstraint.getResizeHandleNames().containsAll(myExpectedNames)); } } private class NoUselessResizeConstraintsChecker extends ResizeConstraintsChecker { public NoUselessResizeConstraintsChecker() { } public void checkViewmap(String nodeName, Viewmap v){ assertNotNull(v); ResizeConstraints genConstraint = (ResizeConstraints)v.find(ResizeConstraints.class); assertNull("Problem node:" + nodeName, genConstraint); } } private class ViewmapLayoutTypeChecker { private final RealFigure myFigure; private final Node myNode; public ViewmapLayoutTypeChecker(){ this(eFact.createRectangle(), eFact.createNode()); } public ViewmapLayoutTypeChecker(RealFigure figure, Node node){ myFigure = figure; myFigure.setName("Figure"); myNode = node; myNode.setName("Node"); myNode.setFigure(DiaDefSetup.newDescriptor(myFigure)); } public void check(Layout graphLayout, ViewmapLayoutType expected){ myFigure.setLayout(graphLayout); ViewmapLayoutType actual = getProducer().create(myNode).getLayoutType(); assertNotNull(actual); assertEquals(expected, actual); } } }