/* * <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.ArrayList; import java.util.List; import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.gmf.internal.xpand.expression.EvaluationException; 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.Expression; /** * @author Sven Efftinge * @author Arno Haase */ public class EvaluationTest extends AbstractExpressionTest { private ExecutionContext ec; private ATypeModel aType; @SuppressWarnings("unchecked") @Override protected void setUp() throws Exception { aType = new ATypeModel(); ec = aType.newContext(null); } public final void testSimple() { final Expression expr = parse("true == null"); final Object result = expr.evaluate(ec); assertFalse(((Boolean) result).booleanValue()); } 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 Object result = expr.evaluate(ec); EEnumLiteral metaLiteral1 = aType.getMetaEnum().getEEnumLiteral(ATypeModel.LITERAL1_NAME); assertEquals(metaLiteral1.getInstance(), result); } public final void testCollectionLiteral1() { final Expression expr = parse("{\"hallo\"}"); final Object result = expr.evaluate(ec); assertEquals("hallo", ((List) result).iterator().next()); } public final void testCollectionLiteral3() { final Expression expr = parse("{3}"); final Object result = expr.evaluate(ec); assertEquals(3, ((List) result).iterator().next()); } public final void testCollectionLiteral2() { final Expression expr = parse("{\"hallo\",3}"); final List result = (List) expr.evaluate(ec); assertEquals(2, result.size()); assertEquals("hallo", result.get(0)); assertEquals(3, result.get(1)); } public final void testFeatureCall() { final Expression expr = parse(ATypeModel.TEST_ATTR); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(aType.getATypeTestFeatureValue(), result); } public final void testFeatureCall1() { final Expression expr = parse("this." + ATypeModel.TEST_ATTR); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(aType.getATypeTestFeatureValue(), result); } // next two tests are checking that != and == operations are available for EObjects public final void testEqualsNull() { final Expression expr = parse("this == null"); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(Boolean.FALSE, result); } public final void testNotEqualsNull() { final Expression expr = parse("this != null"); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(Boolean.TRUE, result); } public final void testOperationCall1() { aType.registerOperations(); final Expression expr = parse("myOperation()"); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(ATypeModel.myOperation(), result); } public final void testOperationCall2() { aType.registerOperations(); final Expression expr = parse("myOperation(\"Test\")"); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(ATypeModel.myOperation("Test"), result); } public final void testOperationCall3() { aType.registerOperations(); final Expression expr = parse("this.myOperation()"); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(ATypeModel.myOperation(), result); } public final void testOperationCall4() { aType.registerOperations(); final Expression expr = parse("this.myOperation(\"Test\")"); ec = ec.cloneWithVariable(new Variable(ExecutionContext.IMPLICIT_VARIABLE, aType.getInstance())); final Object result = expr.evaluate(ec); assertEquals(ATypeModel.myOperation("Test"), result); } public final void testArithmetic() { Expression expr = parse("3 + 4 * 2"); assertEquals(11, expr.evaluate(ec)); expr = parse("4 * 2 + 3"); assertEquals(11, expr.evaluate(ec)); expr = parse("4 * 2 + 3 / 3"); assertEquals(9, expr.evaluate(ec)); } public final void testArithmetic2() { Expression expr = parse("3 + 4.0 * 2"); assertEquals(new Double(11), expr.evaluate(ec)); expr = parse("4.0 * 2 + 3"); assertEquals(new Double(11), expr.evaluate(ec)); expr = parse("4 * 2 + 3 / 3.0"); assertEquals(new Double(9), expr.evaluate(ec)); } public final void testArithmetic3() { Expression expr = parse("5 / 2"); assertEquals(2, expr.evaluate(ec)); expr = parse("5 / 2.0"); assertEquals(new Double(2.5), expr.evaluate(ec)); } //https://bugs.eclipse.org/bugs/show_bug.cgi?id=200786 public final void testArithmetic4_Precedence() { Expression expr = parse("10-5-5"); assertEquals(0, expr.evaluate(ec)); } public final void testNegation() { Expression expr = parse("-1"); assertEquals(-1, expr.evaluate(ec)); expr = parse("-2.5"); assertEquals(-2.5, expr.evaluate(ec)); expr = parse("(0-2) == -2"); assertEquals(Boolean.TRUE, expr.evaluate(ec)); } public final void testStringConcatenation1() { final Expression expr = parse("\"test\" + 3 + 4"); assertEquals("test34", expr.evaluate(ec)); } public final void testStringConcatenation2() { final Expression expr = parse("(\"test\" + 3) + 4"); assertEquals("test34", expr.evaluate(ec)); } public final void testNullReference() { ec = ec.cloneWithVariable(new Variable("nullRef", null)); final Expression expr = parse("nullRef + \"test\" + 3 + 4"); assertEquals(null, expr.evaluate(ec)); ec = ec.cloneWithVariable(new Variable("this", null)); assertNull(parse("this.unknownMember").evaluate(ec)); } public final void testTypeLiteral1() { assertEquals(EcorePackage.eINSTANCE.getEString(), parse("String").evaluate(ec)); } public final void testTypeLiteral2() { final Expression e = parse("EClass.getEStructuralFeature('name')"); assertTrue(e.evaluate(ec) instanceof EStructuralFeature); } public final void testPath1() { final Expression expr = parse("{'a','b','c'}.toUpperCase()"); final List result = (List) expr.evaluate(ec); assertEquals("A", result.get(0)); assertEquals("B", result.get(1)); assertEquals("C", result.get(2)); } public final void testPath2() { final Expression expr = parse("{'a','b','c'}.size()"); assertEquals(3, expr.evaluate(ec)); } public final void testPath3() { final Expression expr = parse("{'a','b2','c'}.toUpperCase().length()"); final List result = (List) expr.evaluate(ec); assertEquals(1, result.get(0)); assertEquals(2, result.get(1)); assertEquals(1, result.get(2)); } public final void testPath4() { final Expression expr = parse("{'a,b2,c','a,b,c','a,b,c'}.split(',').length()"); final List result = (List) expr.evaluate(ec); assertEquals(9, result.size()); assertEquals(1, result.get(0)); assertEquals(2, result.get(1)); assertEquals(1, result.get(2)); } public final void testNestedCollExpr() { final Expression expr = parse("col.typeSelect(String).forAll(e|" + "col.typeSelect(Integer).exists(a| a == e.length()))"); final List<Comparable> list = new ArrayList<Comparable>(); list.add("123"); list.add("1234"); list.add("12345"); list.add(3); list.add(4); ExecutionContext contextWithVar = ec.cloneWithVariable(new Variable("col", list)); assertEquals(Boolean.FALSE, expr.evaluate(contextWithVar)); list.add(5); assertEquals(Boolean.TRUE, expr.evaluate(contextWithVar)); } public final void testTypeSelectWithNull() { final Expression expr = parse("{null, 'test'}.typeSelect(String).size()"); assertEquals(1, expr.evaluate(ec)); } public final void testLet1() { final Expression expr = parse("let x = {'a,b2,c','a,b,c','1,2,3'} : x.get(1)"); assertEquals("a,b,c", expr.evaluate(ec)); } public final void testLet2() { final Expression expr = parse("let x = {} : x.add('1') -> x.add('2')" + " -> x.add('3') -> x"); final List<String> l = new ArrayList<String>(); l.add("1"); l.add("2"); l.add("3"); assertEquals(l, expr.evaluate(ec)); } public final void testConstruction() { final Expression expr = parse("new String"); assertEquals("", expr.evaluate(ec)); try { parse("new Unkown").evaluate(ec); fail(); } catch (final EvaluationException ee) { // expected } } }