package org.activityinfo.model.expr;
import org.activityinfo.model.expr.functions.*;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ExprParserTest {
@Test
public void parseSimple() {
expect("1", new ConstantExpr(1));
expect("(1)", new GroupExpr(new ConstantExpr(1)));
expect("1+2", new FunctionCallNode(PlusFunction.INSTANCE,
new ConstantExpr(1),
new ConstantExpr(2)));
}
@Test
public void parseCompound() {
expect("a.b", new CompoundExpr(new SymbolExpr("a"), new SymbolExpr("b")));
}
@Test
public void parseEqualsSign() {
expect("true==false", new FunctionCallNode(
EqualFunction.INSTANCE,
new ConstantExpr(true),
new ConstantExpr(false)));
}
@Test
public void parseBooleanSimple() {
expect("true", new ConstantExpr(true));
expect("false", new ConstantExpr(false));
expect("true&&false&&false", new FunctionCallNode(BooleanFunctions.AND,
new ConstantExpr(true),
new FunctionCallNode(BooleanFunctions.AND,
new ConstantExpr(false),
new ConstantExpr(false)
)
));
}
@Test
public void parseNested() {
expect("(1+2)/3",
new FunctionCallNode(ArithmeticFunctions.DIVIDE,
new GroupExpr(
new FunctionCallNode(ArithmeticFunctions.BINARY_PLUS,
new ConstantExpr(1),
new ConstantExpr(2))),
new ConstantExpr(3)));
}
@Test
public void parseSymbols() {
expect("{i1}+{i2}+1", new FunctionCallNode(ArithmeticFunctions.BINARY_PLUS,
new SymbolExpr("i1"),
new FunctionCallNode(ArithmeticFunctions.BINARY_PLUS, new SymbolExpr("i2"),
new ConstantExpr(1))));
expect("({class1_i1}+{class2_i2})/{class3_i3}",
new FunctionCallNode(ArithmeticFunctions.DIVIDE,
new GroupExpr(
new FunctionCallNode(ArithmeticFunctions.BINARY_PLUS,
new SymbolExpr("class1_i1"),
new SymbolExpr("class2_i2"))
), new SymbolExpr("class3_i3")));
expect("{s000002_i0009ls}+{s000002_i0009lt}",
new FunctionCallNode(ArithmeticFunctions.BINARY_PLUS,
new SymbolExpr("s000002_i0009ls"),
new SymbolExpr("s000002_i0009lt"))
);
}
@Test
public void parseComparisons() {
expect("A==B", new FunctionCallNode(EqualFunction.INSTANCE,
new SymbolExpr("A"),
new SymbolExpr("B")));
}
@Test
public void parseQuotedSymbol() {
expect("[Year of expenditure]", new SymbolExpr("Year of expenditure"));
}
@Test
public void parseFunctions() {
expect("containsAll({f1},{v1})", new FunctionCallNode(ContainsAllFunction.INSTANCE,
new SymbolExpr("f1"),
new SymbolExpr("v1"))
);
expect("!containsAll({f1},{v1})", new FunctionCallNode(NotFunction.INSTANCE,
new FunctionCallNode(ContainsAllFunction.INSTANCE,
new SymbolExpr("f1"),
new SymbolExpr("v1"))
));
}
@Test
@Ignore("todo")
public void parseCalc() {
expect("{Exp}*{Alloc}*{InCostUnsp}/10000",
new FunctionCallNode(ExprFunctions.get("/"),
new FunctionCallNode(ExprFunctions.get("*"),
new FunctionCallNode(ExprFunctions.get("*"), new SymbolExpr("Exp"), new SymbolExpr("Alloc")),
new SymbolExpr("InCostUnsp")),
new ConstantExpr(10000)));
}
private void expect(String string, ExprNode expr) {
System.out.println("Parsing [" + string + "]");
ExprLexer lexer = new ExprLexer(string);
ExprParser parser = new ExprParser(lexer);
ExprNode actual = parser.parse();
assertEquals(expr, actual);
}
}