blob: 81507aa54510d7ccc33e7fe1e1aa11ef9f3d7d3e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 20187 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.umlx.tests;
import java.io.IOException;
import org.eclipse.emf.common.EMFPlugin;
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.examples.codegen.dynamic.JavaFileUtil;
import org.eclipse.ocl.pivot.internal.resource.ProjectMap;
import org.eclipse.ocl.pivot.model.OCLstdlib;
import org.eclipse.ocl.pivot.resource.ProjectManager;
import org.eclipse.ocl.xtext.base.services.BaseLinkingService;
import org.eclipse.qvtd.compiler.CompilerOptions;
import org.eclipse.qvtd.compiler.internal.qvtm2qvts.QVTm2QVTs;
import org.eclipse.qvtd.compiler.internal.qvtm2qvts.ScheduleManager;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.merger.EarlyMerger;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.merger.LateConsumerMerger;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
import org.eclipse.qvtd.pivot.qvtschedule.impl.MicroMappingRegionImpl;
import org.eclipse.qvtd.pivot.qvtschedule.impl.RuleRegionImpl;
import org.eclipse.qvtd.runtime.evaluation.Transformer;
import org.eclipse.qvtd.umlx.compiler.UMLXCompilerChain;
import org.eclipse.qvtd.umlx.utilities.UMLXStandaloneSetup;
import org.eclipse.qvtd.xtext.qvtbase.tests.AbstractTestQVT;
import org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase;
import org.eclipse.qvtd.xtext.qvtbase.tests.utilities.XtextCompilerUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Tests that UMLX files can be compiled and executed.
*/
public class UMLXCompilerTests extends LoadTestCase
{
protected class MyQVT extends AbstractTestQVT
{
protected class InstrumentedCompilerChain extends UMLXCompilerChain
{
protected InstrumentedCompilerChain(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI txURI, @NonNull URI prefixURI, @Nullable CompilerOptions options) {
super(environmentFactory, txURI, prefixURI, options);
}
@Override
protected @NonNull QVTm2QVTsCompilerStep createQVTm2QVTsCompilerStep() {
return new QVTm2QVTsCompilerStep(this)
{
@Override
public @NonNull ScheduleManager execute(@NonNull Resource pResource) throws IOException {
ScheduleManager scheduleManager = super.execute(pResource);
instrumentRegion(scheduleManager);
return scheduleManager;
}
};
}
@Override
protected @NonNull QVTr2QVTcCompilerStep createQVTr2QVTcCompilerStep() {
return new QVTr2QVTcCompilerStep(this)
{
@Override
protected void doQVTcSerializeAndLoad(@NonNull URI asURI, @NonNull URI csURI) throws IOException {
XtextCompilerUtil.doQVTcSerializeAndLoad(environmentFactory.getProjectManager(), asURI, csURI);
}
};
}
}
public MyQVT(@NonNull ProjectManager projectManager, @NonNull String testProjectName, @NonNull URI testBundleURI, @NonNull URI txURI, @NonNull URI prefixURI, @NonNull URI srcFileURI, @NonNull URI binFileURI) {
super(projectManager, testProjectName, testBundleURI, txURI, prefixURI, srcFileURI, binFileURI);
}
@Override
protected @NonNull UMLXCompilerChain createCompilerChain(@NonNull URI txURI, @NonNull URI prefixURI, @NonNull CompilerOptions options) {
return new InstrumentedCompilerChain(getEnvironmentFactory(), txURI, prefixURI, options);
}
@Override
protected boolean generateGenModel() {
return true;
}
@Override
protected @NonNull String getBasePrefix() {
return "org.eclipse.qvtd.umlx.tests";
}
@Override
protected @NonNull ProjectManager getTestProjectManager() throws Exception {
return EMFPlugin.IS_ECLIPSE_RUNNING ? new ProjectMap(true) : UMLXCompilerTests.this.getTestProjectManager();
}
}
protected @NonNull MyQVT createQVT(@NonNull String resultPrefix, @NonNull URI txURI) throws Exception {
ProjectManager testProjectManager = getTestProjectManager();
URI prefixURI = getTestURI(resultPrefix);
URI srcFileURI = getTestFileURI(JavaFileUtil.TEST_SRC_FOLDER_NAME + "/");
URI binFileURI = getTestFileURI(JavaFileUtil.TEST_BIN_FOLDER_NAME + "/");
return new MyQVT(testProjectManager, getTestProject().getName(), getTestBundleURI(), txURI, prefixURI, srcFileURI, binFileURI);
}
/* (non-Javadoc)
* @see org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase#setUp()
*/
@Override
@Before
public void setUp() throws Exception {
BaseLinkingService.DEBUG_RETRY.setState(true);
QVTm2QVTs.DEBUG_GRAPHS.setState(true);
super.setUp();
OCLstdlib.install();
if (!EMFPlugin.IS_ECLIPSE_RUNNING) {
UMLXStandaloneSetup.doSetup();
}
XtextCompilerUtil.doQVTrelationSetup();
XtextCompilerUtil.doQVTcoreSetup();
XtextCompilerUtil.doQVTimperativeSetup();
// QVTrelationPivotStandaloneSetup.doSetup();
// QVTimperativePivotStandaloneSetup.doSetup();
}
/* (non-Javadoc)
* @see org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase#tearDown()
*/
@Override
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void testUMLXCompiler_Forward2Reverse_CG() throws Exception {
// Splitter.RESULT.setState(true);
// Splitter.STAGES.setState(true);
// Scheduler.DEBUG_GRAPHS.setState(true);
// AbstractTransformer.EXCEPTIONS.setState(true);
// AbstractTransformer.INVOCATIONS.setState(true);
// QVTm2QVTp.PARTITIONING.setState(true);
// QVTr2QVTc.VARIABLES.setState(true);
Class<? extends Transformer> txClass;
MyQVT myQVT1 = createQVT("Forward2Reverse", getModelsURI("forward2reverse/Forward2Reverse.umlx"));
try {
txClass = myQVT1.buildTransformation("reverse", false);
myQVT1.assertRegionCount(RuleRegionImpl.class, 2);
myQVT1.assertRegionCount(EarlyMerger.EarlyMergedMappingRegion.class, 0);
myQVT1.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 0);
myQVT1.assertRegionCount(MicroMappingRegionImpl.class, 4);
}
finally {
myQVT1.dispose();
}
MyQVT myQVT2 = createQVT("Forward2Reverse", getModelsURI("forward2reverse/Forward2Reverse.umlx"));
try {
myQVT2.loadEPackage(txClass, "doublylinkedlist.doublylinkedlistPackage");
myQVT2.loadEPackage(txClass, "trace_Forward2Reverse.trace_Forward2ReversePackage");
//
// Class<?> mClass1 = txClass.getClassLoader().loadClass("org.eclipse.qvtd.umlx.tests.models.forward2reverse.doublylinkedlist.doublylinkedlistPackage");
// EPackage ePackage1 = (EPackage)mClass1.getField("eINSTANCE").get(null);
// Class<?> mClass2 = txClass.getClassLoader().loadClass("org.eclipse.qvtd.umlx.tests.models.forward2reverse.trace_Forward2Reverse.trace_Forward2ReversePackage");
// EPackage ePackage2 = (EPackage)mClass2.getField("eINSTANCE").get(null);
URI inURI = getModelsURI("forward2reverse/samples/EmptyList.xmi");
URI outURI = getTestURI("generated_CG.xmi");
URI expectedURI = getModelsURI("forward2reverse/samples/EmptyList_expected.xmi");
// txClass.getName();
// Field field = txClass.getField("PLUGIN_ID");
// Object pluginId = field.get(null);
myQVT2.createGeneratedExecutor(txClass);
myQVT2.loadInput("forward", inURI);
myQVT2.executeTransformation();
myQVT2.saveOutput("reverse", outURI, expectedURI, Forward2ReverseNormalizer.INSTANCE);
//
myQVT2.createGeneratedExecutor(txClass);
myQVT2.loadInput("forward", getModelsURI("forward2reverse/samples/OneElementList.xmi"));
myQVT2.executeTransformation();
myQVT2.saveOutput("reverse", getTestURI("OneElementList_CG.xmi"), getModelsURI("forward2reverse/samples/OneElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
//
myQVT2.createGeneratedExecutor(txClass);
myQVT2.loadInput("forward", getModelsURI("forward2reverse/samples/TwoElementList.xmi"));
myQVT2.executeTransformation();
myQVT2.saveOutput("reverse", getTestURI("TwoElementList_CG.xmi"), getModelsURI("forward2reverse/samples/TwoElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
//
myQVT2.createGeneratedExecutor(txClass);
myQVT2.loadInput("forward", getModelsURI("forward2reverse/samples/ThreeElementList.xmi"));
myQVT2.executeTransformation();
myQVT2.saveOutput("reverse", getTestURI("ThreeElementList_CG.xmi"), getModelsURI("forward2reverse/samples/ThreeElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
}
finally {
myQVT2.dispose();
}
}
@Test
public void testUMLXCompiler_HierarchicalStateMachine2FlatStateMachine_example_CG() throws Exception {
// Splitter.RESULT.setState(true);
// Splitter.STAGES.setState(true);
// Scheduler.DEBUG_GRAPHS.setState(true);
// AbstractTransformer.EXCEPTIONS.setState(true);
// AbstractTransformer.INVOCATIONS.setState(true);
// QVTm2QVTp.PARTITIONING.setState(true);
// QVTr2QVTc.VARIABLES.setState(true);
Class<? extends Transformer> txClass;
URI txURI = getResourceURI("/org.eclipse.qvtd.examples.umlx.hstm2fstm/model/HierarchicalStateMachine2FlatStateMachine.umlx");
MyQVT myQVT1 = createQVT("HierarchicalStateMachine2FlatStateMachine", txURI);
// MyQVT myQVT = new MyQVT(createTestProjectManager(), getTestBundleURI(), "models/example_hstm2fstm", "samples");
// MyQVT myQVT = new MyQVT("forward2reverse");
try {
txClass = myQVT1.buildTransformation("flat", false);
myQVT1.assertRegionCount(RuleRegionImpl.class, 3);
myQVT1.assertRegionCount(EarlyMerger.EarlyMergedMappingRegion.class, 0);
myQVT1.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 0);
myQVT1.assertRegionCount(MicroMappingRegionImpl.class, 0);
}
finally {
myQVT1.dispose();
}
MyQVT myQVT2 = createQVT("HierarchicalStateMachine2FlatStateMachine", txURI);
try {
// myQVT2.loadEPackage(txClass, "doublylinkedlist.doublylinkedlistPackage");
// myQVT2.loadEPackage(txClass, "trace_Forward2Reverse.trace_Forward2ReversePackage");
URI inURI = getResourceURI("/org.eclipse.qvtd.examples.umlx.hstm2fstm/model/in/hier.xmi");
URI outURI = getTestURI("generated_CG.xmi");
URI expectedURI = getResourceURI("/org.eclipse.qvtd.examples.umlx.hstm2fstm/model/out/expected.xmi");
myQVT2.createGeneratedExecutor(txClass);
myQVT2.loadInput("hier", inURI);
myQVT2.executeTransformation();
myQVT2.saveOutput("flat", outURI, expectedURI, null);//FlatStateMachineNormalizer.INSTANCE);
}
finally {
myQVT2.dispose();
}
}
}