/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.queryexpression;
import org.joda.time.ReadableDateTime;
import org.junit.Test;
import com.enonic.cms.core.content.index.ContentIndexConstants;
import static org.junit.Assert.*;
public class DateCompareEvaluatorTest
{
private QueryExpr parseQuery( String query )
{
QueryExpr expr = QueryParser.newInstance().parse( query );
expr = (QueryExpr) expr.evaluate( new FunctionEvaluator() );
expr = (QueryExpr) expr.evaluate( new DateCompareEvaluator() );
return expr;
}
@Test
public void testDateCompareEqual()
{
QueryExpr expr = parseQuery( "x = date('2008-12-01')" );
assertTrue( expr.getExpr() instanceof LogicalExpr );
LogicalExpr logical = (LogicalExpr) expr.getExpr();
assertTrue( logical.getLeft() instanceof CompareExpr );
CompareExpr leftCompare = (CompareExpr) logical.getLeft();
assertTrue( logical.getRight() instanceof CompareExpr );
CompareExpr rightCompare = (CompareExpr) logical.getRight();
assertEquals( CompareExpr.GTE, leftCompare.getOperator() );
assertTrue( leftCompare.getRight() instanceof ValueExpr );
ValueExpr lowerValue = (ValueExpr) leftCompare.getRight();
assertEquals( CompareExpr.LTE, rightCompare.getOperator() );
assertTrue( rightCompare.getRight() instanceof ValueExpr );
ValueExpr upperValue = (ValueExpr) rightCompare.getRight();
assertTrue( lowerValue.isDate() );
ReadableDateTime lowerDate = (ReadableDateTime) lowerValue.getValue();
assertEquals( 0, lowerDate.getHourOfDay() );
assertEquals( 0, lowerDate.getMinuteOfHour() );
assertEquals( 0, lowerDate.getSecondOfMinute() );
assertEquals( 0, lowerDate.getMillisOfSecond() );
assertTrue( upperValue.isDate() );
ReadableDateTime upperDate = (ReadableDateTime) upperValue.getValue();
assertEquals( 23, upperDate.getHourOfDay() );
assertEquals( 59, upperDate.getMinuteOfHour() );
assertEquals( 59, upperDate.getSecondOfMinute() );
assertEquals( 999, upperDate.getMillisOfSecond() );
}
@Test
public void testDateCompareLessThanEqual()
{
QueryExpr expr = parseQuery( "x <= date('2008-12-01')" );
assertTrue( expr.getExpr() instanceof CompareExpr );
CompareExpr compare = (CompareExpr) expr.getExpr();
assertTrue( compare.getRight() instanceof ValueExpr );
ValueExpr value = (ValueExpr) compare.getRight();
assertTrue( value.isDate() );
ReadableDateTime date = (ReadableDateTime) value.getValue();
assertEquals( 23, date.getHourOfDay() );
assertEquals( 59, date.getMinuteOfHour() );
assertEquals( 59, date.getSecondOfMinute() );
assertEquals( 999, date.getMillisOfSecond() );
}
@Test
public void testParseLessThanExpressionWithDateStringValue()
{
QueryExpr expr1 = parseQuery( "publishFrom <= date('2008-12-01')" );
QueryExpr expr2 = parseQuery( "publishFrom <= '2008-12-01'" );
assertEquals( expr1.toString(), expr2.toString() );
}
@Test
public void testParseLessThanExpressionWithDateTimeStringValue()
{
QueryExpr expr1 = parseQuery( "publishFrom <= date('2008-12-01 23:50')" );
QueryExpr expr2 = parseQuery( "publishFrom <= '2008-12-01 23:50'" );
assertEquals( expr1.toString(), expr2.toString() );
}
@Test
public void testParseGreaterThanExpressionWithDateStringValue()
{
QueryExpr expr1 = parseQuery( "publishFrom > date('2008-12-01')" );
QueryExpr expr2 = parseQuery( "publishFrom > '2008-12-01'" );
assertEquals( expr1.toString(), expr2.toString() );
}
@Test
public void testParseGreaterThanExpressionWithDateTimeStringValue()
{
QueryExpr expr1 = parseQuery( "publishFrom > date('2008-12-01 23:50')" );
QueryExpr expr2 = parseQuery( "publishFrom > '2008-12-01 23:50'" );
assertEquals( expr1.toString(), expr2.toString() );
}
@Test
public void testParseEqualExpressionWithDateStringValue()
{
QueryExpr expr1 = parseQuery( "publishFrom = date('2008-12-01')" );
QueryExpr expr2 = parseQuery( "publishFrom = '2008-12-01'" );
assertEquals( expr1.toString(), expr2.toString() );
}
@Test
public void testParseEqualExpressionWithDateTimeStringValue()
{
QueryExpr expr1 = parseQuery( "publishFrom = date('2008-12-01 23:50')" );
QueryExpr expr2 = parseQuery( "publishFrom = '2008-12-01 23:50'" );
assertEquals( expr1.toString(), expr2.toString() );
}
@Test
public void testValidDateFormatWithoutFunction()
{
QueryExpr expr = parseQuery( "publishfrom <= '2008-12-01'" );
Expression expression = expr.getExpr();
assertTrue( expression instanceof CompareExpr );
CompareExpr compExpr = (CompareExpr) expression;
Expression rightExpr = compExpr.getRight();
assertTrue( rightExpr instanceof ValueExpr );
ValueExpr rightValExpr = (ValueExpr) rightExpr;
assertTrue( "Expected right expression value of type date", rightValExpr.isDate() && ( !rightValExpr.isString() ) );
}
@Test
public void testInvalidDateFormatWithoutFunction()
{
QueryExpr expr = parseQuery( "publishfrom <= '2008/12/01'" );
Expression expression = expr.getExpr();
assertTrue( expression instanceof CompareExpr );
CompareExpr compExpr = (CompareExpr) expression;
Expression rightExpr = compExpr.getRight();
assertTrue( rightExpr instanceof ValueExpr );
ValueExpr rightValExpr = (ValueExpr) rightExpr;
assertTrue( "Expected right expression value of type string", rightValExpr.isString() && ( !rightValExpr.isDate() ) );
}
@Test
public void testDateLikeOperation()
{
QueryExpr expr = parseQuery( "publishFrom LIKE '2008-10-10'" );
assertTrue( expr.getExpr() instanceof CompareExpr );
CompareExpr cexpr = (CompareExpr) expr.getExpr();
assertTrue( cexpr.getLeft() instanceof FieldExpr );
assertTrue( cexpr.getRight() instanceof ValueExpr );
assertEquals( CompareExpr.LIKE, cexpr.getOperator() );
ValueExpr rightValExpr = (ValueExpr) cexpr.getRight();
assertTrue( "Expected right expression value of type string", rightValExpr.isString() && ( !rightValExpr.isDate() ) );
}
@Test
public void testDateLikeOperationWithWildcard()
{
QueryExpr expr = parseQuery( "publishFrom LIKE '2008-%'" );
assertTrue( expr.getExpr() instanceof CompareExpr );
CompareExpr cexpr = (CompareExpr) expr.getExpr();
assertTrue( cexpr.getLeft() instanceof FieldExpr );
assertTrue( cexpr.getRight() instanceof ValueExpr );
assertEquals( CompareExpr.LIKE, cexpr.getOperator() );
ValueExpr rightValExpr = (ValueExpr) cexpr.getRight();
assertTrue( "Expected right expression value of type string", rightValExpr.isString() && ( !rightValExpr.isDate() ) );
}
@Test
public void testDateNotLikeOperation()
{
QueryExpr expr = parseQuery( "publishFrom NOT LIKE '2008-10-10'" );
assertTrue( expr.getExpr() instanceof CompareExpr );
CompareExpr cexpr = (CompareExpr) expr.getExpr();
assertTrue( cexpr.getLeft() instanceof FieldExpr );
assertTrue( cexpr.getRight() instanceof ValueExpr );
assertEquals( CompareExpr.NOT_LIKE, cexpr.getOperator() );
ValueExpr rightValExpr = (ValueExpr) cexpr.getRight();
assertTrue( "Expected right expression value of type string", rightValExpr.isString() && ( !rightValExpr.isDate() ) );
}
@Test
public void testNotDateFieldOperation()
{
QueryExpr expr = parseQuery( ContentIndexConstants.F_FULLTEXT + " = '2008-10-10'" );
assertTrue( expr.getExpr() instanceof CompareExpr );
CompareExpr cexpr = (CompareExpr) expr.getExpr();
assertTrue( cexpr.getLeft() instanceof FieldExpr );
assertTrue( cexpr.getRight() instanceof ValueExpr );
assertEquals( CompareExpr.EQ, cexpr.getOperator() );
ValueExpr rightValExpr = (ValueExpr) cexpr.getRight();
assertTrue( "Expected right expression value of type string", rightValExpr.isString() && ( !rightValExpr.isDate() ) );
}
@Test
public void testValidValueExprDate()
{
ValueExpr expr = new ValueExpr( "2010-12-12" );
assertTrue( expr.isValidDateString() );
expr = new ValueExpr( "2010-12-12 23:59:59" );
assertTrue( expr.isValidDateString() );
expr = new ValueExpr( "2010-12-12 23:59" );
assertTrue( expr.isValidDateString() );
expr = new ValueExpr( "2010-12-12T23:59:59" );
assertTrue( expr.isValidDateString() );
}
@Test
public void testInvalidValueExprDate()
{
ValueExpr expr = new ValueExpr( "2010/12/12" );
assertFalse( expr.isValidDateString() );
expr = new ValueExpr( "2010/12/12 23:59:59" );
assertFalse( expr.isValidDateString() );
expr = new ValueExpr( "2010/12/12 23:59" );
assertFalse( expr.isValidDateString() );
expr = new ValueExpr( "2010/12/12T23:59:59" );
assertFalse( expr.isValidDateString() );
expr = new ValueExpr( "2010/12/12" );
assertFalse( expr.isValidDateString() );
}
}