/* * <copyright> * * Copyright (c) 2005-2006 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 * * </copyright> */ package org.eclipse.gmf.tests.expression.ast; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.gmf.internal.xpand.BuiltinMetaModel; import org.eclipse.gmf.internal.xpand.expression.AnalysationIssue; import org.eclipse.gmf.internal.xpand.expression.ExecutionContext; import org.eclipse.gmf.internal.xpand.expression.SyntaxConstants; import org.eclipse.gmf.internal.xpand.expression.Variable; import org.eclipse.gmf.internal.xpand.expression.ast.ChainExpression; import org.eclipse.gmf.internal.xpand.expression.ast.Expression; import org.eclipse.gmf.internal.xpand.expression.ast.SwitchExpression; /** * @author Sven Efftinge * @author Arno Haase */ public class AnalyzationTest extends AbstractExpressionTest { private Set<AnalysationIssue> issues; private ExecutionContext ec; private ATypeModel aType; @Override protected void setUp() throws Exception { aType = new ATypeModel(); ec = aType.newContext(null); issues = new HashSet<AnalysationIssue>(); } private void dumpIssues() { for (final Iterator<AnalysationIssue> iter = issues.iterator(); iter.hasNext();) { final AnalysationIssue element = iter.next(); System.out.println(element.getType().toString() + " - " + element.getMessage()); } } public final void testEquals() { final Expression expr = parse("true == null"); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(EcorePackage.eINSTANCE.getEBoolean(), result); assertTrue(issues.isEmpty()); } /** * XXX same as {@link #testTypeLiteral3()}? */ public final void testStaticPropertyCall() { final Expression expr = parse(ATypeModel.EVALUATION_TEST_MODEL + SyntaxConstants.NS_DELIM + ATypeModel.ENUM_TYPE_NAME + SyntaxConstants.NS_DELIM + ATypeModel.LITERAL1_NAME); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getMetaEnum(), result); assertTrue(issues.isEmpty()); } public final void testCollectionLiteral1() { final Expression expr = parse("{\"hallo\"}"); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEString()), result); assertTrue(issues.isEmpty()); } public final void testCollectionLiteral3() { final Expression expr = parse("{3}"); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEInt()), result); assertTrue(issues.isEmpty()); } public final void testCollectionLiteral2() { final Expression expr = parse("{\"hallo\",3}"); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEJavaObject()), result); assertTrue(issues.isEmpty()); } public final void testFeatureCall() { final Expression expr = parse(ATypeModel.TEST_ATTR); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getTestMetaAttr().getEType(), result); assertTrue(issues.isEmpty()); } public final void testFeatureCall1() { final Expression expr = parse("this." + ATypeModel.TEST_ATTR); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getTestMetaAttr().getEType(), result); assertTrue(issues.isEmpty()); } public final void testOperationCall1() { final Expression expr = parse(ATypeModel.OPERATION_NAME + "()"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getMetaOp1().getEType(), result); assertTrue(issues.isEmpty()); } public final void testOperationCall2() { final Expression expr = parse(ATypeModel.OPERATION_NAME + "(\"Test\")"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getMetaOp2().getEType(), result); assertTrue(issues.isEmpty()); } public final void testOperationCall3() { final Expression expr = parse("this." + ATypeModel.OPERATION_NAME + "()"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getMetaOp1().getEType(), result); assertTrue(issues.isEmpty()); } public final void testOperationCall4() { final Expression expr = parse("this." + ATypeModel.OPERATION_NAME + "(\"Test\")"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(aType.getMetaOp2().getEType(), result); assertTrue(issues.isEmpty()); } public final void testSwitchExpr() { final SwitchExpression expr = (SwitchExpression) parse("switch (3) { case \"Test\" : true default : false }"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(1, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEBoolean(), result); } public final void testSwitchExpr1() { final SwitchExpression expr = (SwitchExpression) parse("switch (\"Horst\") { case \"Test\" : true default : 3 }"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEJavaObject(), result); } public final void testSwitchExpr2() { // FIXME test for switch {case Test == null : true} once switch without condition supported final SwitchExpression expr = (SwitchExpression) parse("switch (\"\") { case \"Test\" : true default : false }"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEBoolean(), result); } public final void testChainExpr() { final ChainExpression expr = (ChainExpression) parse("switch ('') { case \"Test\" : true default : false } -> 3"); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEInt(), result); } public final void testChainExpr1() { final ChainExpression expr = (ChainExpression) parse("true -> List[Object] -> 3 -> \"Test\""); ec = ec.cloneWithVariable(newThisATypeVariable()); final EClassifier result = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEString(), result); } private Variable newThisATypeVariable() { return new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getMetaType()); } public final void testTypeLiteral1() { assertEquals(EcorePackage.eINSTANCE.getEClass(), parse("String").analyze(ec, new HashSet<AnalysationIssue>())); } public final void testTypeLiteral2() { final Expression e = parse("EClass.getEStructuralFeature('name')"); EClassifier result = e.analyze(ec, new HashSet<AnalysationIssue>()); assertEquals(EcorePackage.eINSTANCE.getEStructuralFeature(), result); } public final void testTypeLiteral3() { final Expression e = parse(ATypeModel.ENUM_TYPE_NAME + "::" + ATypeModel.LITERAL1_NAME); EClassifier result = e.analyze(ec, new HashSet<AnalysationIssue>()); assertEquals(aType.getMetaEnum(), result); } public final void testSelect() { final Expression expr = parse(aType.getMetaType().getName() + ".eStructuralFeatures.select(element.name=='" + ATypeModel.TEST_ATTR + "').toList().get(0)"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertNotNull(t); // unless our operations on dynamic lists are typed (now they are static with Object as Collection's innerType) // XXX assertEquals(EcorePackage.eINSTANCE.getEStructuralFeature(), t); } public final void testTypeSelect() { final Expression expr = parse("{3.4,3}.typeSelect(Integer)"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEInt()), t); } public final void testPath1() { final Expression expr = parse("{'a','b','c'}.toUpperCase()"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEString()), t); } public final void testPath2() { final Expression expr = parse("{'a','b','c'}.size()"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEInt(), t); } public final void testPath3() { final Expression expr = parse("{'a','b','c'}.toUpperCase().length()"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEInt()), t); } public final void testPath4() { final Expression expr = parse("{'a,b,c','a,b,c','a,b,c'}.split(',').length()"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEInt()), t); } public final void testImplies() { final Expression expr = parse("true implies false"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEBoolean(), t); } public final void testImplies1() { final Expression expr = parse("true implies null"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(1, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEBoolean(), t); } public final void testLet1() { final Expression expr = parse("let x = true : x"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEBoolean(), t); } public final void testLet2() { final Expression expr = parse("let x = true : 'test'+x"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEString(), t); } public final void testLet3() { final Expression expr = parse("let x = stuff : true"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(1, issues.size()); assertNull(t); } public final void testCast1() { final Expression expr = parse("(List[String]) {}"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEString()), t); } public final void testCast2() { final Expression expr = parse("(Collection[String]) {}"); final EClassifier t = expr.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEString()), t); } public final void testConstruction() { Expression expr = parse("new String"); EClassifier t = expr.analyze(ec, issues); assertEquals(0, issues.size()); assertEquals(EcorePackage.eINSTANCE.getEString(), t); expr = parse("new Unknown"); t = expr.analyze(ec, issues); assertEquals(1, issues.size()); assertNull(t); } }