package org.jboss.jsfunit.analysis.el; import java.io.File; import java.lang.reflect.Method; import java.util.Map; import javax.el.ELContext; import javax.el.ELException; import javax.el.ExpressionFactory; import javax.el.PropertyNotFoundException; import javax.el.ValueExpression; import javax.faces.event.ActionEvent; import junit.framework.TestCase; import de.odysseus.el.ExpressionFactoryImpl; /** * * @author Jason * @since 1.0 */ public class ELTestCase extends TestCase { private final ELBundle expression; private final Map<String, Class<?>> beanMap; public ELTestCase(final ELBundle expression, final Map<String, Class<?>> beanMap) { super(expression.getName()); this.expression = expression; this.beanMap = beanMap; } public void testExpression() { final String el = expression.getExpression(); final ExpressionFactory factory = new ExpressionFactoryImpl(); final ELContext context = new JSFUnitELContext(beanMap, factory); final Object outputObj; try { final ValueExpression e = factory.createValueExpression(context, el, Object.class); outputObj = e.getValue(context); } catch(final PropertyNotFoundException pnfe) { elFail(pnfe); return; //stop complaining about unitialized methodObj. } catch(final ELException ee) { elFail(ee); return; //stop complaining about unitialized methodObj. } if(outputObj instanceof Method) { final Method method = (Method)outputObj; //TODO: these assume the default action/actionListener restrictions if("action".equals(expression.getAttr())) { assertEquals(String.class, method.getReturnType()); assertEquals(0, method.getParameterTypes().length); } else if("actionListener".equals(expression.getAttr())) { assertEquals(Void.TYPE, method.getReturnType()); final Class<?>[] params = method.getParameterTypes(); assertEquals(1, params.length); assertEquals(ActionEvent.class, params[0]); } } else if(outputObj instanceof Class<?>) { //yay. } else { resolveFail(); } } private void resolveFail() { final String el = expression.getExpression(); final File file = expression.getFile(); final int start = expression.getStartIndex(); fail(String.format("%s contains EL %s beginning at char %s, " + "but this could not be resolved to a class or method.", file, el, start)); } private void elFail(final Throwable t) { final String el = expression.getExpression(); final File file = expression.getFile(); final int start = expression.getStartIndex(); fail(String.format("Error for EL %s in file %s beginning at char %s: ", el, file, start) + t.getClass() + ": " + t.getMessage()); } @Override public void runTest() { testExpression(); } }