blob: 069eab2c72c859005fab34903f41deb039dfe8bb [file] [log] [blame]
/**
* Copyright (c) 2008, 2009 Borland Software Corp.
*
* 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.tests.xpand;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.gmf.internal.xpand.BufferOutput;
import org.eclipse.gmf.internal.xpand.XpandFacade;
import org.eclipse.gmf.internal.xpand.model.AmbiguousDefinitionException;
import org.eclipse.gmf.internal.xpand.model.AnalysationIssue;
import org.eclipse.gmf.internal.xpand.model.ExecutionContextImpl;
import org.eclipse.gmf.internal.xpand.model.Scope;
import org.eclipse.gmf.internal.xpand.model.XpandResource;
import org.eclipse.gmf.internal.xpand.xtend.ast.QvtResource;
import org.eclipse.m2m.internal.qvt.oml.QvtPlugin;
import org.eclipse.ocl.util.CollectionUtil;
public class QvtExtensions extends TestCase {
private static final Object[] YES_NO = new Object[] { "YES", "NO" };
private StringBuilder buffer;
private TestsResourceManager resourceManager;
private XpandFacade xpandFacade;
private ExecutionContextImpl execCtx;
@Override
protected void setUp() throws Exception {
super.setUp();
if (QvtPlugin.getDefault() == null) {
new QvtPlugin();
}
buffer = new StringBuilder();
resourceManager = new TestsResourceManager();
execCtx = new ExecutionContextImpl(new Scope(resourceManager, null, new BufferOutput(buffer)));
xpandFacade = new XpandFacade(execCtx);
}
public void testQvtLibraryCompilation() {
QvtResource qvtResource = resourceManager.loadQvtResource("org::eclipse::gmf::tests::xpand::evaluate::QvtLibrary");
Set<AnalysationIssue> issues = new LinkedHashSet<AnalysationIssue>();
qvtResource.analyze(execCtx, issues);
checkIssues(issues);
XpandResource template = execCtx.getScope().findTemplate("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension");
template.analyze(execCtx, issues);
checkIssues(issues);
}
private void checkIssues(Set<AnalysationIssue> issues) {
if (issues.size() == 0) {
return;
}
StringBuilder sb = new StringBuilder();
for (AnalysationIssue analysationIssue : issues) {
if (sb.length() > 0) {
sb.append("\n");
}
sb.append(analysationIssue.getMessage());
}
fail(sb.toString());
}
public void testContextInvocationContextualQuery() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkStringContextInvocation", "ContextString1");
}
/*
FIXME turned off as we don't know if we'd be able invoke
contextual queries in a static-invocation syntax (i.e. name(self) instead of self.name)
public void testStaticInvocationContextualQuery() {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkStringStaticInvocation", "ContextString2");
}
public void testContextInvocationStaticQuery() {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkIntContextInvocation", 10);
}
*/
// test if QVTO is capable of Collection() context operations (Bug #243684)
public void testQvtoIsCapableToDefineContextOpsToCollections() throws AmbiguousDefinitionException {
String arg = "Str";
xpandFacade.evaluate("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::collectionContextOp", arg, null);
assertEquals(arg, buffer.toString().trim());
}
public void testStaticInvocationStaticQuery() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkIntStaticInvocation", 20);
}
public void testBooleanTypeQuery() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkBoolean", false);
}
// TODO: Plugin test configuration required to execute this kind of test.
public void _testDeployedMetaType() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkDeployedMetaType", EcoreFactory.eINSTANCE.createEAttribute());
}
public void testCollectionOfStrings() throws AmbiguousDefinitionException {
List<String> sequence = CollectionUtil.<String>createNewSequence();
sequence.add("SampleString1");
sequence.add("SampleString2");
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkCollection", sequence);
}
public void testSetOfBooleans() throws AmbiguousDefinitionException {
Set<Boolean> collection = new HashSet<Boolean>();
collection.add(true);
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkSet", collection);
}
public void testSequenceOfBooleans() throws AmbiguousDefinitionException {
List<Boolean> collection = new ArrayList<Boolean>();
collection.add(true);
collection.add(false);
collection.add(false);
collection.add(true);
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkSequence", collection);
}
public void testBagOfBooleans() throws AmbiguousDefinitionException {
List<Boolean> collection = new ArrayList<Boolean>();
collection.add(true);
collection.add(false);
collection.add(false);
collection.add(true);
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkBag", collection);
}
public void testOrderedSetOfIntegers() throws AmbiguousDefinitionException {
Set<Integer> collection = new HashSet<Integer>();
collection.add(1);
collection.add(2);
collection.add(5);
collection.add(10);
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkOrderedSet", collection);
}
public void testQueryParametersNotPolymorphycForSelf() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkQueryParametersNotPolymorphycForSelf", "ContextString1");
}
public void testQueryParametersNotPolymorphycForParameter() throws AmbiguousDefinitionException {
Object[] yes_no_string = new Object[] {YES_NO[0], YES_NO[1], "OneMoreString"};
xpandFacade.evaluate("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkQueryParametersNotPolymorphycForParameter", "ContextString1", yes_no_string);
assertEquals(yes_no_string[0], buffer.toString());
}
public void testQueryParametersNotPolymorphycForLet() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkQueryParametersNotPolymorphycForLet", "ContextString1");
}
public void testQueryContextPolymorphycForSelf() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkQueryContextPolymorphycForSelf", "ContextString1");
}
public void testQueryParametersNotPolymorphycForForeach() throws AmbiguousDefinitionException {
checkQueryCall("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkQueryParametersNotPolymorphycForForeach", "ContextString1");
}
private void checkQueryCall(String queryName, Object selfObject) throws AmbiguousDefinitionException {
xpandFacade.evaluate(queryName, selfObject, YES_NO);
assertEquals(YES_NO[0], buffer.toString());
}
public void testQVTOCLExtensions() throws Exception {
LinkedList<Object> args = new LinkedList<Object>();
args.add("string1");
args.add(10);
args.add("string2");
args.add(5l);
args.add("string3");
args.add(20);
args.add(4f);
xpandFacade.evaluate("org::eclipse::gmf::tests::xpand::evaluate::QvtExtension::checkQVTOCLExtensions", "aaa", new Object[] { args });
assertEquals("xx", buffer.toString().trim());
}
}