/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.server.participant.common;
import net.codjo.expression.ExpressionException;
import net.codjo.expression.ExpressionManager;
import net.codjo.expression.FunctionHolder;
import net.codjo.expression.FunctionManager;
import net.codjo.expression.InvalidExpressionException;
import net.codjo.segmentation.server.preference.family.Row;
import net.codjo.segmentation.server.preference.treatment.Expression;
import java.sql.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
/**
* Classe de test de {@link ExpressionsEvaluator}.
*/
public class ExpressionsEvaluatorTest extends TestCase {
private static final IllegalArgumentException BAD_FUNCTION_ERROR =
new IllegalArgumentException("badFunction error");
private FunctionManager functionManager = new FunctionManager();
public void test_compute() throws Exception {
Expression[] expressions =
new Expression[]{
new Expression(Types.INTEGER, "variable", "SRC_COL_B + 2", true),
new Expression(Types.INTEGER, "result", "SRC_COL_A + variable - 2"),
new Expression(Types.INTEGER, "unused", "variable + 2")
};
ColumnType[] srcColumns =
new ColumnType[]{
new ColumnType("COL_A", Types.INTEGER),
new ColumnType("COL_B", Types.INTEGER)
};
String[] resultColumnNames = new String[]{"result"};
ExpressionsEvaluator evaluator =
new ExpressionsEvaluator(createExpressionManager(functionManager,
expressions, srcColumns),
resultColumnNames);
Row row = new Row(new String[]{"COL_A", "COL_B"}, new Object[]{10, 20});
Row result = evaluator.compute(row);
assertSame(resultColumnNames, result.getColumnNames());
assertEquals(30, result.getColumnValue(0));
}
public void test_compute_error() throws Exception {
Expression[] expressions =
new Expression[]{
new Expression(Types.INTEGER, "result", "SRC_COL_A"),
new Expression(Types.INTEGER, "pete", "utils.badFunction(SRC_COL_A)")
};
ColumnType[] srcColumns =
new ColumnType[]{new ColumnType("COL_A", Types.INTEGER)};
String[] resultColumnNames = new String[]{"result", "pete"};
ExpressionsEvaluator evaluator =
new ExpressionsEvaluator(createExpressionManager(functionManager,
expressions, srcColumns),
resultColumnNames);
Row row = new Row(new String[]{"COL_A"}, new Object[]{5});
try {
evaluator.compute(row);
fail();
}
catch (ComputeException ex) {
assertEquals("ExpressionException(1 erreur(s), pete a provoque l'erreur badFunction error, ...)",
ex.getMessage());
ExpressionException cause = (ExpressionException)ex.getCause();
assertEquals(1, cause.getNbError());
assertSame(BAD_FUNCTION_ERROR, cause.getException(0));
Row result = ex.getResultRow();
assertSame(resultColumnNames, result.getColumnNames());
assertEquals(5, result.getColumnValue(0));
assertEquals(0, result.getColumnValue(1));
}
}
private ExpressionManager createExpressionManager(FunctionManager manager,
Expression[] expressions, ColumnType[] srcColumns)
throws InvalidExpressionException {
ExpressionManager expressionManager = new ExpressionManager(manager);
expressionManager.setSourceColumn(toMap(srcColumns));
initExpressions(expressionManager, expressions);
expressionManager.compileExpressions();
return expressionManager;
}
private static void initExpressions(ExpressionManager expressionManager,
Expression[] expressions) {
Map<String, Integer> varCol = new HashMap<String, Integer>();
Map<String, Integer> destCol = new HashMap<String, Integer>();
expressionManager.setVarColumn(varCol);
expressionManager.setDestColumn(destCol);
for (Expression expression : expressions) {
String destField = expression.getDestinationField();
if (expression.isVariable()) {
varCol.put(destField, expression.getType());
}
else {
destCol.put(destField, expression.getType());
}
expressionManager.add(destField, expression.getExpression());
}
}
@Override
protected void setUp() throws Exception {
functionManager.addFunctionHolder(new UtilsForTest());
}
private static Map<String, Integer> toMap(ColumnType[] srcColumns) {
Map<String, Integer> cols = new HashMap<String, Integer>();
for (ColumnType srcColumn : srcColumns) {
cols.put(srcColumn.getName(), srcColumn.getType());
}
return cols;
}
private class ColumnType {
private String name;
private int type;
ColumnType(String name, int type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public int getType() {
return type;
}
}
public static class UtilsForTest implements FunctionHolder {
public List<String> getAllFunctions() {
return null;
}
public String getName() {
return "utils";
}
public int badFunction(int ignored) {
throw BAD_FUNCTION_ERROR;
}
}
}