/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.emulation.hibernate3.ast.whereClause;
import static java.util.Arrays.*;
import java.util.*;
import mockit.emulation.hibernate3.ast.*;
import static org.junit.Assert.*;
import org.junit.*;
public final class EqualityExprTest
{
private QueryEval eval = new QueryEval();
private Map<Object, Object> parameters = new HashMap<Object, Object>();
@Test
public void parseEQ()
{
EqualityExpr eqExpr = parseEquality("a.b = 46");
assertTrue(eqExpr.lhsExpr instanceof AccessPathExpr);
assertTrue(eqExpr.rhsExpr instanceof ConstantExpr);
assertEquals("=", eqExpr.operator);
}
private EqualityExpr parseEquality(String ql)
{
Tokens tokens = new Tokens(ql);
Expr expr = EqualityExpr.parse(tokens);
assertTrue(expr instanceof EqualityExpr);
assertFalse(tokens.hasNext());
return (EqualityExpr) expr;
}
@Test
public void parseNE()
{
EqualityExpr eqExpr = parseEquality("5.09 != g.jk");
assertTrue(eqExpr.lhsExpr instanceof ConstantExpr);
assertTrue(eqExpr.rhsExpr instanceof AccessPathExpr);
assertEquals("!=", eqExpr.operator);
}
@Test
public void parseSQL_NE()
{
EqualityExpr eqExpr = parseEquality("0 - 1 <> 4 / 3");
assertTrue(eqExpr.lhsExpr instanceof AdditiveExpr);
assertTrue(eqExpr.rhsExpr instanceof MultiplyExpr);
assertEquals("<>", eqExpr.operator);
}
@Test
public void parseIS()
{
EqualityExpr eqExpr = parseEquality("xy is null");
assertTrue(eqExpr.lhsExpr instanceof AccessPathExpr);
assertTrue(eqExpr.rhsExpr instanceof ConstantExpr);
assertEquals("is", eqExpr.operator);
}
@Test
public void parseISNOT()
{
EqualityExpr eqExpr = parseEquality("xy || abc IS NOT null");
assertTrue(eqExpr.lhsExpr instanceof ConcatenationExpr);
assertTrue(eqExpr.rhsExpr instanceof ConstantExpr);
assertEquals("isnot", eqExpr.operator);
}
@Test
public void parseRelationalExpr()
{
Tokens tokens = new Tokens("1 < 2");
Expr expr = EqualityExpr.parse(tokens);
assertTrue(expr instanceof RelationalExpr);
assertFalse(tokens.hasNext());
}
@Test(expected = QuerySyntaxException.class)
public void parseWithSyntaxError()
{
EqualityExpr.parse(new Tokens("1 = !"));
}
@Test
public void parseRelationalExprFollowedBySomething()
{
Tokens tokens = new Tokens("1 >= -6 and");
Expr expr = EqualityExpr.parse(tokens);
assertTrue(expr instanceof RelationalExpr);
assertEquals(2, tokens.getPosition());
}
@Test
public void evaluateEQ()
{
assertEvaluateAsTrue("46 = 46");
}
private void assertEvaluateAsTrue(String ql)
{
EqualityExpr eqExpr = parseEquality(ql);
assertTrue(eqExpr.evaluate(eval));
}
@Test
public void evaluateNE()
{
assertEvaluateAsTrue("'Abc' != 'XYZ'");
}
@Test
public void evaluateSQL_NE()
{
assertEvaluateAsTrue("-4 <> 4.0");
}
@Test
public void evaluateIS_NULL()
{
eval = new QueryEval(parameters);
assertEvaluateAsTrue("? is null");
}
@Test
public void evaluateIS_EMPTY()
{
parameters.put(0, Collections.EMPTY_LIST);
eval = new QueryEval(parameters);
assertEvaluateAsTrue("? is empty");
}
@Test(expected = IllegalStateException.class)
public void evaluateISInvalidValue()
{
parameters.put(0, 5);
eval = new QueryEval(parameters);
assertEvaluateAsTrue("? is true");
}
@Test
public void evaluateISNOT_NULL()
{
parameters.put(2, 5);
eval = new QueryEval(parameters);
assertEvaluateAsTrue("?2 is not null");
}
@Test
public void evaluateISNOT_EMPTY()
{
parameters.put(2, asList(5));
eval = new QueryEval(parameters);
assertEvaluateAsTrue("?2 is not empty");
}
@Test(expected = IllegalStateException.class)
public void evaluateISNOTInvalidValue()
{
parameters.put(2, 5);
eval = new QueryEval(parameters);
assertEvaluateAsTrue("?2 is not 32");
}
}