package net.sourceforge.mayfly.evaluation;
import junit.framework.TestCase;
import net.sourceforge.mayfly.datastore.NullCell;
import net.sourceforge.mayfly.evaluation.condition.Equal;
import net.sourceforge.mayfly.parser.Parser;
import net.sourceforge.mayfly.util.MayflyAssert;
public class ExpressionTest extends TestCase {
public void testWhere() throws Exception {
Equal where = (Equal) new Parser("f.name='steve'").parseWhere();
MayflyAssert.assertColumn("f", "name", where.leftSide);
MayflyAssert.assertString("steve", where.rightSide);
}
public void testSameExpression() throws Exception {
Expression one = (Expression) new Parser("x + y * z / 2 || 5").parseWhatElement();
Expression two = (Expression) new Parser("x+((y*z)/2) || 5").parseWhatElement();
assertTrue(one.sameExpression(two));
assertTrue(two.sameExpression(one));
Expression three = (Expression) new Parser("(x + y) * z / 2 || 5").parseWhatElement();
assertFalse(three.sameExpression(one));
}
public void testResolve() throws Exception {
Expression one = new Parser("x + 5 * avg(x) - count(*)").parseExpression().asNonBoolean();
Expression resolved = one.resolve(
new ResultRow().withColumn("foo", "x", NullCell.INSTANCE));
String expectedString = "foo.x + 5 * avg( foo.x ) - count ( * )";
Expression expected = new Parser(expectedString).parseExpression().asNonBoolean();
assertTrue(
"expected " + expectedString + " but was:" + resolved.toString(),
expected.sameExpression(resolved));
// And one should not be mutated
assertFalse(
"expected unchanged but was:" + one.toString(),
expected.sameExpression(one)
);
}
public void testCheck() throws Exception {
ResultRow row = new ResultRow()
.withColumn("foo", "a", NullCell.INSTANCE)
.withColumn("bar", "a", NullCell.INSTANCE);
check("foo.a + bar.a", row);
check("foo.a + bar.a * (bar.a / 5 - foo.a * bar.a)", row);
try {
check("baz.a", row);
fail();
}
catch (NoColumn e) {
assertEquals("no column baz.a", e.getMessage());
}
try {
check("baz.a || 'hi'", row);
fail();
}
catch (NoColumn e) {
assertEquals("no column baz.a", e.getMessage());
}
try {
check("foo.a + bar.a * (bar.a / 5 - foo.a * baz.a)", row);
fail();
}
catch (NoColumn e) {
assertEquals("no column baz.a", e.getMessage());
}
}
private void check(String expressionString, ResultRow row) {
Parser parser = new Parser(expressionString);
Expression expression = (Expression) parser.parseWhatElement();
assertEquals("", parser.remainingTokens());
expression.check(row);
}
}