/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.codegen;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import com.mysema.codegen.model.ClassType;
import com.mysema.codegen.model.Type;
import com.mysema.codegen.model.TypeCategory;
import com.mysema.codegen.model.Types;
import com.mysema.codegen.support.Cat;
public class ComplexEvaluationTest {
private EvaluatorFactory factory = new ECJEvaluatorFactory(getClass().getClassLoader());
@Test
@SuppressWarnings("unchecked")
public void Complex() {
ClassType resultType = new ClassType(TypeCategory.LIST, List.class, Types.STRING);
StringBuilder source = new StringBuilder();
source.append("java.util.List<String> rv = new java.util.ArrayList<String>();\n");
source.append("for (String a : a_){\n");
source.append(" for (String b : b_){\n");
source.append(" if (a.equals(b)){\n");
source.append(" rv.add(a);\n");
source.append(" }\n");
source.append(" }\n");
source.append("}\n");
source.append("return rv;");
@SuppressWarnings("rawtypes") // cannot specify further than List.class
Evaluator<List> evaluator = factory.createEvaluator(source.toString(), resultType,
new String[] { "a_", "b_" }, new Type[] { resultType, resultType }, new Class<?>[] {
List.class, List.class }, Collections.<String, Object> emptyMap());
List<String> a_ = Arrays.asList("1", "2", "3", "4");
List<String> b_ = Arrays.asList("2", "4", "6", "8");
assertEquals(Arrays.asList("2", "4"), evaluator.evaluate(a_, b_));
}
@Test
@SuppressWarnings("unchecked")
public void ComplexClassLoading() {
ClassType resultType = new ClassType(TypeCategory.LIST, List.class, Types.OBJECTS);
StringBuilder source = new StringBuilder();
source.append("java.util.List<Object[]> rv = new java.util.ArrayList<Object[]>();\n");
source.append("for (com.mysema.codegen.support.Cat cat : (java.util.List<com.mysema.codegen.support.Cat>)cat_){\n");
source.append("for (com.mysema.codegen.support.Cat otherCat : (java.util.List<com.mysema.codegen.support.Cat>)otherCat_){\n");
source.append("rv.add(new Object[]{cat,otherCat});\n");
source.append("}\n");
source.append("}\n");
source.append("return rv;\n");
Cat fuzzy = new Cat("fuzzy");
Cat spot = new Cat("spot");
Cat mittens = new Cat("mittens");
Cat sparkles = new Cat("sparkles");
List<Cat> a_ = Arrays.asList(fuzzy, spot);
List<Cat> b_ = Arrays.asList(mittens, sparkles);
ClassType argType = new ClassType(TypeCategory.LIST, List.class, new ClassType(Cat.class));
@SuppressWarnings("rawtypes") // cannot specify further than List.class
Evaluator<List> evaluator = factory.createEvaluator(source.toString(), resultType,
new String[] { "cat_", "otherCat_" }, new Type[] { argType, argType }, new Class<?>[] {
List.class, List.class }, Collections.<String, Object> emptyMap());
Object[][] expResults = { {fuzzy, mittens}, {fuzzy, sparkles}, {spot, mittens}, {spot, sparkles} };
List<Object[]> result = evaluator.evaluate(a_, b_);
assertEquals(expResults.length, result.size());
for (int i = 0; i < expResults.length; i++) {
assertEquals(expResults[i].length, result.get(i).length);
for (int j = 0; j < expResults[i].length; j++) {
assertEquals(expResults[i][j], result.get(i)[j]);
}
}
}
@Test(expected=CodegenException.class)
@SuppressWarnings("unchecked")
public void ComplexClassLoadingFailure() {
ClassType resultType = new ClassType(TypeCategory.LIST, List.class, Types.STRING);
StringBuilder source = new StringBuilder();
source.append("java.util.List<String> rv = (java.util.List<String>) new java.util.ArrayList<Franklin>();\n");
source.append("for (String a : a_){\n");
source.append(" for (String b : b_){\n");
source.append(" if (a.equals(b)){\n");
source.append(" rv.add(a);\n");
source.append(" }\n");
source.append(" }\n");
source.append("}\n");
source.append("return rv;");
@SuppressWarnings("rawtypes") // cannot specify further than List.class
Evaluator<List> evaluator = factory.createEvaluator(source.toString(), resultType,
new String[] { "a_", "b_" }, new Type[] { resultType, resultType }, new Class<?>[] {
List.class, List.class }, Collections.<String, Object> emptyMap());
List<String> a_ = Arrays.asList("1", "2", "3", "4");
List<String> b_ = Arrays.asList("2", "4", "6", "8");
assertEquals(Arrays.asList("2", "4"), evaluator.evaluate(a_, b_));
}
@Test
@SuppressWarnings("unchecked")
public void ComplexPrimitiveType() {
ClassType resultType = new ClassType(TypeCategory.LIST, List.class, Types.BOOLEAN);
StringBuilder source = new StringBuilder();
source.append("java.util.List<Boolean> rv = new java.util.ArrayList<Boolean>();\n");
source.append("for (boolean a : a_){\n");
source.append(" for (boolean b : b_){\n");
source.append(" if (a == b){\n");
source.append(" rv.add(a);\n");
source.append(" }\n");
source.append(" }\n");
source.append("}\n");
source.append("return rv;");
@SuppressWarnings("rawtypes") // cannot specify further than List.class
Evaluator<List> evaluator = factory.createEvaluator(source.toString(), resultType,
new String[] { "a_", "b_" }, new Type[] { resultType, resultType }, new Class<?>[] {
List.class, List.class }, Collections.<String, Object> emptyMap());
List<Boolean> a_ = Arrays.asList(true, true, true);
List<Boolean> b_ = Arrays.asList(false, false, true);
assertEquals(Arrays.asList(true, true, true), evaluator.evaluate(a_, b_));
}
@Test
@SuppressWarnings("unchecked")
public void ComplexEmbeddedClass() {
ClassType resultType = new ClassType(TypeCategory.LIST, List.class, Types.BOOLEAN);
StringBuilder source = new StringBuilder();
source.append("java.util.List<Boolean> rv = new java.util.ArrayList<Boolean>();\n");
source.append("for (boolean a : a_){\n");
source.append(" for (boolean b : b_){\n");
source.append(" if (a == b && new TestEmbedded().DO_RETURN()){\n");
source.append(" rv.add(a);\n");
source.append(" }\n");
source.append(" }\n");
source.append("}\n");
source.append("return rv;} private static class TestEmbedded { public TestEmbedded() {} public boolean DO_RETURN() { return true; } ");
@SuppressWarnings("rawtypes") // cannot specify further than List.class
Evaluator<List> evaluator = factory.createEvaluator(source.toString(), resultType,
new String[] { "a_", "b_" }, new Type[] { resultType, resultType }, new Class<?>[] {
List.class, List.class }, Collections.<String, Object> emptyMap());
List<Boolean> a_ = Arrays.asList(true, true, true);
List<Boolean> b_ = Arrays.asList(false, false, true);
assertEquals(Arrays.asList(true, true, true), evaluator.evaluate(a_, b_));
}
public static class SuperCat extends Cat {
private SuperCat(String name) {
super(name);
}
}
@Test
public void ComplexDifferentConstants() {
ClassType resultType = new ClassType(TypeCategory.LIST, List.class, new ClassType(Cat.class));
String source = new StringBuilder()
.append("java.util.List<com.mysema.codegen.support.Cat> rv = new java.util.ArrayList<com.mysema.codegen.support.Cat>();\n")
.append("for (com.mysema.codegen.support.Cat cat : (java.util.List<com.mysema.codegen.support.Cat>)cat_){\n")
.append("if (cat.equals(a1)) {\n")
.append("rv.add(cat);\n")
.append("}\n")
.append("}\n")
.append("return rv;\n")
.toString();
List<Cat> cats = Arrays.asList(new Cat("fuzzy"), new Cat("spot"));
String[] names = new String[] { "cat_" };
Type[] types = new Type[] { new ClassType(TypeCategory.LIST, List.class, new ClassType(Cat.class)) };
Class<?>[] classes = new Class<?>[] { List.class };
// first pass
factory.createEvaluator(
source,
resultType,
names,
types,
classes,
Collections.singletonMap("a1", (Object) new SuperCat("superMittens"))
).evaluate(cats);
// second pass
factory.createEvaluator(
source,
resultType,
names,
types,
classes,
Collections.singletonMap("a1", (Object) new Cat("normalMittens"))
).evaluate(cats);
}
}