blob: 930f8aef9c4290f2896d4e169faeb83d8e8fe629 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 Borland Software Corporation 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:
* Borland Software Corporation - initial API and implementation
* Christopher Gerking - bugs 422269, 431082
*******************************************************************************/
package org.eclipse.m2m.tests.qvt.oml.callapi;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.m2m.qvt.oml.BasicModelExtent;
import org.eclipse.m2m.qvt.oml.ExecutionContextImpl;
import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;
import org.eclipse.m2m.qvt.oml.ModelExtent;
import org.eclipse.m2m.qvt.oml.TransformationExecutor;
import org.eclipse.m2m.qvt.oml.util.Log;
import org.eclipse.m2m.qvt.oml.util.StringBufferLog;
import org.eclipse.m2m.tests.qvt.oml.AllTests;
import org.osgi.framework.Bundle;
/**
* @author dvorak
*/
public class InvocationTest extends TestCase {
private TransformationExecutor fExecutor;
private BasicModelExtent fInput;
private List<EObject> fInitialInputContents;
private BasicModelExtent fOutput;
private ExecutionContextImpl fContext;
public InvocationTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
URI uri = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/deployed/callapi/Ecore2Ecore.qvto", false); //$NON-NLS-1$
fExecutor = new TransformationExecutor(uri);
fInput = new BasicModelExtent();
EPackage inObject = EcoreFactory.eINSTANCE.createEPackage();
inObject.setName("input"); //$NON-NLS-1$
fInput.add(inObject);
fInitialInputContents = new ArrayList<EObject>(fInput.getContents());
fOutput = new BasicModelExtent();
fContext = new ExecutionContextImpl();
assertFalse(fInput.getContents().isEmpty());
assertTrue(fOutput.getContents().isEmpty());
}
private void assertOutputObject(ModelExtent outModel) {
EPackage result = (EPackage)EcoreUtil.getObjectByType(outModel.getContents(), EcorePackage.eINSTANCE.getEPackage());
EPackage input = (EPackage)EcoreUtil.getObjectByType(fInput.getContents(), EcorePackage.eINSTANCE.getEPackage());
assertEquals(input.getName() + "_Ecore2Ecore", result.getName());
assertUnchangedInput();
}
private void assertUnchangedInput() {
// check the input was not changed
assertEquals(fInitialInputContents, fInput.getContents());
}
public void testAssertFailed() throws Exception {
fContext.setConfigProperty("assertFail", Boolean.TRUE); //$NON-NLS-1$
ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.ERROR, diagnostic.getSeverity());
assertEquals(ExecutionDiagnostic.FATAL_ASSERTION, diagnostic.getCode());
assertFalse(diagnostic.getStackTrace().isEmpty());
assertTrue(fOutput.getContents().isEmpty());
}
public void testStackTrace() throws Exception {
// provoke an exception
fContext.setConfigProperty("assertFail", Boolean.TRUE); //$NON-NLS-1$
ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(2, diagnostic.getStackTrace().size());
StringWriter strWr = new StringWriter();
diagnostic.printStackTrace(new PrintWriter(strWr));
strWr.flush();
StringWriter expected = new StringWriter();
PrintWriter pwr = new PrintWriter(expected);
pwr.println(" at Ecore2Ecore::checkAssert(Ecore2Ecore.qvto:27)"); //$NON-NLS-1$
pwr.print(" at Ecore2Ecore::main(Ecore2Ecore.qvto:12)"); //$NON-NLS-1$
pwr.flush();
assertEquals(expected.toString(), strWr.toString());
}
public void testMutlipleOutObjects() throws Exception {
fContext.setConfigProperty("createTwoObjects", true);
ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.OK, diagnostic.getSeverity());
assertOutputObject(fOutput);
assertEquals(2, fOutput.getContents().size());
}
public void testInvokeSuccess() throws Exception {
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.OK, diagnostic.getSeverity());
assertEquals(0, diagnostic.getCode());
List<?> outContents = fOutput.getContents();
assertEquals(1, outContents.size());
assertOutputObject(fOutput);
// test re-execution
BasicModelExtent nextOut = new BasicModelExtent();
fContext = new ExecutionContextImpl();
ExecutionDiagnostic nextDiagnostic = fExecutor.execute(fContext, fInput, nextOut);
assertOutputObject(nextOut);
assertEquals(Diagnostic.OK, nextDiagnostic.getSeverity());
}
public void testLogging() throws Exception {
StringBufferLog log = new StringBufferLog();
fContext.setLog(log);
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.OK, diagnostic.getSeverity());
assertTrue(log.getContents().contains("Hello")); //$NON-NLS-1$
}
public void testInterruption() throws Exception {
final IProgressMonitor monitor = new NullProgressMonitor();
Log log = new Log() {
public void log(int level, String message, Object param) {
monitor.setCanceled(true);
}
public void log(int level, String message) {
monitor.setCanceled(true);
}
public void log(String message, Object param) {
monitor.setCanceled(true);
}
public void log(String message) {
monitor.setCanceled(true);
}
};
fContext.setProgressMonitor(monitor);
fContext.setLog(log);
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.CANCEL, diagnostic.getSeverity());
assertEquals(ExecutionDiagnostic.USER_INTERRUPTED, diagnostic.getCode());
assertEquals(1, diagnostic.getStackTrace().size());
}
public void testTransformationLoadFailure() throws Exception {
URI uri = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/deployed/callapi/NotExisting.qvto", false); //$NON-NLS-1$
fExecutor = new TransformationExecutor(uri);
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.ERROR, diagnostic.getSeverity());
assertEquals(ExecutionDiagnostic.TRANSFORMATION_LOAD_FAILED, diagnostic.getCode());
assertUnchangedInput();
assertTrue(fOutput.getContents().isEmpty());
}
public void testCompilationErrors() throws Exception {
URI uri = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/deployed/callapi/CompilationErrors.qvto", false); //$NON-NLS-1$
fExecutor = new TransformationExecutor(uri);
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.ERROR, diagnostic.getSeverity());
assertEquals(ExecutionDiagnostic.VALIDATION, diagnostic.getCode());
assertFalse(diagnostic.getChildren().isEmpty());
assertTrue(diagnostic.getChildren().get(0).getMessage().contains("(at:")); //$NON-NLS-1$
assertUnchangedInput();
assertTrue(fOutput.getContents().isEmpty());
}
public void testNonExecutable() throws Exception {
URI uri = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/deployed/callapi/NonExecutable.qvto", false); //$NON-NLS-1$
fExecutor = new TransformationExecutor(uri);
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.ERROR, diagnostic.getSeverity());
assertEquals(ExecutionDiagnostic.VALIDATION, diagnostic.getCode());
assertUnchangedInput();
assertTrue(fOutput.getContents().isEmpty());
}
public void testLessModelParams() throws Exception {
ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput);
assertEquals(Diagnostic.ERROR, diagnostic.getSeverity());
assertEquals(ExecutionDiagnostic.MODEL_PARAMETER_MISMATCH, diagnostic.getCode());
}
public void testModelModelParams() throws Exception {
ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput, new BasicModelExtent());
assertEquals(Diagnostic.OK, diagnostic.getSeverity());
assertEquals(0, diagnostic.getCode());
}
public void testNullModelParams() throws Exception {
try {
fExecutor.execute(fContext, (ModelExtent) null);
} catch(IllegalArgumentException e) {
return;
}
fail("Must have thrown exception"); //$NON-NLS-1$
}
public void testNullOneOfModelParams() throws Exception {
try {
fExecutor.execute(fContext, new ModelExtent[] { fInput, null });
} catch(IllegalArgumentException e) {
return;
}
fail("Must have thrown exception"); //$NON-NLS-1$
}
public void testNullContext() throws Exception {
try {
fExecutor.execute(null, fInput, fOutput);
} catch(IllegalArgumentException e) {
return;
}
fail("Must have thrown exception"); //$NON-NLS-1$
}
public void testInvokeOnGenericURIs() throws Exception {
Bundle testBundle = Platform.getBundle(AllTests.BUNDLE_ID);
File bundleFile = FileLocator.getBundleFile(testBundle);
assertNotNull(bundleFile);
URI fileURI = URI.createURI(new File(bundleFile, "deployed/callapi/Ecore2Ecore.qvto").toURI().toString(), true);
fExecutor = new TransformationExecutor(fileURI);
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext, fInput, fOutput);
assertEquals(Diagnostic.OK, diagnostic.getSeverity());
assertEquals(0, diagnostic.getCode());
}
public void testConfigProperties() throws Exception {
URI uri = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/parserTestData/models/bug267917/bug267917.qvto", false); //$NON-NLS-1$
fExecutor = new TransformationExecutor(uri);
fContext.setConfigProperty("optionsDict1", "b=b1, c=c1, a=a1"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsDict2", "b=10, c=100, a=-1"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsDict3", "true=false, false=true"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsDict4", "b=2.2, c=3.3, a=1.1"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsDict5", "1=a, 2=b, 3=c"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsDict6", "1=true, 2=false"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsDict7", null); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsSet", "1.0, 1.1, 1.2"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsList", "foo, bar"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsSequence", "-1, 10"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("optionsOrderedSet", "bar, foo"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("nestedDict1", "[a\\\\a=[a, b], a\\,a=[b, c], a\\[\\[a=[b, c]]"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("nestedDict2", "[[3.0=]=[4=4.0], [1.0=a]=[2=2.0]]"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("nestedSet1", "[[1.0]]"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("nestedSet2", "[[1.1], [2.2], [0.0, 3.3]]"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("nestedSet3", "[]"); //$NON-NLS-1$ //$NON-NLS-2$
fContext.setConfigProperty("nestedSet4", "[[]]"); //$NON-NLS-1$ //$NON-NLS-2$
final ExecutionDiagnostic diagnostic = fExecutor.execute(fContext);
assertEquals(Diagnostic.OK, diagnostic.getSeverity());
}
}