/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.codegen;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class JDKEvaluatorFactoryTest {
public static class TestEntity {
private final String name;
public TestEntity(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
private EvaluatorFactory factory;
private List<String> names = Arrays.asList("a", "b");
private List<Class<?>> ints = Arrays.<Class<?>> asList(int.class, int.class);
private List<Class<?>> strings = Arrays.<Class<?>> asList(String.class, String.class);
private List<Class<?>> string_int = Arrays.<Class<?>> asList(String.class, int.class);
@Before
public void setUp() throws IOException {
factory = new JDKEvaluatorFactory((URLClassLoader) getClass().getClassLoader());
}
@Test
public void Simple() {
for (String expr : Arrays.asList("a.equals(b)", "a.startsWith(b)", "a.equalsIgnoreCase(b)")) {
long start = System.currentTimeMillis();
evaluate(expr, boolean.class, names, strings, Arrays.asList("a", "b"),
Collections.<String, Object> emptyMap());
long duration = System.currentTimeMillis() - start;
System.err.println(expr + " took " + duration + "ms\n");
}
for (String expr : Arrays.asList("a != b", "a < b", "a > b", "a <= b", "a >= b")) {
long start = System.currentTimeMillis();
evaluate(expr, boolean.class, names, ints, Arrays.asList(0, 1),
Collections.<String, Object> emptyMap());
long duration = System.currentTimeMillis() - start;
System.err.println(expr + " took " + duration + "ms\n");
}
}
@Test
public void Results() {
// String + String
test("a + b", String.class, names, strings, Arrays.asList("Hello ", "World"), "Hello World");
// String + int
test("a.substring(b)", String.class, names, string_int,
Arrays.<Object> asList("Hello World", 6), "World");
// int + int
test("a + b", int.class, names, ints, Arrays.asList(1, 2), 3);
}
@Test
public void WithConstants() {
Map<String, Object> constants = new HashMap<String, Object>();
constants.put("x", "Hello World");
List<Class<?>> types = Arrays.<Class<?>> asList(String.class);
List<String> names = Arrays.asList("a");
assertEquals(
Boolean.TRUE,
evaluate("a.equals(x)", boolean.class, names, types, Arrays.asList("Hello World"),
constants));
assertEquals(
Boolean.FALSE,
evaluate("a.equals(x)", boolean.class, names, types, Arrays.asList("Hello"),
constants));
}
@Test
public void CustomType() {
test("a.getName()", String.class, Collections.singletonList("a"),
Collections.<Class<?>> singletonList(TestEntity.class),
Arrays.asList(new TestEntity("Hello World")), "Hello World");
}
private void test(String source, Class<?> projectionType, List<String> names,
List<Class<?>> types, List<?> args, Object expectedResult) {
Assert.assertEquals(
expectedResult,
evaluate(source, projectionType, names, types, args,
Collections.<String, Object> emptyMap()));
}
private Object evaluate(String source, Class<?> projectionType, List<String> names,
List<Class<?>> types, List<?> args, Map<String, Object> constants) {
Evaluator<?> evaluator = factory.createEvaluator("return " + source + ";", projectionType,
names.toArray(new String[names.size()]), types.toArray(new Class<?>[types.size()]),
constants);
return evaluator.evaluate(args.toArray());
}
}