/**
* Copyright (c) 2006 Borland Software Corp.
*
* 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.tests.tr;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenFeature;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory;
import org.eclipse.gmf.codegen.gmfgen.GenChildNode;
import org.eclipse.gmf.codegen.gmfgen.GenCommonBase;
import org.eclipse.gmf.codegen.gmfgen.GenCompartment;
import org.eclipse.gmf.codegen.gmfgen.GenDiagram;
import org.eclipse.gmf.codegen.gmfgen.GenLink;
import org.eclipse.gmf.codegen.gmfgen.GenLinkLabel;
import org.eclipse.gmf.codegen.gmfgen.GenNavigator;
import org.eclipse.gmf.codegen.gmfgen.GenNavigatorChildReference;
import org.eclipse.gmf.codegen.gmfgen.GenNavigatorReferenceType;
import org.eclipse.gmf.codegen.gmfgen.GenNode;
import org.eclipse.gmf.codegen.gmfgen.GenNodeLabel;
import org.eclipse.gmf.codegen.gmfgen.GenTopLevelNode;
import org.eclipse.gmf.codegen.gmfgen.TypeLinkModelFacet;
import org.eclipse.gmf.codegen.gmfgen.TypeModelFacet;
import org.eclipse.gmf.internal.codegen.util.GenModelGraphAnalyzer;
public class GenModelGraphAnalyzerTest extends TestCase {
private static final String ECLASS_NAME_PREFIX = "EClass";
private GenTopLevelNode myStartNode;
private GenNodeLabel myStartNodeLabel;
private GenCompartment myStartNodeCompartment;
private GenDiagram myDiagram;
private EPackage myDomainModelPackage;
private GenPackage myDomainModelGenPackage;
private int myClassCounter;
private GenNavigator myNavigator;
private GenNavigatorChildReference myNavigatorChildReference;
protected void setUp() throws Exception {
super.setUp();
initGenModel();
myClassCounter = 0;
myDiagram = GMFGenFactory.eINSTANCE.createGenDiagram();
GMFGenFactory.eINSTANCE.createGenEditorGenerator().setDiagram(myDiagram);
myNavigator = GMFGenFactory.eINSTANCE.createGenNavigator();
myDiagram.getEditorGen().setNavigator(myNavigator);
myNavigatorChildReference = GMFGenFactory.eINSTANCE.createGenNavigatorChildReference();
myNavigator.getChildReferences().add(myNavigatorChildReference);
myStartNode = GMFGenFactory.eINSTANCE.createGenTopLevelNode();
myStartNodeLabel = GMFGenFactory.eINSTANCE.createGenNodeLabel();
myStartNode.getLabels().add(myStartNodeLabel);
myStartNodeCompartment = GMFGenFactory.eINSTANCE.createGenCompartment();
myStartNode.getCompartments().add(myStartNodeCompartment);
initializeMF(myStartNode);
myDiagram.getTopLevelNodes().add(myStartNode);
}
private void initGenModel() {
myDomainModelPackage = EcoreFactory.eINSTANCE.createEPackage();
GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
myDomainModelGenPackage = GenModelFactory.eINSTANCE.createGenPackage();
genModel.getGenPackages().add(myDomainModelGenPackage);
myDomainModelGenPackage.setEcorePackage(myDomainModelPackage);
}
private void initializeMF(GenNode node) {
TypeModelFacet nodeMF = GMFGenFactory.eINSTANCE.createTypeModelFacet();
node.setModelFacet(nodeMF);
nodeMF.setMetaClass(createGenClass());
}
private GenClass createGenClass() {
GenClass genClass = GenModelFactory.eINSTANCE.createGenClass();
EClass eClass = EcoreFactory.eINSTANCE.createEClass();
eClass.setName(getUniqueEClassName());
myDomainModelPackage.getEClassifiers().add(eClass);
genClass.setEcoreClass(eClass);
myDomainModelGenPackage.getGenClasses().add(genClass);
return genClass;
}
private String getUniqueEClassName() {
return ECLASS_NAME_PREFIX + (myClassCounter++);
}
public void testEmptyPaths() {
GenChildNode notConnectedNode = GMFGenFactory.eINSTANCE.createGenChildNode();
myDiagram.getChildNodes().add(notConnectedNode);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.CHILDREN_LITERAL);
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(notConnectedNode);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.IN_SOURCE_LITERAL);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.OUT_TARGET_LITERAL);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
}
public void testDirectChildPaths() {
GenChildNode directChildNode = GMFGenFactory.eINSTANCE.createGenChildNode();
myStartNode.getChildNodes().add(directChildNode);
myDiagram.getChildNodes().add(directChildNode);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.CHILDREN_LITERAL);
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(directChildNode);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, directChildNode });
myNavigatorChildReference.setChild(myStartNodeLabel);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, myStartNodeLabel });
myNavigatorChildReference.setChild(myStartNodeCompartment);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, myStartNodeCompartment });
myNavigatorChildReference.setParent(myDiagram);
myNavigatorChildReference.setChild(myStartNode);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myDiagram, myStartNode });
GenLink link = GMFGenFactory.eINSTANCE.createGenLink();
GenLinkLabel linkLabel = GMFGenFactory.eINSTANCE.createGenLinkLabel();
link.getLabels().add(linkLabel);
myDiagram.getLinks().add(link);
myNavigatorChildReference.setChild(link);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myDiagram, link });
myNavigatorChildReference.setParent(link);
myNavigatorChildReference.setChild(linkLabel);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { link, linkLabel });
}
public void testDirectLinkPaths() {
GenNode node = createGenNode();
GenLink link = createGenLink(myStartNode, node);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.OUT_TARGET_LITERAL);
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(link);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, link });
myNavigatorChildReference.setParent(link);
myNavigatorChildReference.setChild(node);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { link, node });
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.IN_SOURCE_LITERAL);
myNavigatorChildReference.setParent(node);
myNavigatorChildReference.setChild(link);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { node, link });
myNavigatorChildReference.setParent(link);
myNavigatorChildReference.setChild(myStartNode);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { link, myStartNode });
}
private GenNode createGenNode() {
GenChildNode node = GMFGenFactory.eINSTANCE.createGenChildNode();
myDiagram.getChildNodes().add(node);
initializeMF(node);
return node;
}
private GenLink createGenLink(GenNode source, GenNode target) {
GenLink link = GMFGenFactory.eINSTANCE.createGenLink();
myDiagram.getLinks().add(link);
TypeLinkModelFacet linkMF = GMFGenFactory.eINSTANCE.createTypeLinkModelFacet();
link.setModelFacet(linkMF);
linkMF.setMetaClass(createGenClass());
linkMF.setContainmentMetaFeature(createGenFeature(source.getDomainMetaClass(), linkMF.getMetaClass(), true));
linkMF.setTargetMetaFeature(createGenFeature(linkMF.getMetaClass(), target.getDomainMetaClass(), false));
return link;
}
private GenFeature createGenFeature(GenClass sourceGenClass, GenClass targetGenClass, boolean isContainment) {
EReference eReference = EcoreFactory.eINSTANCE.createEReference();
eReference.setContainment(isContainment);
sourceGenClass.getEcoreClass().getEStructuralFeatures().add(eReference);
eReference.setEType(targetGenClass.getEcoreClass());
GenFeature genFeature = GenModelFactory.eINSTANCE.createGenFeature();
genFeature.setEcoreFeature(eReference);
sourceGenClass.getGenFeatures().add(genFeature);
return genFeature;
}
public void testIndirectChildPaths() {
GenChildNode indirectChildNode = createIndirectChildNode();
GenCompartment indirectChildNodeCompartment = createIndirectChildNodeCompartment(indirectChildNode);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.CHILDREN_LITERAL);
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(indirectChildNode);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, myStartNodeCompartment, indirectChildNode });
myNavigatorChildReference.setParent(indirectChildNode);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { indirectChildNode, indirectChildNodeCompartment, indirectChildNode });
}
public void testIndirectLinkPaths() {
GenNode node1 = createGenNode();
GenLink link1 = createGenLink(myStartNode, node1);
GenLink link2 = createGenLink(node1, node1);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.OUT_TARGET_LITERAL);
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(node1);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, link1, node1 });
myNavigatorChildReference.setParent(link1);
myNavigatorChildReference.setChild(link2);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
myNavigatorChildReference.setParent(node1);
myNavigatorChildReference.setChild(node1);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { node1, link2, node1 });
myNavigatorChildReference.setParent(link2);
myNavigatorChildReference.setChild(link2);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.IN_SOURCE_LITERAL);
myNavigatorChildReference.setParent(node1);
myNavigatorChildReference.setChild(myStartNode);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { node1, link1, myStartNode });
myNavigatorChildReference.setParent(link2);
myNavigatorChildReference.setChild(link1);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
myNavigatorChildReference.setParent(node1);
myNavigatorChildReference.setChild(node1);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { node1, link2, node1 });
myNavigatorChildReference.setParent(link2);
myNavigatorChildReference.setChild(link2);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertEquals("No paths should be found", 0, paths.size());
}
private GenCompartment createIndirectChildNodeCompartment(GenChildNode indirectChildNode) {
GenCompartment indirectChildNodeCompartment = GMFGenFactory.eINSTANCE.createGenCompartment();
indirectChildNode.getCompartments().add(indirectChildNodeCompartment);
indirectChildNodeCompartment.getChildNodes().add(indirectChildNode);
return indirectChildNodeCompartment;
}
private GenChildNode createIndirectChildNode() {
GenChildNode indirectChildNode = GMFGenFactory.eINSTANCE.createGenChildNode();
myStartNodeCompartment.getChildNodes().add(indirectChildNode);
myDiagram.getChildNodes().add(indirectChildNode);
return indirectChildNode;
}
public void testSeveralChildPaths() {
GenChildNode indirectChildNode = createIndirectChildNode();
GenCompartment indirectChildNodeCompartment = createIndirectChildNodeCompartment(indirectChildNode);
GenChildNode doublePathChildNode = GMFGenFactory.eINSTANCE.createGenChildNode();
myDiagram.getChildNodes().add(doublePathChildNode);
myStartNodeCompartment.getChildNodes().add(doublePathChildNode);
indirectChildNodeCompartment.getChildNodes().add(doublePathChildNode);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.CHILDREN_LITERAL);
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(doublePathChildNode);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
GenCommonBase[] truePath1 = new GenCommonBase[] { myStartNode, myStartNodeCompartment, doublePathChildNode };
GenCommonBase[] truePath2 = new GenCommonBase[] { myStartNode, myStartNodeCompartment, indirectChildNode, indirectChildNodeCompartment, doublePathChildNode };
assertTwoPaths(paths, truePath1, truePath2);
}
public void testOneLinkPathsUsed() {
GenNode node1 = createGenNode();
GenNode node2 = createGenNode();
node1.getDomainMetaClass().getEcoreClass().getESuperTypes().add(node2.getDomainMetaClass().getEcoreClass());
GenLink link1 = createGenLink(myStartNode, node2);
createGenLink(node2, node1);
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.OUT_TARGET_LITERAL);
// Check only one path returned - paths through 2 links should be
// skipped
myNavigatorChildReference.setParent(myStartNode);
myNavigatorChildReference.setChild(node1);
List<List<GenCommonBase>> paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { myStartNode, link1, node1 });
myNavigatorChildReference.setReferenceType(GenNavigatorReferenceType.IN_SOURCE_LITERAL);
myNavigatorChildReference.setParent(node1);
myNavigatorChildReference.setChild(myStartNode);
paths = GenModelGraphAnalyzer.getConnectionPaths(myNavigatorChildReference);
assertOnePath(paths, new GenCommonBase[] { node1, link1, myStartNode });
}
private void assertOnePath(List<List<GenCommonBase>> paths, GenCommonBase[] truePath) {
assertEquals("Only one path should be found", 1, paths.size());
List<GenCommonBase> path = paths.get(0);
assertEquals("Incorrect size path found", truePath.length, path.size());
assertPath(path, truePath);
}
private void assertTwoPaths(List<List<GenCommonBase>> paths, GenCommonBase[] truePath1, GenCommonBase[] truePath2) {
assertEquals("Incorrect number of paths returned", 2, paths.size());
List<GenCommonBase> path1 = paths.get(0);
List<GenCommonBase> path2 = paths.get(1);
if (path1.size() == truePath1.length) {
assertPath(path1, truePath1);
assertPath(path2, truePath2);
} else {
assertPath(path1, truePath2);
assertPath(path2, truePath1);
}
}
private void assertPath(List<GenCommonBase> path, GenCommonBase[] truePath) {
for (int i = 0; i < path.size(); i++) {
assertEquals("Path contains incorrect element N " + i, truePath[i], path.get(i));
}
}
}