package com.google.sitebricks.rendering;
import org.mvel2.MVEL;
import org.mvel2.ParserContext;
import org.mvel2.compiler.CompiledExpression;
import org.mvel2.compiler.ExpressionCompiler;
import org.testng.annotations.Test;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
/**
* @author Dhanji R. Prasanna (dhanji@gmail com)
*/
public class MvelGenericsConfidenceTest {
private static final List<String> STRINGS = Arrays.asList("hi", "there");
@Test
public final void determineEgressParametricType() {
final ParserContext parserContext = new ParserContext();
parserContext.setStrongTyping(true);
parserContext.addInput("strings", List.class, new Class[] { String.class });
ExpressionCompiler compiler = new ExpressionCompiler("strings", parserContext);
final CompiledExpression expr = compiler
.compile();
assert STRINGS.equals(MVEL.executeExpression(expr, new A())) : "faulty expression eval";
final Type[] typeParameters = compiler.getParserContextState().getLastTypeParameters();
assert null != typeParameters : "no generic egress type";
assert String.class.equals(typeParameters[0]) : "wrong generic egress type";
}
@Test
public final void determineEgressParametricTypeInExprChain() {
final ParserContext parserContext = new ParserContext();
parserContext.setStrongTyping(true);
parserContext.addInput("strings", A.class);
ExpressionCompiler compiler = new ExpressionCompiler("strings.strings",
parserContext);
final CompiledExpression expr = compiler
.compile();
assert STRINGS.equals(MVEL.executeExpression(expr, new B())) : "faulty expression eval";
final Type[] typeParameters = compiler.getParserContextState().getLastTypeParameters();
assert null != typeParameters : "no generic egress type";
assert String.class.equals(typeParameters[0]) : "wrong generic egress type";
}
public static class A {
public List<String> getStrings() {
return STRINGS;
}
}
public static class B {
public A getStrings() {
return new A();
}
}
}