package com.processpuzzle.persistence.query.domain;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.processpuzzle.commons.persistence.query.AttributeFilter;
import com.processpuzzle.commons.persistence.query.AttributeSelector;
import com.processpuzzle.commons.persistence.query.BooleanOperator;
import com.processpuzzle.commons.persistence.query.BooleanOperators;
import com.processpuzzle.commons.persistence.query.OrderSpecifier;
import com.processpuzzle.commons.persistence.query.OrderingDirections;
import com.processpuzzle.commons.persistence.query.QueryCondition;
import com.processpuzzle.commons.persistence.query.QueryContext;
import com.processpuzzle.commons.persistence.query.QueryOrder;
import com.processpuzzle.persistence.domain.TestEntity;
import com.processpuzzle.persistence.query.transformer.domain.QueryTransformerTest;
public class QueryTest {
private static final String REALLY_SIMPLE_HQL = "select * from com.processpuzzle.framework.persistence.domain.TestEntity as testEntity";
private DefaultQuery reallySimpleQuery;
private DefaultQuery fullFlaggedQuery;
private DefaultQuery cloneOfFullFlaggedQuery;
private DefaultQuery yetAnotherCloneOfFullFlaggedQuery;
@Before
public void beforeEachTests() {
reallySimpleQuery = createReallySimpleQueryForTest();
fullFlaggedQuery = createFullFlaggedQueryForTest();
cloneOfFullFlaggedQuery = fullFlaggedQuery.clone();
yetAnotherCloneOfFullFlaggedQuery = fullFlaggedQuery.clone();
}
@Test
public void testClone() {
assertEquals( fullFlaggedQuery.getTargetClass(), cloneOfFullFlaggedQuery.getTargetClass() );
assertEquals( fullFlaggedQuery.getName(), cloneOfFullFlaggedQuery.getName() );
assertEquals( fullFlaggedQuery.getDescription(), cloneOfFullFlaggedQuery.getDescription() );
assertEquals( fullFlaggedQuery.getAttributeFilter(), cloneOfFullFlaggedQuery.getAttributeFilter() );
assertEquals( fullFlaggedQuery.getQueryCondition(), cloneOfFullFlaggedQuery.getQueryCondition() );
assertEquals( fullFlaggedQuery.getQueryOrder(), cloneOfFullFlaggedQuery.getQueryOrder() );
assertEquals( fullFlaggedQuery.getQueryContext(), cloneOfFullFlaggedQuery.getQueryContext() );
}
@Test
public void testEquals() {
assertTrue( "Check reflexivity.", fullFlaggedQuery.equals( fullFlaggedQuery ) );
assertTrue( "Check symmetry.", cloneOfFullFlaggedQuery.equals( fullFlaggedQuery ) );
assertTrue( "Check symmetry.", fullFlaggedQuery.equals( cloneOfFullFlaggedQuery ) );
assertTrue( "Check transitivity.", fullFlaggedQuery.equals( yetAnotherCloneOfFullFlaggedQuery ) );
assertFalse( "Null chekc.", fullFlaggedQuery.equals( null ) );
}
@SuppressWarnings( "unchecked" )
@Ignore
@Test
public void testParseOQLStatement() throws ClassNotFoundException {
DefaultQuery parsedQuery = DefaultQuery.parseOQLStatement( REALLY_SIMPLE_HQL );
assertThat( (Class<TestEntity>) parsedQuery.getTargetClass(), equalTo( TestEntity.class ) );
}
@Test
public void testToString() {
assertThat( reallySimpleQuery.toString(), equalTo( QueryTransformerTest.REALLY_SIMPLE_HQL ) );
}
@Test
public void testHashCode() {
assertEquals( "If two objects equals than their hash codes also equals.", fullFlaggedQuery.hashCode(), cloneOfFullFlaggedQuery.hashCode() );
}
@After
public void afterEachTests() {
fullFlaggedQuery = null;
cloneOfFullFlaggedQuery = null;
yetAnotherCloneOfFullFlaggedQuery = null;
}
// Static helper functions
public static DefaultQuery createReallySimpleQueryForTest() {
DefaultQuery query = new DefaultQuery( TestEntity.class );
return query;
}
public static DefaultQuery createSimpleQueryForTest() {
DefaultQuery query = new DefaultQuery( TestEntity.class, "Simple test query", "Used to test the functionality of Query class." );
AttributeFilter filter = query.getAttributeFilter();
filter.addAttributeSelector( new AttributeSelector( "id" ) );
filter.addAttributeSelector( new AttributeSelector( "name" ) );
filter.addAttributeSelector( new AttributeSelector( "textAttribute" ) );
filter.addAttributeSelector( new AttributeSelector( "numberAttribute" ) );
filter.addAttributeSelector( new AttributeSelector( "dateAttribute" ) );
// Please note that QueryCondition uses the so called "Reverse Polish Notation" to define logical expression
QueryCondition condition = query.getQueryCondition();
condition.addAttributeCondition( new IntegerAttributeCondition( "numberAttribute", 256, ComparisonOperators.GREATER_OR_EQUAL_TO ) );
condition.addAttributeCondition( new TextAttributeCondition( "name", "bakfity", ComparisonOperators.EQUAL_TO ) );
condition.addBooleanOperator( new BooleanOperator( BooleanOperators.AND ) );
return query;
}
public static DefaultQuery createFullFlaggedQueryForTest() {
DefaultQuery query = createSimpleQueryForTest();
QueryOrder order = query.getQueryOrder();
order.addOrderSpecifier( new OrderSpecifier( "textAttribute", OrderingDirections.Ascending ) );
order.addOrderSpecifier( new OrderSpecifier( "dateAttribute", OrderingDirections.Descending ) );
QueryContext context = query.getQueryContext();
context.addIntegerValueFor( "numberAttribute", 111 );
context.addTextValueFor( "textAttribute", "actual text" );
return query;
}
}