package ch.vorburger.el.engine.tests;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.junit4.InjectWith;
import org.eclipse.xtext.junit4.XtextRunner;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypeReferenceBuilder;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import ch.vorburger.el.ELInjectorProvider;
import ch.vorburger.el.engine.ExpressionContext;
import ch.vorburger.el.engine.ExpressionFactory;
import ch.vorburger.el.engine.tests.helper.ECoreHelper;
import com.google.inject.Injector;
/**
* Tests for the Expression Engine. These tests will assert correctness of Java
* Code generated from EL expressions with context objects.
*
* @author Michael Vorburger
*/
@RunWith(XtextRunner.class)
@InjectWith(ELInjectorProvider.class)
public class ExpressionWithContextGeneratorTest extends AbstractExpressionGeneratorTestBase {
private static ECoreHelper helper = new ECoreHelper();
public ExpressionWithContextGeneratorTest() {
super(new ExpressionFactory());
}
@Test
public void testGenerateWithExpressionContext() throws Exception {
EDataType dataType = EcorePackage.eINSTANCE.getEBigDecimal();
EPackage pkg = helper.createPackage("tests");
EClass clazz = helper.createClass(pkg, "NumericTests");
helper.addAttribute(clazz, dataType, "a");
EObject instance = helper.createInstance(clazz);
XtextResourceSet resourceSet = expressionFactory.getInjector().getInstance(XtextResourceSet.class);
Resource resource = resourceSet.createResource(URI.createURI("__synthetic.testData.expr"));
resource.getContents().add(instance);
// TODO could use TypeReferences getTypeForName() instead JvmTypesBuilder newTypeRef() ..
Injector injector = expressionFactory.getInjector();
JvmTypesBuilder jvmTypesBuilder = injector.getInstance(JvmTypesBuilder.class);
JvmTypeReferenceBuilder.Factory factory = injector.getInstance(JvmTypeReferenceBuilder.Factory.class);
JvmTypeReferenceBuilder jvmTypeReferenceBuilder = factory.create(instance.eResource().getResourceSet());
JvmGenericType type = jvmTypesBuilder.toClass(instance, "tests.NumericTests");
resource.getContents().add(type);
JvmField field = jvmTypesBuilder.toField(instance, "a", jvmTypeReferenceBuilder.typeRef(dataType.getInstanceClassName() /*"java.math.BigDecimal"*/));
field.setVisibility(JvmVisibility.PUBLIC);
type.getMembers().add(field);
ExpressionContext context = new ExpressionContext(resource);
context.setType(jvmTypeReferenceBuilder.typeRef(Boolean.TYPE));
context.addVariable("t", jvmTypeReferenceBuilder.typeRef(type));
checkGeneration("t.a == 5", Boolean.TYPE, context,
"com.google.common.base.Objects.equal(t.a, new java.math.BigDecimal(\"5\"))");
}
}