/* * <copyright> * * Copyright (c) 2005, 2009 Sven Efftinge 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: * Sven Efftinge - Initial API and implementation * Alexander Shatalin (Borland) - Initial API and implementation * * </copyright> */ package org.eclipse.gmf.tests.xtend; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.gmf.tests.expression.ast.ATypeModel; import org.eclipse.gmf.internal.xpand.BuiltinMetaModel; import org.eclipse.gmf.internal.xpand.expression.ExecutionContext; import org.eclipse.gmf.internal.xpand.expression.ExecutionContextImpl; import org.eclipse.gmf.internal.xpand.util.ClassLoadContext; import org.eclipse.gmf.internal.xpand.xtend.ast.ExtensionFile; import org.eclipse.gmf.internal.xpand.xtend.ast.Extension; /** * FIXME ExtensionAnalyzationTest uses same extensions - reuse */ public class ExtensionEvaluationTest extends AbstractXtendTest { private ExecutionContextImpl ec; @Override protected void setUp() throws Exception { ec = new ExecutionContextImpl(null); ec.setContextClassLoader(new ClassLoadContext.Naive(this.getClass().getClassLoader())); } public final void testWithEverything() { final ExtensionFile file = parse("String toUpperCase(String str) : JAVA " + Helper.class.getName() + ".toUpperCase(java.lang.String) ; \n" + "\n" + "String privateHelper(String str) : JAVA " + Helper.class.getName() + ".privateHelper(java.lang.String) ; \n" + "\n" + "String nonStaticHelper(String str) : JAVA " + Helper.class.getName() + ".nonStaticHelper(java.lang.String) ; \n" + "\n" + "/* \n" + " * Meine Funktion \n" + " */ \n" + "myExtension(Object val) : {val} ; \n"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final Object[] params = new Object[] { "test" }; Extension ext = ec.getExtension("toUpperCase", detectTypes(params)); assertEquals("TEST", ext.evaluate(params, ec)); ext = ec.getExtension("myExtension", detectTypes(params)); assertEquals(Collections.singletonList("test"), ext.evaluate(params, ec)); } public final void testJavaExtension2() { final ExtensionFile file = parse("Collection[Object] union(Collection[Object] c1,Collection[Object] c2) : JAVA " + "org.eclipse.gmf.tests.xtend.Helper.union(java.util.Collection,java.util.Collection) ; \n"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final Object[] params = new Object[] { Collections.singleton("1"), Collections.singleton("2") }; final Extension ext = ec.getExtension("union", detectTypes(params)); final Collection result = (Collection) ext.evaluate(params, ec); assertTrue(result.size() == 2); assertTrue(result.contains("1")); assertTrue(result.contains("2")); } public final void testPolymorphism() { final ExtensionFile file = parse("ext(Object val) : 'Object' ; \n" + "ext(List[Object] val) : 'List' ; \n" + "ext(Collection[Object] val) : 'Collection' ; \n" + "ext(Integer val) : 'Integer' ; \n"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); Extension ext = ec.getExtension("ext", detectTypes(new Object[] { "test" })); assertEquals("Object", ext.evaluate(new Object[] { "test" }, ec)); ext = ec.getExtension("ext", detectTypes(new Object[] { Collections.EMPTY_SET })); assertEquals("Collection", ext.evaluate(new Object[] { Collections.EMPTY_SET }, ec)); ext = ec.getExtension("ext", detectTypes(new Object[] { Collections.EMPTY_LIST })); assertEquals("List", ext.evaluate(new Object[] { Collections.EMPTY_LIST }, ec)); ext = ec.getExtension("ext", detectTypes(new Object[] { new Integer(2) })); assertEquals("Integer", ext.evaluate(new Object[] { new Integer(2) }, ec)); } public final void testRecursion() { final ExtensionFile file = parse("List[Integer] recExtension(Integer von,Integer bis) : von>=bis ? {von} : recExtension(von,bis-1).add(bis) ; \n"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final Extension ext = ec.getExtension("recExtension", detectTypes(new Object[] { new Long(5), new Long(10) })); final List<Integer> expected = new ArrayList<Integer>(); for (int i = 5; i <= 10; i++) { expected.add(new Integer(i)); } final Object evalResult = ext.evaluate(new Object[] { new Integer(5), new Integer(10) }, ec); assertEquals(expected, evalResult); } public final void testMemberPosition() { final ExtensionFile file = parse("ext1(String txt) : 'test'+txt ;" + "ext2(String txt) : txt.ext1() ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final Extension ext = ec.getExtension("ext2", detectTypes(new Object[] { "fall" })); final Object evalResult = ext.evaluate(new Object[] { "fall" }, ec); assertEquals("testfall", evalResult); } public final void testCachedExtension() { final ExtensionFile file = parse("cached String ext(String txt) : JAVA " + ExtensionEvaluationTest.class.getName() + ".testMethod(java.lang.String);"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final Extension ext = ec.getExtension("ext", detectTypes(new Object[] { "test" })); assertEquals("test0", ext.evaluate(new Object[] { "test" }, ec)); assertEquals("test0", ext.evaluate(new Object[] { "test" }, ec)); assertEquals("test0", ext.evaluate(new Object[] { "test" }, ec)); assertEquals("test0", ext.evaluate(new Object[] { "test" }, ec)); } private EClassifier[] detectTypes(Object[] objects) { EClassifier[] rv = new EClassifier[objects.length]; for (int i = 0; i < objects.length; i++) { rv[i] = BuiltinMetaModel.getType(objects[i]); } return rv; } private static int magic = 0; public final static String testMethod(final String s) { return s + magic++; } public final void testCreateExtension() { final ExtensionFile file = parse("create List[String] l test(String s) : l.add(s) ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final List l = (List) file.getExtensions().get(0).evaluate(new String[] { "test" }, ec); assertEquals(Collections.singletonList("test"), l); } public final void testCreateExtension1() { final ExtensionFile file = parse("create List[String] test(String s) : add(s) ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final List l = (List) (file.getExtensions().get(0)).evaluate(new String[] { "test" }, ec); assertEquals(Collections.singletonList("test"), l); } public final void testAmbigous() { ATypeModel aType = new ATypeModel(); final ExtensionFile file = parse("import '"+ aType.getMetaType().getEPackage().getName() +"';"+ "doStuff(" + aType.getMetaType().getName() + " this) : true; " + "doStuff(" + aType.getMetaTypeC().getName() + " this) : false;"); ExecutionContext ctx = aType.newContext(file); assertNotNull(ctx.getExtension("doStuff", new EClassifier[] { aType.getMetaType() })); try { ctx.getExtension("doStuff", new EClassifier[] { aType.getMetaTypeB() }); fail("Ambigous operation exception expected"); } catch (final RuntimeException re) { //expected System.out.println(re.getMessage()); } } }