diff options
author | Ed Willink | 2016-01-28 13:56:35 +0000 |
---|---|---|
committer | Ed Willink | 2016-02-02 15:51:44 +0000 |
commit | 861fe2727694f73d1479412512ad9e86c6c9d75f (patch) | |
tree | 6cdaa79fb06b7b67a5891a06216ffc3e9e940c4d | |
parent | b31ccaad20743becf6110d1b8d10f18e4d8cd301 (diff) | |
download | org.eclipse.qvtd-861fe2727694f73d1479412512ad9e86c6c9d75f.tar.gz org.eclipse.qvtd-861fe2727694f73d1479412512ad9e86c6c9d75f.tar.xz org.eclipse.qvtd-861fe2727694f73d1479412512ad9e86c6c9d75f.zip |
[486722] Migrate QVTr tests
10 files changed, 832 insertions, 8 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java index b48c4b196..1398632c3 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java @@ -17,7 +17,9 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.ocl.pivot.utilities.XMIUtil; import org.eclipse.qvtd.compiler.internal.etl.mtc.QVTuConfiguration; +import org.eclipse.qvtd.compiler.internal.qvtr2qvtc.QvtrToQvtcTransformation; import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory; @@ -50,10 +52,10 @@ public class QVTrCompilerChain extends AbstractCompilerChain URI qvtctURI = prefixURI.appendFileExtension("ecore.oclas"); Resource cResource = createResource(qvtcURI); Resource qvtcTraceResource = createResource(qvtctURI); -//FIXME QvtrToQvtc t = new QvtrToQvtc(environmentFactory, rResource, cResource, qvtcTraceResource); -// t.prepare(); -// t.execute(); - // t.saveTrace(qvtcTraceResource, XMIUtil.createSaveOptions()); + QvtrToQvtcTransformation t = new QvtrToQvtcTransformation(environmentFactory, rResource, cResource, qvtcTraceResource); + t.prepare(); + t.execute(); +// t.saveTrace(qvtcTraceResource, XMIUtil.createSaveOptions()); assertNoResourceErrors("Trace save", qvtcTraceResource); // t.saveCore(cResource, XMIUtil.createSaveOptions()); assertNoResourceErrors("Core save", cResource); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/QVTr2QVTcRelations.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/QVTr2QVTcRelations.java index 7fe4528e6..e54a35bb1 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/QVTr2QVTcRelations.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/QVTr2QVTcRelations.java @@ -1127,6 +1127,9 @@ public class QVTr2QVTcRelations { ve1.setType(tcv.getType()); a.setSlotExpression(ve1); Property tp = getProperty(dv.getName(), tcv.getType()); + if (tp == null) { + tp = getProperty(dv.getName(), tcv.getType()); + } assert tp != null : "Property " + dv.getName() + ". not found in trace class " + tcv.getType().getName(); a.setTargetProperty(tp); ve2.setReferredVariable(mdv); diff --git a/tests/org.eclipse.qvtd.build.qvtrtoqvtc.tests/src/org/eclipse/qvtd/build/qvtrtoqvtc/tests/QvtrToQvtcTests.java b/tests/org.eclipse.qvtd.build.qvtrtoqvtc.tests/src/org/eclipse/qvtd/build/qvtrtoqvtc/tests/QvtrToQvtcTests.java index 5f7feb370..ab40c4f7f 100644 --- a/tests/org.eclipse.qvtd.build.qvtrtoqvtc.tests/src/org/eclipse/qvtd/build/qvtrtoqvtc/tests/QvtrToQvtcTests.java +++ b/tests/org.eclipse.qvtd.build.qvtrtoqvtc.tests/src/org/eclipse/qvtd/build/qvtrtoqvtc/tests/QvtrToQvtcTests.java @@ -26,7 +26,7 @@ import org.junit.Test; public class QvtrToQvtcTests extends LoadTestCase { - private static URI TESTS_BASE_URI = URI.createPlatformResourceURI("/org.eclipse.qvtd.build.qvtrtoqvtc.tests/bin/org/eclipse/qvtd/build/qvtrtoqvtc/tests/", true); + private static URI TESTS_BASE_URI = URI.createPlatformResourceURI("/org.eclipse.qvtd.build.qvtrtoqvtc.tests/bin/org/eclipse/qvtd/build/qvtrtoqvtc/tests", true); /* (non-Javadoc) * @see org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase#setUp() diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/META-INF/MANIFEST.MF index 034e4a193..9f2737fea 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/META-INF/MANIFEST.MF +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/META-INF/MANIFEST.MF @@ -7,8 +7,12 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: %providerName Bundle-Localization: plugin Require-Bundle: org.eclipse.qvtd.xtext.qvtbase.tests;bundle-version="[0.13.0,0.14.0)";visibility:=reexport, - org.eclipse.qvtd.xtext.qvtrelation;bundle-version="[0.13.0,0.14.0)";visibility:=reexport, + org.eclipse.qvtd.xtext.qvtrelation.ui;bundle-version="[0.13.0,0.14.0)";visibility:=reexport, org.eclipse.qvt;bundle-version="[0.13.0,0.14.0)", org.eclipse.qvtd.examples.qvtrelation.modelmorf;bundle-version="[0.13.0,0.14.0)", - org.eclipse.qvtd.examples.qvtrelation.reltocore;bundle-version="[0.13.0,0.14.0)" + org.eclipse.qvtd.examples.qvtrelation.reltocore;bundle-version="[0.13.0,0.14.0)", + org.eclipse.qvtd.pivot.qvtimperative;bundle-version="[0.13.0,0.14.0)", + org.eclipse.qvtd.compiler;bundle-version="[0.13.0,0.14.0)", + org.eclipse.qvtd.codegen;bundle-version="[0.13.0,0.14.0)", + org.eclipse.qvtd.xtext.qvtimperative.tests;bundle-version="[0.13.0,0.14.0)" Export-Package: org.eclipse.qvtd.xtext.qvtrelation.tests diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/AllQVTrelationTests.java b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/AllQVTrelationTests.java index 4808801a1..7a8afcf68 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/AllQVTrelationTests.java +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/AllQVTrelationTests.java @@ -14,6 +14,8 @@ package org.eclipse.qvtd.xtext.qvtrelation.tests; import java.util.Arrays; +import org.eclipse.emf.common.EMFPlugin; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -30,7 +32,7 @@ public class AllQVTrelationTests extends TestCase } public static Test suite() { - TestSuite result = new TestSuite("QVTr Editor Support"); + TestSuite result = new TestSuite("All QVTrelation Tests"); result.addTestSuite(LoadTests.class); // if (EMFPlugin.IS_ECLIPSE_RUNNING) { // result.addTestSuite(EditorTests.class); @@ -38,6 +40,9 @@ public class AllQVTrelationTests extends TestCase // else { // Bug 370824 Bug 371394 causes this to fail on Hudson // result.addTestSuite(UsageTests.class); // } + if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME should work as plugin test too + result.addTestSuite(QVTrCompilerTests.class); + } return result; } diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java new file mode 100644 index 000000000..59be47075 --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java @@ -0,0 +1,296 @@ +/******************************************************************************* + * Copyright (c) 2012, 2016 Willink Transformations 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: + * E.D.Willink - initial API and implementation + *******************************************************************************/ +package org.eclipse.qvtd.xtext.qvtrelation.tests; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.eclipse.emf.codegen.ecore.genmodel.GenModel; +import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +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.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.ocl.examples.codegen.dynamic.OCL2JavaFileObject; +import org.eclipse.ocl.pivot.evaluation.tx.Transformer; +import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal; +import org.eclipse.ocl.pivot.model.OCLstdlib; +import org.eclipse.ocl.pivot.utilities.ClassUtil; +import org.eclipse.ocl.xtext.base.services.BaseLinkingService; +import org.eclipse.qvtd.codegen.qvti.QVTiCodeGenOptions; +import org.eclipse.qvtd.codegen.qvti.java.QVTiCodeGenerator; +import org.eclipse.qvtd.compiler.AbstractCompilerChain; +import org.eclipse.qvtd.compiler.QVTrCompilerChain; +import org.eclipse.qvtd.pivot.qvtbase.Transformation; +import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor; +import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory; +import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor; +import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationExecutor; +import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative; +import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; +import org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase; +import org.eclipse.qvtd.xtext.qvtbase.tests.utilities.TestsXMLUtil; +import org.eclipse.qvtd.xtext.qvtimperative.tests.ModelNormalizer; +import org.eclipse.qvtd.xtext.qvtimperative.tests.QVTiTestUtil; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import junit.framework.TestCase; + +/** + * Tests that QVTc files can be compiled and executed. + */ +public class QVTrCompilerTests extends LoadTestCase +{ + private static URI TESTS_BASE_URI = URI.createPlatformResourceURI("/org.eclipse.qvtd.xtext.qvtrelation.tests/bin/org/eclipse/qvtd/xtext/qvtrelation/tests", true); + + protected static class MyQVT extends QVTimperative + { + protected final @NonNull String testFolderName; + protected final @NonNull URI testFolderURI; + protected final @NonNull URI samplesBaseUri; + private QVTrCompilerChain compilerChain = null; + private BasicQVTiExecutor interpretedExecutor = null; + private QVTiTransformationExecutor generatedExecutor = null; + private Set<@NonNull String> nsURIs = new HashSet<@NonNull String>(); + + public MyQVT(@NonNull String testFolderName, @NonNull EPackage... eInstances) { + super(new QVTiEnvironmentFactory(getProjectMap(), null)); + this.testFolderName = testFolderName; + this.testFolderURI = TESTS_BASE_URI.appendSegment(testFolderName); + this.samplesBaseUri = testFolderURI.appendSegment("samples"); + // + // Explicitly install the eInstances that would normally make it into the ProjectMap from extension point registrations. + // Test models are not registered via extension point so we have to do this manually. + // + ResourceSetImpl resourceSet = (ResourceSetImpl) getResourceSet(); + for (EPackage eInstance : eInstances) { + nsURIs.add(eInstance.getNsURI()); + resourceSet.getURIResourceMap().put(testFolderURI.appendSegment(eInstance.getName()+".ecore"), eInstance.eResource()); + } + } + + public @NonNull Transformation compileTransformation(@NonNull String testFileName, @NonNull String outputName) throws Exception { + Map<@NonNull String, @NonNull Map<AbstractCompilerChain.Key<?>, Object>> options = new HashMap<@NonNull String, @NonNull Map<AbstractCompilerChain.Key<?>, Object>>(); + compilerChain = new QVTrCompilerChain(getEnvironmentFactory(), testFolderURI.appendSegment(testFileName), options); + compilerChain.setOption(AbstractCompilerChain.DEFAULT_STEP, AbstractCompilerChain.SAVE_OPTIONS_KEY, TestsXMLUtil.defaultSavingOptions); + return compilerChain.compile(outputName); + } + + public @NonNull Class<? extends Transformer> createGeneratedClass(@NonNull Transformation asTransformation, @NonNull String @NonNull... genModelFiles) throws Exception { + ResourceSet resourceSet = getResourceSet(); + resourceSet.getPackageRegistry().put(GenModelPackage.eNS_URI, GenModelPackage.eINSTANCE); + for (String genModelFile : genModelFiles) { + URI genModelURI = testFolderURI.appendSegment(genModelFile); + loadGenModel(genModelURI); + } + QVTiCodeGenerator cg = new QVTiCodeGenerator(getEnvironmentFactory(), asTransformation); + QVTiCodeGenOptions options = cg.getOptions(); + options.setUseNullAnnotations(true); + options.setPackagePrefix("cg"); + cg.generateClassFile(); + cg.saveSourceFile("../org.eclipse.qvtd.xtext.qvtcore.tests/test-gen/"); + File explicitClassPath = new File("../org.eclipse.qvtd.xtext.qvtcore.tests/bin"); + String qualifiedClassName = cg.getQualifiedName(); + String javaCodeSource = cg.generateClassFile(); + OCL2JavaFileObject.saveClass(explicitClassPath.toString(), qualifiedClassName, javaCodeSource); + @SuppressWarnings("unchecked") + Class<? extends Transformer> txClass = (Class<? extends Transformer>) OCL2JavaFileObject.loadExplicitClass(explicitClassPath, qualifiedClassName); + if (txClass == null) { + TestCase.fail("Failed to compile transformation"); + throw new UnsupportedOperationException(); + } + return txClass; + } + + public void createGeneratedExecutor(@NonNull Transformation asTransformation, @NonNull String @NonNull... genModelFiles) throws Exception { + Class<? extends Transformer> txClass = createGeneratedClass(asTransformation, genModelFiles); + createGeneratedExecutor(txClass); + } + + public QVTiTransformationExecutor createGeneratedExecutor(Class<? extends Transformer> txClass) throws Exception { + return generatedExecutor = new QVTiTransformationExecutor(getEnvironmentFactory(), txClass); + } + + public @NonNull BasicQVTiExecutor createInterpretedExecutor(@NonNull Transformation asTransformation) throws Exception { + interpretedExecutor = new QVTiIncrementalExecutor(getEnvironmentFactory(), asTransformation, QVTiIncrementalExecutor.Mode.LAZY); + return interpretedExecutor; + } + + public void createModel(@NonNull String modelName, @NonNull String modelFile) { + URI modelURI = samplesBaseUri.appendSegment(modelFile); + interpretedExecutor.createModel(modelName, modelURI, null); + } + + @Override + public synchronized void dispose() { + super.dispose(); + if (interpretedExecutor != null) { + interpretedExecutor.dispose(); + } + if (compilerChain != null) { + compilerChain.dispose(); + } + /** + * Remove the eInstances from the EPackage.Registry.INSTANCE so that global registrations from the calling test + * do not confuse subsequent tests that may want to use dynamic models. + */ + for (String nsURI : nsURIs) { + EPackage.Registry.INSTANCE.remove(nsURI); + } + } + + public void executeTransformation() throws Exception { + if (interpretedExecutor != null) { + interpretedExecutor.execute(); + interpretedExecutor.saveModels(TestsXMLUtil.defaultSavingOptions); + } + else { + generatedExecutor.getTransformer().run(); + } + } + + @Override + public @NonNull QVTiEnvironmentFactory getEnvironmentFactory() { + return (QVTiEnvironmentFactory) super.getEnvironmentFactory(); + } + + public @NonNull Map<Object, Object> getSaveOptions() { + return TestsXMLUtil.defaultSavingOptions; + } + + private void loadGenModel(@NonNull URI genModelURI) { + ResourceSet resourceSet = getResourceSet(); + MetamodelManagerInternal metamodelManager = getMetamodelManager(); + Resource csGenResource = resourceSet.getResource(genModelURI, true); + for (EObject eObject : csGenResource.getContents()) { + if (eObject instanceof GenModel) { + GenModel genModel = (GenModel)eObject; + genModel.reconcile(); + metamodelManager.addGenModel(genModel); + } + } + } + + public void loadInput(@NonNull String modelName, @NonNull String modelFile) { + URI modelURI = samplesBaseUri.appendSegment(modelFile); + if (interpretedExecutor != null) { + interpretedExecutor.loadModel(modelName, modelURI); + } + else { + Resource inputResource = getResourceSet().getResource(modelURI, true); + generatedExecutor.getTransformer().addRootObjects(modelName, ClassUtil.nonNullState(inputResource.getContents())); + } + } + + public void saveOutput(@NonNull String modelName, @NonNull String modelFile, @Nullable String expectedFile, @Nullable ModelNormalizer normalizer) throws IOException, InterruptedException { + URI modelURI = samplesBaseUri.appendSegment(modelFile); + URI referenceModelURI = samplesBaseUri.appendSegment(expectedFile); + ResourceSet resourceSet = getResourceSet(); + Resource outputResource; + if (interpretedExecutor != null) { + outputResource = interpretedExecutor.saveModel(modelName, modelURI, null, getSaveOptions()); + } + else { + outputResource = resourceSet.createResource(modelURI); + outputResource.getContents().addAll(generatedExecutor.getTransformer().getRootObjects(modelName)); + outputResource.save(getSaveOptions()); + } + Resource referenceResource = resourceSet.getResource(referenceModelURI, true); + assert referenceResource != null; + if (normalizer != null) { + normalizer.normalize(referenceResource); + normalizer.normalize(outputResource); + } + assertSameModel(referenceResource, outputResource); + } + } + + /* (non-Javadoc) + * @see org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase#setUp() + */ + @Before + public void setUp() throws Exception { + + BaseLinkingService.DEBUG_RETRY.setState(true); + super.setUp(); + OCLstdlib.install(); + QVTrTestUtil.doQVTrelationSetup(); + QVTiTestUtil.doQVTimperativeSetup(); +// QVTcorePivotStandaloneSetup.doSetup(); +// QVTimperativePivotStandaloneSetup.doSetup(); + } + + /* (non-Javadoc) + * @see org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + } + + @Test + public void testQVTrCompiler_SeqToStm() throws Exception { +// AbstractTransformer.INVOCATIONS.setState(true); + MyQVT myQVT = new MyQVT("seq2stm"); +// myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true); + try { + Transformation asTransformation = myQVT.compileTransformation("SeqToStm", "stm"); + myQVT.createInterpretedExecutor(asTransformation); + myQVT.loadInput("seqDgm", "Families.xmi"); + myQVT.createModel(QVTimperativeUtil.MIDDLE_DOMAIN_NAME, "Families2Persons_trace.xmi"); + myQVT.createModel("stm", "Persons_Interpreted.xmi"); + myQVT.executeTransformation(); + myQVT.saveOutput("stm", "Persons_Interpreted.xmi", "Persons_expected.xmi", null); + } + finally { + myQVT.dispose(); + } + } + +/* @Test + public void testQVTrCompiler_Families2Persons_CG() throws Exception { +// AbstractTransformer.INVOCATIONS.setState(true); +// Scheduler.EDGE_ORDER.setState(true); +// Scheduler.REGION_DEPTH.setState(true); +// Scheduler.REGION_ORDER.setState(true); +// Scheduler.REGION_TRAVERSAL.setState(true); +// QVTs2QVTiVisitor.POLLED_PROPERTIES.setState(true); + MyQVT myQVT = new MyQVT("families2persons", Families2PersonsPackage.eINSTANCE, FamiliesPackage.eINSTANCE, PersonsPackage.eINSTANCE); +// myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true); + try { + Transformation asTransformation = myQVT.compileTransformation("Families2Persons", "person"); + Class<? extends Transformer> txClass = myQVT.createGeneratedClass(asTransformation, "Families2Persons.genmodel"); + // + myQVT.createGeneratedExecutor(txClass); + myQVT.loadInput("family", "FamiliesBig.xmi"); + myQVT.executeTransformation(); + myQVT.saveOutput("person", "PersonsBig_CG.xmi", "PersonsBig_expected.xmi", Families2PersonsNormalizer.INSTANCE); + // + myQVT.createGeneratedExecutor(txClass); + myQVT.loadInput("family", "Families.xmi"); + myQVT.executeTransformation(); + myQVT.saveOutput("person", "Persons_CG.xmi", "Persons_expected.xmi", Families2PersonsNormalizer.INSTANCE); + } + finally { + myQVT.dispose(); + } + }*/ +} diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/.gitignore b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/.gitignore new file mode 100644 index 000000000..d231be9c4 --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/.gitignore @@ -0,0 +1,5 @@ +/SeqToStm.ecore.oclas +/SeqToStm.qvtcas +/SeqToStm.qvtm.qvtcas +/SeqToStm.qvtp.qvtias +/SeqToStm.qvtu.qvtcas diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/SeqMM.ecore b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/SeqMM.ecore new file mode 100644 index 000000000..e2cfe0bb3 --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/SeqMM.ecore @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="SeqMM" nsURI="SeqMM">
+ <eClassifiers xsi:type="ecore:EClass" name="Dummy">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="hasInteraction" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//Interaction" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="containedState" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//State" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Interaction">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="lifeline" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//LifeLine" containment="true" eOpposite="#//LifeLine/interaction"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="message" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//Message" containment="true" eOpposite="#//Message/interaction"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="LifeLine">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="msgEvent" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//MessageEvent" containment="true"
+ eOpposite="#//MessageEvent/lifeline"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="state" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//State" eOpposite="#//State/lifeline"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="interaction" ordered="false"
+ lowerBound="1" eType="#//Interaction" eOpposite="#//Interaction/lifeline"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Message">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="messageId" ordered="false"
+ lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="interaction" ordered="false"
+ lowerBound="1" eType="#//Interaction" eOpposite="#//Interaction/message"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="event" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//MessageEvent" eOpposite="#//MessageEvent/message"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="State">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="messageevent" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//MessageEvent" eOpposite="#//MessageEvent/state"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="lifeline" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//LifeLine" eOpposite="#//LifeLine/state"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Event"/>
+ <eClassifiers xsi:type="ecore:EClass" name="MessageEvent" eSuperTypes="#//Event">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" ordered="false" lowerBound="1"
+ eType="#//MessageEventType" defaultValueLiteral="Send"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="prev" ordered="false" lowerBound="1"
+ eType="#//MessageEvent"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="next" ordered="false" lowerBound="1"
+ eType="#//MessageEvent"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="message" ordered="false"
+ lowerBound="1" eType="#//Message" eOpposite="#//Message/event"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="lifeline" ordered="false"
+ lowerBound="1" eType="#//LifeLine" eOpposite="#//LifeLine/msgEvent"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="state" ordered="false"
+ lowerBound="1" eType="#//State" eOpposite="#//State/messageevent"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EEnum" name="MessageEventType">
+ <eLiterals name="Send"/>
+ <eLiterals name="Receive"/>
+ </eClassifiers>
+</ecore:EPackage>
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/SeqToStm.qvtras b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/SeqToStm.qvtras new file mode 100644 index 000000000..94b610508 --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/SeqToStm.qvtras @@ -0,0 +1,385 @@ +<?xml version="1.0" encoding="UTF-8"?> +<qvtr:RelationModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:pivot="http://www.eclipse.org/ocl/2015/Pivot" xmlns:qvtr="http://www.eclipse.org/qvt/2015/QVTrelation" + xmlns:qvtt="http://www.eclipse.org/qvt/2015/QVTtemplate" xsi:schemaLocation="http://www.eclipse.org/ocl/2015/Pivot java://org.eclipse.ocl.pivot.PivotPackage http://www.eclipse.org/qvt/2015/QVTrelation java://org.eclipse.qvtd.pivot.qvtrelation.QVTrelationPackage http://www.eclipse.org/qvt/2015/QVTtemplate java://org.eclipse.qvtd.pivot.qvttemplate.QVTtemplatePackage" + name="SeqToStm.qvtr" externalURI="platform:/resource/org.eclipse.qvtd.build.qvtrtoqvtc.tests/src/org/eclipse/qvtd/build/qvtrtoqvtc/tests/seqtostm/SeqToStm.qvtr"> + <ownedComments body="*****************************************************************************
Copyright (c) 2007,2008 Tata Consultancy Services 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:
TCS - initial implementation for ModelMorf
E.D.Willink - alignment with evolved specification
*****************************************************************************"/> + <ownedImports name="SeqMM" importedNamespace="pivot:Package SeqMM.ecore.oclas#P.SeqMM"> + <ownedComments body="*****************************************************************************
Copyright (c) 2007,2008 Tata Consultancy Services 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:
TCS - initial implementation for ModelMorf
E.D.Willink - alignment with evolved specification
*****************************************************************************"/> + </ownedImports> + <ownedImports name="StmcMM" importedNamespace="pivot:Package StmcMM.ecore.oclas#P.StmcMM"/> + <ownedPackages xmi:id="P." name=""> + <ownedClasses xsi:type="qvtr:RelationalTransformation" xmi:id="T..SeqToStm" name="SeqToStm" + superClasses="http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.OclElement"> + <modelParameter xmi:id="qT..SeqToStm.seqDgm" name="seqDgm" usedPackage="SeqMM.ecore.oclas#P.SeqMM"/> + <modelParameter xmi:id="qT..SeqToStm.stm" name="stm" usedPackage="StmcMM.ecore.oclas#P.StmcMM"/> + <rule xsi:type="qvtr:Relation" name="InteractionToStateMachine" isTopLevel="true"> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.InteractionToStateMachine.seqDgm" + isCheckable="true" isEnforceable="false" typedModel="#qT..SeqToStm.seqDgm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@variable.1"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@variable.1" + referredClass="SeqMM.ecore.oclas#T.SeqMM.Interaction"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.Interaction.name"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@variable.0"/> + </part> + </templateExpression> + </pattern> + </domain> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.InteractionToStateMachine.stm" + isCheckable="true" isEnforceable="true" typedModel="#qT..SeqToStm.stm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@variable.2"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@variable.2" + referredClass="StmcMM.ecore.oclas#T.StmcMM.StateMachine"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.StateMachine.name"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.0/@variable.0"/> + </part> + </templateExpression> + </pattern> + </domain> + <variable name="sn" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> + <variable name="i" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction"/> + <variable name="s" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine"/> + </rule> + <rule xsi:type="qvtr:Relation" name="StateToState" isTopLevel="true"> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.StateToState.seqDgm" + isCheckable="true" isEnforceable="false" typedModel="#qT..SeqToStm.seqDgm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.1"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.1" + referredClass="SeqMM.ecore.oclas#T.SeqMM.State"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.State.name"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.0"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.State.lifeline"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.LifeLine" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.2" + referredClass="SeqMM.ecore.oclas#T.SeqMM.LifeLine"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.LifeLine.interaction"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.3" + referredClass="SeqMM.ecore.oclas#T.SeqMM.Interaction"/> + </part> + </value> + </part> + </templateExpression> + </pattern> + </domain> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.StateToState.stm" + isCheckable="true" isEnforceable="true" typedModel="#qT..SeqToStm.stm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.4"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.4" + referredClass="StmcMM.ecore.oclas#T.StmcMM.State"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.State.name"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.0"/> + </part> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.State.owner"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.5" + referredClass="StmcMM.ecore.oclas#T.StmcMM.StateMachine"/> + </part> + </templateExpression> + </pattern> + </domain> + <variable name="sn" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> + <variable name="st1" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State"/> + <variable name="l" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.LifeLine"/> + <variable name="i" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction"/> + <variable name="st2" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State"/> + <variable name="s" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine"/> + <when> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.0"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.3"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.1/@variable.5"/> + </conditionExpression> + </predicate> + </when> + </rule> + <rule xsi:type="qvtr:Relation" name="MessageToTransition" isTopLevel="true"> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.MessageToTransition.seqDgm" + isCheckable="true" isEnforceable="false" typedModel="#qT..SeqToStm.seqDgm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.1"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.1" + referredClass="SeqMM.ecore.oclas#T.SeqMM.Message"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.Message.messageId"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.0"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.Message.event"> + <value xsi:type="qvtt:CollectionTemplateExp" type="#//@ownedPackages.1/@ownedClasses.0" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.2" + referredCollectionType="http://www.eclipse.org/ocl/2015/Orphanage#//@ownedClasses.30" + rest="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.7"> + <member xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.3" + referredClass="SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.type"> + <value xsi:type="pivot:EnumLiteralExp" type="pivot:Enumeration SeqMM.ecore.oclas#T.SeqMM.MessageEventType" + referredLiteral="SeqMM.ecore.oclas#//@ownedPackages.0/@ownedClasses.7/@ownedLiterals.0"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.state"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.4" + referredClass="SeqMM.ecore.oclas#T.SeqMM.State"/> + </part> + </member> + <member xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.5" + referredClass="SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.type"> + <value xsi:type="pivot:EnumLiteralExp" type="pivot:Enumeration SeqMM.ecore.oclas#T.SeqMM.MessageEventType" + referredLiteral="SeqMM.ecore.oclas#//@ownedPackages.0/@ownedClasses.7/@ownedLiterals.1"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.state"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.6" + referredClass="SeqMM.ecore.oclas#T.SeqMM.State"/> + </part> + </member> + </value> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.Message.interaction"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.8" + referredClass="SeqMM.ecore.oclas#T.SeqMM.Interaction"/> + </part> + </templateExpression> + </pattern> + </domain> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.MessageToTransition.stm" + isCheckable="true" isEnforceable="true" typedModel="#qT..SeqToStm.stm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.9"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.9" + referredClass="StmcMM.ecore.oclas#T.StmcMM.Transition"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Transition.name"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.0"/> + </part> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Transition.fromState"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.10" + referredClass="StmcMM.ecore.oclas#T.StmcMM.State"/> + </part> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Transition.toState"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.11" + referredClass="StmcMM.ecore.oclas#T.StmcMM.State"/> + </part> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Transition.action"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.SendMsg" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.12" + referredClass="StmcMM.ecore.oclas#T.StmcMM.SendMsg"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.SendMsg.message"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Message" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.13" + referredClass="StmcMM.ecore.oclas#T.StmcMM.Message"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Message.messageId"> + <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.0"/> + </part> + </value> + </part> + </value> + </part> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Transition.owner"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.14" + referredClass="StmcMM.ecore.oclas#T.StmcMM.StateMachine"/> + </part> + </templateExpression> + </pattern> + </domain> + <variable name="mid" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> + <variable name="m1" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message"/> + <variable name="eSet" type="#//@ownedPackages.1/@ownedClasses.0"/> + <variable name="send" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"/> + <variable name="ist1" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State"/> + <variable name="receive" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"/> + <variable name="ist2" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State"/> + <variable isImplicit="true"/> + <variable name="i" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction"/> + <variable name="tr" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition"/> + <variable name="fst" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State"/> + <variable name="tst" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State"/> + <variable name="sm" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.SendMsg"/> + <variable name="m2" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Message"/> + <variable name="s" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine"/> + <when> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.0"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Interaction" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.8"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.StateMachine" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.14"/> + </conditionExpression> + </predicate> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.1"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.4"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.10"/> + </conditionExpression> + </predicate> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.1"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.6"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.2/@variable.11"/> + </conditionExpression> + </predicate> + </when> + </rule> + <rule xsi:type="qvtr:Relation" name="MessageSequenceToTransitionSequence" isTopLevel="true"> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.MessageSequenceToTransitionSequence.seqDgm" + isCheckable="true" isEnforceable="false" typedModel="#qT..SeqToStm.seqDgm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.0"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.0" + referredClass="SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.type"> + <value xsi:type="pivot:EnumLiteralExp" type="pivot:Enumeration SeqMM.ecore.oclas#T.SeqMM.MessageEventType" + referredLiteral="SeqMM.ecore.oclas#//@ownedPackages.0/@ownedClasses.7/@ownedLiterals.1"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.message"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.1" + referredClass="SeqMM.ecore.oclas#T.SeqMM.Message"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.state"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.2" + referredClass="SeqMM.ecore.oclas#T.SeqMM.State"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.next"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.3" + referredClass="SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.type"> + <value xsi:type="pivot:EnumLiteralExp" type="pivot:Enumeration SeqMM.ecore.oclas#T.SeqMM.MessageEventType" + referredLiteral="SeqMM.ecore.oclas#//@ownedPackages.0/@ownedClasses.7/@ownedLiterals.0"/> + </part> + <part referredProperty="SeqMM.ecore.oclas#p.SeqMM.MessageEvent.message"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.4" + referredClass="SeqMM.ecore.oclas#T.SeqMM.Message"/> + </part> + </value> + </part> + </templateExpression> + </pattern> + </domain> + <domain xsi:type="qvtr:RelationDomain" xmi:id="qD..SeqToStm.MessageSequenceToTransitionSequence.stm" + isCheckable="true" isEnforceable="true" typedModel="#qT..SeqToStm.stm" + rootVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.5"> + <pattern> + <templateExpression xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.5" + referredClass="StmcMM.ecore.oclas#T.StmcMM.Transition"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.Transition.toState"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.6" + referredClass="StmcMM.ecore.oclas#T.StmcMM.State"> + <part referredProperty="StmcMM.ecore.oclas#p.StmcMM.State.outTransition"> + <value xsi:type="qvtt:ObjectTemplateExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition" + bindsTo="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.7" + referredClass="StmcMM.ecore.oclas#T.StmcMM.Transition"/> + </part> + </value> + </part> + </templateExpression> + </pattern> + </domain> + <variable name="ev1" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"/> + <variable name="m1" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message"/> + <variable name="est" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State"/> + <variable name="ev2" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"/> + <variable name="m2" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message"/> + <variable name="tr1" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition"/> + <variable name="tst" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State"/> + <variable name="tr2" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition"/> + <when> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.1"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.State" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.2"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.State" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.6"/> + </conditionExpression> + </predicate> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.2"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.1"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.5"/> + </conditionExpression> + </predicate> + <predicate> + <conditionExpression xsi:type="qvtr:RelationCallExp" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#Boolean" + referredRelation="#//@ownedPackages.0/@ownedClasses.0/@rule.2"> + <argument xsi:type="pivot:VariableExp" type="pivot:Class SeqMM.ecore.oclas#T.SeqMM.Message" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.4"/> + <argument xsi:type="pivot:VariableExp" type="pivot:Class StmcMM.ecore.oclas#T.StmcMM.Transition" + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.3/@variable.7"/> + </conditionExpression> + </predicate> + </when> + </rule> + <ownedKey identifies="StmcMM.ecore.oclas#T.StmcMM.StateMachine" part="StmcMM.ecore.oclas#p.StmcMM.StateMachine.name"/> + <ownedKey identifies="StmcMM.ecore.oclas#T.StmcMM.State" part="StmcMM.ecore.oclas#p.StmcMM.State.name StmcMM.ecore.oclas#p.StmcMM.State.owner"/> + <ownedKey identifies="StmcMM.ecore.oclas#T.StmcMM.Transition" part="StmcMM.ecore.oclas#p.StmcMM.Transition.name StmcMM.ecore.oclas#p.StmcMM.Transition.owner StmcMM.ecore.oclas#p.StmcMM.Transition.fromState StmcMM.ecore.oclas#p.StmcMM.Transition.toState"/> + <ownedKey identifies="StmcMM.ecore.oclas#T.StmcMM.SendMsg" part="StmcMM.ecore.oclas#p.StmcMM.SendMsg.message"/> + <ownedKey identifies="StmcMM.ecore.oclas#T.StmcMM.Message" part="StmcMM.ecore.oclas#p.StmcMM.Message.messageId"/> + </ownedClasses> + </ownedPackages> + <ownedPackages xmi:id="P.$$" name="$$" URI="http://www.eclipse.org/ocl/2015/Orphanage" + nsPrefix="orphanage"> + <ownedClasses xsi:type="pivot:SetType" name="Set" superClasses="#//@ownedPackages.1/@ownedClasses.1" + elementType="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <ownedBindings> + <ownedSubstitutions actual="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + formal="http://www.eclipse.org/ocl/2015/Library.oclas#t.ocl..SetT"/> + </ownedBindings> + </ownedClasses> + <ownedClasses xsi:type="pivot:CollectionType" name="UniqueCollection" superClasses="#//@ownedPackages.1/@ownedClasses.2" + elementType="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <ownedBindings> + <ownedSubstitutions actual="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + formal="http://www.eclipse.org/ocl/2015/Library.oclas#t.ocl..UniqueCollectionT"/> + </ownedBindings> + </ownedClasses> + <ownedClasses xsi:type="pivot:CollectionType" name="Collection" superClasses="http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.OclAny" + elementType="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent"> + <ownedBindings> + <ownedSubstitutions actual="pivot:Class SeqMM.ecore.oclas#T.SeqMM.MessageEvent" + formal="http://www.eclipse.org/ocl/2015/Library.oclas#t.ocl..CollectionT"/> + </ownedBindings> + </ownedClasses> + </ownedPackages> +</qvtr:RelationModel> diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/StmcMM.ecore b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/StmcMM.ecore new file mode 100644 index 000000000..a9cbfd565 --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/seq2stm/StmcMM.ecore @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="StmcMM" nsURI="StmcMM">
+ <eClassifiers xsi:type="ecore:EClass" name="Dummy">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="containsStateMachine" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//StateMachine" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="containsMessage" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//Message" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="StateMachine">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="state" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//State" containment="true" eOpposite="#//State/owner"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="transition" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//Transition" containment="true" eOpposite="#//Transition/owner"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="State">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false"
+ lowerBound="1" eType="#//StateMachine" eOpposite="#//StateMachine/state"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="inTransition" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//Transition" eOpposite="#//Transition/toState"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="outTransition" ordered="false"
+ lowerBound="1" upperBound="-1" eType="#//Transition" eOpposite="#//Transition/fromState"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Transition">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="guard" ordered="false"
+ lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false"
+ lowerBound="1" eType="#//StateMachine" eOpposite="#//StateMachine/transition"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="toState" ordered="false"
+ lowerBound="1" eType="#//State" eOpposite="#//State/inTransition"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="fromState" ordered="false"
+ lowerBound="1" eType="#//State" eOpposite="#//State/outTransition"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="trigger" ordered="false"
+ lowerBound="1" eType="#//Event" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="action" ordered="false"
+ lowerBound="1" eType="#//Action" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Event">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Action">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Message">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="messageId" ordered="false"
+ lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="SendMsg" eSuperTypes="#//Action">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="message" ordered="false"
+ lowerBound="1" eType="#//Message"/>
+ </eClassifiers>
+</ecore:EPackage>
|