/******************************************************************************* * Copyright (c) 2009, 2010 SAP AG 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: * SAP AG - initial API and implementation ******************************************************************************/ package de.hpi.sam.bp2009.solution.oclToAst.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.query.index.IndexFactory; import org.eclipse.ocl.ParserException; import org.eclipse.ocl.ecore.OCL; import org.eclipse.ocl.ecore.OCL.Helper; import org.eclipse.ocl.ecore.OCLExpression; import org.junit.Test; import com.sap.ocl.oppositefinder.query2.EcoreHelper; import com.sap.ocl.oppositefinder.query2.Query2OppositeEndFinder; import de.hpi.sam.petriNet.PetriNet; import de.hpi.sam.petriNet.PetriNetFactory; import de.hpi.sam.petriNet.PetriNetPackage; import de.hpi.sam.petriNet.Place; import de.hpi.sam.petriNet.Transition; public class TestEcoreHelper { @Test public void testSubclassQuery() { EcoreHelper helper = EcoreHelper.getInstance(); EClass testClass = PetriNetPackage.eINSTANCE.getElement(); Collection<EClass> subclasses = helper.getAllSubclasses(testClass, IndexFactory.getInstance()); assertEquals(4, subclasses.size()); Set<String> foundNames = new HashSet<String>(); Set<String> expectedNames = new HashSet<String>(); expectedNames.addAll(Arrays.asList("Node", "Arc", "Transition", "Place")); for (EClass subclass : subclasses) { foundNames.add(subclass.getName()); } assertEquals(expectedNames, foundNames); } @Test public void testReverseReferenceTraverser() { EcoreHelper helper = EcoreHelper.getInstance(); PetriNet petriNet = PetriNetFactory.eINSTANCE.createPetriNet(); Place place = PetriNetFactory.eINSTANCE.createPlace(); petriNet.getElements().add(place); ResourceSet rs = new ResourceSetImpl(); Resource e = rs.createResource(URI.createURI("http://my.own.resource/something")); e.getContents().add(petriNet); Collection<EObject> result = helper.reverseNavigate(place, (EReference) petriNet.eClass().getEStructuralFeature( PetriNetPackage.PETRI_NET__ELEMENTS), helper.getQueryContext(rs, IndexFactory.getInstance()), rs, IndexFactory.getInstance()); assertEquals(petriNet, result.iterator().next()); } @Test public void testHiddenOppositeTraverser() { EcoreHelper helper = EcoreHelper.getInstance(); Transition transition = PetriNetFactory.eINSTANCE.createTransition(); Place place = PetriNetFactory.eINSTANCE.createPlace(); place.setHiddenOpposite(transition); ResourceSet rs = new ResourceSetImpl(); Resource e = rs.createResource(URI.createURI("http://my.next.resource/somethingElse")); e.getContents().add(place); e.getContents().add(transition); Collection<EObject> result = helper.reverseNavigate(transition, (EReference) place.eClass().getEStructuralFeature( PetriNetPackage.PLACE__HIDDEN_OPPOSITE), helper.getQueryContext(rs, IndexFactory.getInstance()), rs, IndexFactory.getInstance()); assertEquals(place, result.iterator().next()); } @Test public void testHiddenOppositeOclTraversal() throws ParserException { Transition transition = PetriNetFactory.eINSTANCE.createTransition(); Place place = PetriNetFactory.eINSTANCE.createPlace(); place.setHiddenOpposite(transition); ResourceSet rs = new ResourceSetImpl(); Resource e = rs.createResource(URI.createURI("http://my.next.resource/somethingElse")); e.getContents().add(place); e.getContents().add(transition); OCL ocl = org.eclipse.ocl.examples.impactanalyzer.util.OCL.newInstance(Query2OppositeEndFinder.getInstance()); Helper oclHelper = ocl.createOCLHelper(); oclHelper.setContext(PetriNetPackage.eINSTANCE.getTransition()); OCLExpression expr = oclHelper.createQuery("self.transition2Place"); Object result = ocl.evaluate(transition, expr); assertTrue(result instanceof Collection<?>); assertEquals(place, ((Collection<?>) result).iterator().next()); } }