### Eclipse Workspace Patch 1.0 #P org.eclipse.gmf.tests Index: src/org/eclipse/gmf/tests/gen/CodegenReconcileTest.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/tests/org.eclipse.gmf.tests/src/org/eclipse/gmf/tests/gen/CodegenReconcileTest.java,v retrieving revision 1.3 diff -u -r1.3 CodegenReconcileTest.java --- src/org/eclipse/gmf/tests/gen/CodegenReconcileTest.java 15 Mar 2006 15:56:53 -0000 1.3 +++ src/org/eclipse/gmf/tests/gen/CodegenReconcileTest.java 28 Mar 2006 20:51:23 -0000 @@ -11,26 +11,51 @@ */ package org.eclipse.gmf.tests.gen; +import java.util.Iterator; + import junit.framework.Assert; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.ETypedElement; +import org.eclipse.emf.ecore.EcoreFactory; +import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage; +import org.eclipse.gmf.codegen.gmfgen.GenCompartment; +import org.eclipse.gmf.codegen.gmfgen.GenDiagram; import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator; import org.eclipse.gmf.codegen.gmfgen.GenNode; import org.eclipse.gmf.codegen.gmfgen.GenPlugin; +import org.eclipse.gmf.gmfgraph.Canvas; +import org.eclipse.gmf.gmfgraph.Compartment; +import org.eclipse.gmf.gmfgraph.Connection; +import org.eclipse.gmf.gmfgraph.Figure; +import org.eclipse.gmf.gmfgraph.FigureGallery; +import org.eclipse.gmf.gmfgraph.GMFGraphFactory; +import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.internal.codegen.GMFGenConfig; import org.eclipse.gmf.internal.common.reconcile.DefaultDecisionMaker; import org.eclipse.gmf.internal.common.reconcile.Reconciler; import org.eclipse.gmf.internal.common.reconcile.ReconcilerConfigBase; +import org.eclipse.gmf.mappings.ChildReference; +import org.eclipse.gmf.mappings.CompartmentMapping; +import org.eclipse.gmf.mappings.GMFMapFactory; +import org.eclipse.gmf.mappings.NodeMapping; import org.eclipse.gmf.tests.ConfiguredTestCase; import org.eclipse.gmf.tests.setup.DiaDefSetup; +import org.eclipse.gmf.tests.setup.DiaDefSource; import org.eclipse.gmf.tests.setup.DiaGenSetup; +import org.eclipse.gmf.tests.setup.DomainModelSetup; +import org.eclipse.gmf.tests.setup.DomainModelSource; import org.eclipse.gmf.tests.setup.MapDefSource; import org.eclipse.gmf.tests.setup.MapSetup; import org.eclipse.gmf.tests.setup.ToolDefSetup; +import org.eclipse.gmf.tests.setup.ToolDefSource; +import org.eclipse.gmf.tests.setup.DomainModelSource.NodeData; public class CodegenReconcileTest extends ConfiguredTestCase { @@ -99,6 +124,184 @@ checkUserChange(new GenPluginChange()); } + + public void testReconcileCompartmentIsListlayout(){ + class ConfigWithCompartments implements DiaDefSetup.Config { + public void setupCanvasDef(Canvas canvasDef) { + FigureGallery oneMoreGallery = GMFGraphFactory.eINSTANCE.createFigureGallery(); + canvasDef.getFigures().add(oneMoreGallery); + Figure compartmentFigure = GMFGraphFactory.eINSTANCE.createRectangle(); + oneMoreGallery.getFigures().add(compartmentFigure); + Compartment compartment = createCompartment(compartmentFigure, "CompartmentA", true, true); + canvasDef.getCompartments().add(compartment); + } + + public void setupLinkDef(Connection linkDef) { + // + } + + public void setupNodeDef(Node nodeDef) { + // + } + + private Compartment createCompartment(Figure figure, String name, boolean collapsible, boolean needsTitle){ + Compartment result = GMFGraphFactory.eINSTANCE.createCompartment(); + result.setCollapsible(true); + result.setFigure(figure); + result.setName(name); + result.setNeedsTitle(needsTitle); + return result; + } + } + + class DiaDefSetupWithCompartments extends DiaDefSetup { + public DiaDefSetupWithCompartments(){ + super(new ConfigWithCompartments()); + } + + public Compartment getCompartment(){ + return (Compartment)getCanvasDef().getCompartments().get(0); + } + } + + class DomainSetupWithChildren extends DomainModelSetup { + private NodeData myChildOfA; + + public DomainModelSetup init() { + DomainModelSetup result = super.init(); + + EClass childClass = EcoreFactory.eINSTANCE.createEClass(); + childClass.setName("ChildOfA"); + EAttribute childLabel = EcoreFactory.eINSTANCE.createEAttribute(); + childLabel.setName("childLabel"); + childLabel.setEType(EcorePackage.eINSTANCE.getEString()); + childClass.getEStructuralFeatures().add(childLabel); + result.getModel().getEClassifiers().add(childClass); + + EReference containment = EcoreFactory.eINSTANCE.createEReference(); + containment.setContainment(true); + containment.setName("childrenOfA"); + containment.setEType(childClass); + containment.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY); + result.getNodeA().getEClass().getEStructuralFeatures().add(containment); + + myChildOfA = new NodeData(childClass, childLabel, containment); + return result; + } + + public NodeData getChildOfA() { + return myChildOfA; + } + } + + class MapSetupWithCompartments extends MapSetup { + public MapSetup init(DiaDefSource ddSource, DomainModelSource domainSource, ToolDefSource toolDef) { + Assert.assertTrue(domainSource instanceof DomainSetupWithChildren); + Assert.assertTrue(ddSource instanceof DiaDefSetupWithCompartments); + + DomainSetupWithChildren domainWithChildren = (DomainSetupWithChildren)domainSource; + DiaDefSetupWithCompartments diaDefSetupWithCompartments = (DiaDefSetupWithCompartments)ddSource; + Assert.assertNotNull(diaDefSetupWithCompartments.getCompartment()); + + MapSetup result = super.init(ddSource, domainSource, toolDef); + + NodeData childOfAData = domainWithChildren.getChildOfA(); + NodeMapping childOfAMapping = createNodeMapping(ddSource.getNodeDef(), childOfAData.getEClass(), ddSource.getLabelDef(), childOfAData.getNameAttr(), childOfAData.getContainment(), false); + + ChildReference childOfAReference = GMFMapFactory.eINSTANCE.createChildReference(); + childOfAReference.setOwnedChild(childOfAMapping); + childOfAReference.setChildrenFeature(childOfAData.getContainment()); + result.getNodeA().getChildren().add(childOfAReference); + + CompartmentMapping childOfACompartment = GMFMapFactory.eINSTANCE.createCompartmentMapping(); + childOfACompartment.setCompartment(diaDefSetupWithCompartments.getCompartment()); + childOfACompartment.getChildren().add(childOfAReference); + result.getNodeA().getCompartments().add(childOfACompartment); + + return result; + } + } + + class CompartmentChange extends Assert implements UserChange { + private int myCompartmentsTotalCount; + private final EStructuralFeature myGenCompartmentFeature; + private final Boolean myExpectedValue; + + public CompartmentChange(EStructuralFeature genCompartmentFeature, boolean expectedValue){ + assertEquals(EcorePackage.eINSTANCE.getEBoolean(), genCompartmentFeature.getEType()); + myGenCompartmentFeature = genCompartmentFeature; + myExpectedValue = Boolean.valueOf(expectedValue); + } + + public final void applyChanges(GenEditorGenerator old) { + GenDiagram diagram = old.getDiagram(); + assertEquals(1, diagram.getChildNodes().size()); + + myCompartmentsTotalCount = 0; + for (Iterator allNodes = diagram.getAllNodes().iterator(); allNodes.hasNext();){ + GenNode next = (GenNode) allNodes.next(); + for (Iterator compartments = next.getCompartments().iterator(); compartments.hasNext();){ + GenCompartment nextCompartment = (GenCompartment)compartments.next(); + myCompartmentsTotalCount++; + nextCompartment.eSet(myGenCompartmentFeature, myExpectedValue); + } + } + + assertTrue(myCompartmentsTotalCount > 0); + } + + public final void assertChangesPreserved(GenEditorGenerator current) { + GenDiagram diagram = current.getDiagram(); + assertEquals(1, diagram.getChildNodes().size()); + + int actualCompartmentsTotalCount = 0; + for (Iterator allNodes = diagram.getAllNodes().iterator(); allNodes.hasNext();){ + GenNode next = (GenNode) allNodes.next(); + for (Iterator compartments = next.getCompartments().iterator(); compartments.hasNext();){ + GenCompartment nextCompartment = (GenCompartment)compartments.next(); + actualCompartmentsTotalCount++; + Boolean actualValue = (Boolean)nextCompartment.eGet(myGenCompartmentFeature); + assertEquals(getChangeDescription(), myExpectedValue, actualValue); + } + } + + assertEquals(myCompartmentsTotalCount, actualCompartmentsTotalCount); + } + + public ReconcilerConfigBase getReconcilerConfig() { + return new GMFGenConfig(); + } + + private String getChangeDescription() { + return "CompartmentChange: " + myGenCompartmentFeature.getName() + ":" + myExpectedValue; + } + } + + DiaDefSetupWithCompartments ddSource = new DiaDefSetupWithCompartments(); + DomainSetupWithChildren domainSetup = new DomainSetupWithChildren(); + MapSetupWithCompartments mapDefSource = new MapSetupWithCompartments(); + mapDefSource.init(ddSource.init(), domainSetup.init(), new ToolDefSetup()); + + assertFalse(mapDefSource.getNodeA().getCompartments().isEmpty()); + + DiaGenSetup diaGenSetup = new DiaGenSetup().init(mapDefSource); + myEditorGen = diaGenSetup.getGenDiagram().getEditorGen(); + + assertNotNull(myEditorGen); + assertFalse(diaGenSetup.getNodeA().getCompartments().isEmpty()); + + final GMFGenPackage GMFGEN = GMFGenPackage.eINSTANCE; + + checkUserChange(new CompartmentChange(GMFGEN.getGenCompartment_CanCollapse(), true)); + checkUserChange(new CompartmentChange(GMFGEN.getGenCompartment_CanCollapse(), false)); + checkUserChange(new CompartmentChange(GMFGEN.getGenCompartment_HideIfEmpty(), true)); + checkUserChange(new CompartmentChange(GMFGEN.getGenCompartment_HideIfEmpty(), false)); + checkUserChange(new CompartmentChange(GMFGEN.getGenCompartment_NeedsTitle(), true)); + checkUserChange(new CompartmentChange(GMFGEN.getGenCompartment_NeedsTitle(), false)); + checkUserChange(new CompartmentChange(GMFGEN.getGenChildContainer_ListLayout(), true)); + checkUserChange(new CompartmentChange(GMFGEN.getGenChildContainer_ListLayout(), false)); + } + public void testReconcileGenNodes() throws Exception { MapDefSource mapDefSource = new MapSetup().init(new DiaDefSetup(null).init(), getSetup().getDomainModel(), new ToolDefSetup()); DiaGenSetup diaGenSetup = new DiaGenSetup().init(mapDefSource); #P org.eclipse.gmf.codegen.ui Index: src/org/eclipse/gmf/internal/codegen/GMFGenConfig.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.codegen.ui/src/org/eclipse/gmf/internal/codegen/GMFGenConfig.java,v retrieving revision 1.2 diff -u -r1.2 GMFGenConfig.java --- src/org/eclipse/gmf/internal/codegen/GMFGenConfig.java 15 Mar 2006 15:16:58 -0000 1.2 +++ src/org/eclipse/gmf/internal/codegen/GMFGenConfig.java 28 Mar 2006 20:51:24 -0000 @@ -52,6 +52,12 @@ preserveIfSet(GMFGEN.getGenChildNode(), GMFGEN.getGenChildContainer_ListLayout()); preserveIfNotByPattern(GMFGEN.getGenChildNode(), GMFGEN.getGenChildContainer_CanonicalEditPolicyClassName(), ".*" + GenChildContainer.CANONICAL_EDIT_POLICY_SUFFIX); preserveIfNotByPattern(GMFGEN.getGenChildNode(), GMFGEN.getGenNode_GraphicalNodeEditPolicyClassName(), ".*" + GenNode.GRAPHICAL_NODE_EDIT_POLICY_SUFFIX); + + setMatcher(GMFGEN.getGenCompartment(), new ReflectiveMatcher(GMFGEN.getGenCompartment_Title())); + preserveIfSet(GMFGEN.getGenCompartment(), GMFGEN.getGenChildContainer_ListLayout()); + preserveIfSet(GMFGEN.getGenCompartment(), GMFGEN.getGenCompartment_CanCollapse()); + preserveIfSet(GMFGEN.getGenCompartment(), GMFGEN.getGenCompartment_HideIfEmpty()); + preserveIfSet(GMFGEN.getGenCompartment(), GMFGEN.getGenCompartment_NeedsTitle()); } private Matcher getGenNodeMatcher(){ #P org.eclipse.gmf.common Index: src/org/eclipse/gmf/internal/common/reconcile/ReflectiveMatcher.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.common/src/org/eclipse/gmf/internal/common/reconcile/ReflectiveMatcher.java,v retrieving revision 1.1 diff -u -r1.1 ReflectiveMatcher.java --- src/org/eclipse/gmf/internal/common/reconcile/ReflectiveMatcher.java 15 Mar 2006 15:16:59 -0000 1.1 +++ src/org/eclipse/gmf/internal/common/reconcile/ReflectiveMatcher.java 28 Mar 2006 20:51:24 -0000 @@ -26,7 +26,7 @@ } public ReflectiveMatcher(EStructuralFeature feature) { - this(feature.eClass(), new StructuralFeatureReflector(feature)); + this(feature.getEContainingClass(), new StructuralFeatureReflector(feature)); } public ReflectiveMatcher(EClass reflectorOwner, Reflector reflector) {