/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.queryexpression;
import java.math.BigDecimal;
import java.util.List;
import org.codehaus.jparsec.Tokens;
import org.codehaus.jparsec.functors.Binary;
import org.codehaus.jparsec.functors.Map;
import org.codehaus.jparsec.functors.Map2;
import org.codehaus.jparsec.functors.Map3;
import org.codehaus.jparsec.functors.Unary;
import org.junit.Test;
import com.google.common.collect.Lists;
import static org.junit.Assert.*;
public class QueryMapperTest
{
@Test
public void testStringToNumberExpr()
{
final Map<String, ValueExpr> map = QueryMapper.stringToNumberExpr();
final ValueExpr v1 = map.map( "1.88" );
assertNotNull( v1 );
assertEquals( new BigDecimal( "1.88" ), v1.getValue() );
}
@Test
public void testStringToStringExpr()
{
final Map<String, ValueExpr> map = QueryMapper.stringToStringExpr();
final ValueExpr v1 = map.map( "ab" );
assertNotNull( v1 );
assertEquals( "ab", v1.getValue() );
}
@Test
public void testStringToFieldExpr()
{
final Map<String, FieldExpr> map = QueryMapper.stringToFieldExpr();
final FieldExpr v1 = map.map( "abc/def.ghi" );
assertNotNull( v1 );
assertEquals( "abc/def.ghi", v1.getPath() );
}
@Test
public void testStringToFragment()
{
final Map<String, Tokens.Fragment> map = QueryMapper.stringToFragment( "tag" );
final Tokens.Fragment v1 = map.map( "hello" );
assertNotNull( v1 );
assertEquals( "hello", v1.text() );
assertEquals( "tag", v1.tag() );
}
@Test
public void testCompareExprMapper()
{
final Map3<FieldExpr, Integer, Expression, CompareExpr> map = QueryMapper.compareExprMapper();
final CompareExpr v1 = map.map( new FieldExpr( "a" ), CompareExpr.EQ, new ValueExpr( 1 ) );
assertNotNull( v1.getLeft() );
assertEquals( "a", v1.getLeft().toString() );
assertNotNull( v1.getRight() );
assertEquals( "1.0", v1.getRight().toString() );
assertEquals( CompareExpr.EQ, v1.getOperator() );
}
@Test
public void testValuesToArrayExpr()
{
final Map<List<ValueExpr>, ArrayExpr> map = QueryMapper.valuesToArrayExpr();
final List<ValueExpr> list = Lists.newArrayList( new ValueExpr( 1 ), new ValueExpr( 2 ) );
final ArrayExpr v1 = map.map( list );
assertNotNull( v1 );
assertNotNull( v1.getValues() );
assertEquals( 2, v1.getValues().length );
assertEquals( "1.0", v1.getValues()[0].toString() );
assertEquals( "2.0", v1.getValues()[1].toString() );
}
@Test
public void testFunctionExprMapper()
{
final Map2<String, ArrayExpr, FunctionExpr> map = QueryMapper.functionExprMapper();
final FunctionExpr v1 = map.map( "func", new ArrayExpr( new ValueExpr[]{new ValueExpr( 1 )} ) );
assertNotNull( v1 );
assertEquals( "func", v1.getName() );
assertNotNull( v1.getArguments() );
}
@Test
public void testPrefixSuffixMapper()
{
Map<ValueExpr, ValueExpr> map = QueryMapper.prefixSuffixMapper( null, null );
ValueExpr value = map.map( new ValueExpr( "ab" ) );
assertNotNull( value );
assertEquals( "ab", value.getValue() );
map = QueryMapper.prefixSuffixMapper( "%", null );
value = map.map( new ValueExpr( "ab" ) );
assertNotNull( value );
assertEquals( "%ab", value.getValue() );
map = QueryMapper.prefixSuffixMapper( null, "%" );
value = map.map( new ValueExpr( "ab" ) );
assertNotNull( value );
assertEquals( "ab%", value.getValue() );
map = QueryMapper.prefixSuffixMapper( "%", "%" );
value = map.map( new ValueExpr( "ab" ) );
assertNotNull( value );
assertEquals( "%ab%", value.getValue() );
}
@Test
public void testLogicalExprMapper()
{
final Expression left = new ValueExpr( "a" );
final Expression right = new ValueExpr( "b" );
Binary<Expression> map = QueryMapper.logicalExprMapper( LogicalExpr.AND );
Expression value = map.map( left, right );
assertNotNull( value );
assertSame( LogicalExpr.class, value.getClass() );
assertEquals( LogicalExpr.AND, ( (LogicalExpr) value ).getOperator() );
assertSame( left, ( (LogicalExpr) value ).getLeft() );
assertSame( right, ( (LogicalExpr) value ).getRight() );
}
@Test
public void testNotExprMapper()
{
final Expression expr = new ValueExpr( 1 );
final Unary<Expression> map = QueryMapper.notExprMapper();
final Expression value = map.map( expr );
assertNotNull( value );
assertSame( NotExpr.class, value.getClass() );
assertSame( expr, ( (NotExpr) value ).getExpr() );
}
@Test
public void testOrderByExprMapper()
{
final Map<List<OrderFieldExpr>, OrderByExpr> map = QueryMapper.orderByExprMapper();
final List<OrderFieldExpr> list = Lists.newArrayList( new OrderFieldExpr( new FieldExpr( "a" ), true ) );
final OrderByExpr value = map.map( list );
assertNotNull( value );
assertEquals( 1, value.getFields().length );
assertSame( list.get( 0 ), value.getFields()[0] );
}
@Test
public void testOrderFieldExprMapper()
{
final Map2<FieldExpr, Boolean, OrderFieldExpr> map = QueryMapper.orderFieldExprMapper();
final FieldExpr field = new FieldExpr( "a" );
final OrderFieldExpr value = map.map( field, true );
assertNotNull( value );
assertEquals( true, value.isDescending() );
assertSame( field, value.getField() );
}
@Test
public void testQueryExprMapper()
{
final Map2<Expression, OrderByExpr, QueryExpr> map = QueryMapper.queryExprMapper();
final Expression expr = new ValueExpr( "a" );
final OrderByExpr orderBy = new OrderByExpr( new OrderFieldExpr[0] );
final QueryExpr value = map.map( expr, orderBy );
assertNotNull( value );
assertSame( expr, value.getExpr() );
assertSame( orderBy, value.getOrderBy() );
}
}