/******************************************************************************* * Copyright (c) 2010-2014, Marton Bur, Akos Horvath, Zoltan Ujhelyi, Istvan Rath and Daniel Varro * 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: * Marton Bur - initial API and implementation *******************************************************************************/ package org.eclipse.viatra.examples.uml.tests; import java.util.Arrays; import java.util.Collection; import java.util.Set; import org.eclipse.emf.common.util.URI; 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.viatra.examples.uml.queries.util.EmptyClassQuerySpecification; import org.eclipse.viatra.examples.uml.queries.util.HasPropertyOrOperationQuerySpecification; import org.eclipse.viatra.examples.uml.queries.util.HasPropertyQuerySpecification; import org.eclipse.viatra.query.runtime.api.IQuerySpecification; import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; import org.eclipse.viatra.query.runtime.emf.EMFScope; import org.eclipse.viatra.query.runtime.exception.ViatraQueryException; import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint; import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PDisjunction; import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; import org.eclipse.viatra.query.runtime.matchers.psystem.rewriters.DefaultFlattenCallPredicate; import org.eclipse.viatra.query.runtime.matchers.psystem.rewriters.PQueryFlattener; import org.eclipse.viatra.query.testing.core.base.CompareQueryTester; import org.eclipse.viatra.query.testing.core.base.DisjunctionBasedQuerySpecification; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class FlattenerTest { @Parameters public static Collection<Object[]> querySpecifications() throws ViatraQueryException { return Arrays.asList(new Object[][] { { HasPropertyOrOperationQuerySpecification.instance() }, { HasPropertyQuerySpecification.instance() }, { EmptyClassQuerySpecification.instance() } }); } @Parameter public IQuerySpecification<?> querySpecification; @Test public void compareMatches() throws Exception{ // Load the UML model ResourceSet rs = new ResourceSetImpl(); Resource model = rs.getResource(URI.createPlatformPluginURI("org.eclipse.incquery.examples.uml.evm/testmodels/Testmodel.uml", false), true); // Create an engine ViatraQueryEngine engine = ViatraQueryEngine.on(new EMFScope(model)); // Do the flattening PDisjunction flatDisjunction = flatten(querySpecification.getInternalQueryRepresentation()); // Create a new query specification with the flattened body IQuerySpecification<?> flattenedQuerySpecification = new DisjunctionBasedQuerySpecification(querySpecification, flatDisjunction); CompareQueryTester.assertQueriesEquivalent(engine, querySpecification, flattenedQuerySpecification); } private PDisjunction flatten(PQuery query) throws Exception { PQueryFlattener flattener = new PQueryFlattener(new DefaultFlattenCallPredicate()); PDisjunction flattenedDisjunction = flattener.rewrite(query); return flattenedDisjunction; } /** * Helper method to print the result of a flattening - no matching is done * * @throws Exception */ public static void printDisjunction(PDisjunction flattenedDisjunction) { Set<PBody> bodies = flattenedDisjunction.getBodies(); int i = 0; System.out.println("Variables"); for (PBody pBody : bodies) { System.out.println("Body " + (i++)); Set<PVariable> variables = pBody.getAllVariables(); for (PVariable pVariable : variables) { System.out.println(pVariable.toString()); } } System.out.println("Constraints"); i = 0; for (PBody pBody : bodies) { System.out.println("Body " + (i++)); Set<PConstraint> constraints = pBody.getConstraints(); for (PConstraint pConstraint : constraints) { System.out.println(pConstraint.toString()); } } System.out.println("Exported Parameters:"); for (PBody pBody : bodies) { System.out.println(pBody.getSymbolicParameters()); } } }