/* * Copyright (c) 2005 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: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.tr; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.internal.bridge.genmodel.DiagramRunTimeModelTransformer; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.tests.setup.DiaDefSetup; public class RunTimeModelTransformerTest extends AbstractMappingTransformerTest { public RunTimeModelTransformerTest(String name) { super(name); } protected DiaDefSetup createDiaDefSetup() { return new DiaDefSetup(){ protected void setupNodeDef(Node nodeDef) { super.setupNodeDef(nodeDef); // RunTimeProperty rtp = DiagramDefinitionFactory.eINSTANCE.createRunTimeProperty(); // rtp.setName("someProp"); // nodeDef.getProperties().add(rtp); // rtp = DiagramDefinitionFactory.eINSTANCE.createRunTimeProperty(); // rtp.setName("prop1"); // nodeDef.getProperties().add(rtp); } }; } public void testRunTimeModelTransform() { DiagramRunTimeModelTransformer drtModelTransformer = new DiagramRunTimeModelTransformer("pack11", "uri://eclipse/gmf/tests"); assertNotNull("Mapping is initialized", getMapping()); drtModelTransformer.transform(getMapping()); EPackage drtModel = drtModelTransformer.getResult(); // make sure there's class for canvas, node and link and that they extend appropriate class from basicDRT EClass c = findEClass(drtModel, getCanvasDef().getName()); assertNotNull("There's no rt model class for canvas definition", c); assertTrue("rt model class for canvas definition should extend appropiate class from basic RT model", checkSuperclass(c, NotationPackage.eINSTANCE.getDiagram())); c = findEClass(drtModel, getNodeDef().getName()); assertNotNull("There's no rt model class for node definition", c); assertTrue("rt model class for node definition should extend appropiate class from basic RT model", checkSuperclass(c, NotationPackage.eINSTANCE.getNode())); doTestRunTimeModelPropertiesTransform(c); c = findEClass(drtModel, getLinkDef().getName()); assertNotNull("There's no rt model class for link definition", c); assertTrue("rt model class for link definition should extend appropiate class from basic RT model", checkSuperclass(c, NotationPackage.eINSTANCE.getEdge())); } private void doTestRunTimeModelPropertiesTransform(EClass nodeRTClass) { EStructuralFeature sf = nodeRTClass.getEStructuralFeature("prop1"); assertNotNull("There should be 'prop1' structural feature in generated diagramNode EClass", sf); assertTrue("StructuralFeature 'prop1' should be attribute", sf instanceof EAttribute); org.eclipse.gmf.runtime.notation.Node rtInstance = (org.eclipse.gmf.runtime.notation.Node) nodeRTClass.getEPackage().getEFactoryInstance().create(nodeRTClass); rtInstance.eSet(sf, "abc"); assertEquals("Not possible to access rtProperty in EMF way", rtInstance.eGet(sf), "abc"); fail("Fix runtime properties in new runtime/notation model"); // assertEquals("Not possible to get rtProperty using our 'generic' API", rtInstance.getProperty("prop1"), "abc"); // assertFalse("[TENTATIVE] Specific RT should not use runTimeProperties", rtInstance.getRunTimeProperties().contains("prop1")); // FIXME make sure properties are persisted // assertNull(rtInstance.getProperty("prop3")); // assertNull(rtInstance.getRunTimeProperties().get("prop1")); // assertFalse(rtInstance.getRunTimeProperties().contains("prop3")); } private static EClass findEClass(EPackage model, String name) { for (TreeIterator<EObject> it = model.eAllContents(); it.hasNext();) { EObject next = it.next(); if (next instanceof EClassifier) { if (name.equals(((EClassifier) next).getName()) && next instanceof EClass) { return (EClass) next; } it.prune(); } } return null; } private static boolean checkSuperclass(EClass eClass, EClass eSuperClass) { return eSuperClass.isSuperTypeOf(eClass) || EcoreUtil.equals(eClass, eSuperClass); } }