package org.activityinfo.model.expr;
import org.activityinfo.model.expr.eval.EmptyEvalContext;
import org.activityinfo.model.expr.functions.Casting;
import org.activityinfo.model.type.FieldValue;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.junit.Assert.assertThat;
public class ExprEvalTest {
@Test
public void evaluateExpr() {
evaluate("1", 1);
evaluate("1+1", 2);
evaluate("(5+5)/2", 5);
}
@Test
public void evaluateBooleanExpr() {
evaluate("true", true);
evaluate("false", false);
evaluate("true&&true", true);
evaluate("true&&false", false);
evaluate("true||false", true);
evaluate("false||false", false);
evaluate("false||false||true", true);
evaluate("(false||true)&&true", true);
evaluate("true==true", true);
evaluate("true==false", false);
evaluate("true!=false", true);
evaluate("false!=false", false);
evaluate("true!=true", false);
evaluate("!true", false);
evaluate("!false", true);
}
private void evaluate(String exprString, double expectedValue) {
ExprLexer lexer = new ExprLexer(exprString);
ExprParser parser = new ExprParser(lexer);
ExprNode expr = parser.parse();
FieldValue value = expr.evaluate(EmptyEvalContext.INSTANCE);
assertThat(exprString, Casting.toQuantity(value).getValue(), closeTo(expectedValue,0));
}
private void evaluate(String exprString, boolean expectedValue) {
ExprLexer lexer = new ExprLexer(exprString);
ExprParser parser = new ExprParser(lexer);
ExprNode expr = parser.parse();
FieldValue result = expr.evaluate(EmptyEvalContext.INSTANCE);
assertThat(exprString, Casting.toBoolean(result), equalTo(expectedValue));
}
}