/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.verifier.incompatibility; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; import org.drools.StatelessSession; import org.drools.StatelessSessionResult; import org.drools.base.RuleNameMatchesAgendaFilter; import org.drools.base.evaluators.Operator; import org.drools.verifier.TestBase; import org.drools.verifier.VerifierComponentMockFactory; import org.drools.verifier.components.LiteralRestriction; import org.drools.verifier.components.ObjectType; import org.drools.verifier.components.Pattern; import org.drools.verifier.components.Variable; import org.drools.verifier.components.VariableRestriction; import org.drools.verifier.components.VerifierComponentType; import org.drools.verifier.components.VerifierRule; import org.drools.verifier.report.components.Cause; public class IncompatibilityRestrictionsTest extends IncompatibilityBase { public void testLiteralRestrictionsIncompatibilityLessOrEqual() throws Exception { StatelessSession session = getStatelessSession( this.getClass().getResourceAsStream( "Restrictions.drl" ) ); session.setAgendaFilter( new RuleNameMatchesAgendaFilter( "Incompatible LiteralRestrictions with ranges in pattern possibility, impossible equality less or equal" ) ); Collection<Object> data = new ArrayList<Object>(); Pattern pattern1 = VerifierComponentMockFactory.createPattern1(); Pattern pattern2 = VerifierComponentMockFactory.createPattern2(); /* * Working pair */ LiteralRestriction r1 = LiteralRestriction.createRestriction( pattern1, "10" ); r1.setOperator( Operator.EQUAL ); r1.setFieldPath( "0" ); r1.setOrderNumber( 0 ); LiteralRestriction r2 = LiteralRestriction.createRestriction( pattern1, "1" ); r2.setOperator( Operator.LESS ); r2.setFieldPath( "0" ); r2.setOrderNumber( 2 ); /* * Pair that doesn't work. */ LiteralRestriction r3 = LiteralRestriction.createRestriction( pattern2, "1" ); r3.setOperator( Operator.GREATER_OR_EQUAL ); r3.setFieldPath( "1" ); r3.setOrderNumber( 0 ); LiteralRestriction r4 = LiteralRestriction.createRestriction( pattern2, "10" ); r4.setOperator( Operator.EQUAL ); r4.setFieldPath( "1" ); r4.setOrderNumber( 1 ); data.add( r1 ); data.add( r2 ); data.add( r3 ); data.add( r4 ); StatelessSessionResult sessionResult = session.executeWithResults( data ); Map<Cause, Set<Cause>> map = createIncompatibilityMap( VerifierComponentType.RESTRICTION, sessionResult.iterateObjects() ); assertTrue( (TestBase.causeMapContains( map, r1, r2 ) ^ TestBase.causeMapContains( map, r2, r1 )) ); if ( !map.isEmpty() ) { fail( "More incompatibilities than was expected." ); } } public void testLiteralRestrictionsIncompatibilityGreater() throws Exception { StatelessSession session = getStatelessSession( this.getClass().getResourceAsStream( "Restrictions.drl" ) ); session.setAgendaFilter( new RuleNameMatchesAgendaFilter( "Incompatible LiteralRestrictions with ranges in pattern possibility, impossible equality greater" ) ); Collection<Object> data = new ArrayList<Object>(); Pattern pattern1 = VerifierComponentMockFactory.createPattern1(); Pattern pattern2 = VerifierComponentMockFactory.createPattern2(); /* * Working pair */ LiteralRestriction r1 = LiteralRestriction.createRestriction( pattern1, "10" ); r1.setOperator( Operator.GREATER ); r1.setFieldPath( "0" ); r1.setOrderNumber( 0 ); LiteralRestriction r2 = LiteralRestriction.createRestriction( pattern1, "1" ); r2.setOperator( Operator.EQUAL ); r2.setFieldPath( "0" ); r2.setOrderNumber( 1 ); /* * Pair that doesn't work. */ LiteralRestriction r3 = LiteralRestriction.createRestriction( pattern2, "1" ); r3.setOperator( Operator.GREATER_OR_EQUAL ); r3.setFieldPath( "1" ); r3.setOrderNumber( 0 ); LiteralRestriction r4 = LiteralRestriction.createRestriction( pattern2, "10" ); r4.setOperator( Operator.EQUAL ); r4.setFieldPath( "1" ); r4.setOrderNumber( 1 ); data.add( r1 ); data.add( r2 ); data.add( r3 ); data.add( r4 ); StatelessSessionResult sessionResult = session.executeWithResults( data ); Map<Cause, Set<Cause>> map = createIncompatibilityMap( VerifierComponentType.RESTRICTION, sessionResult.iterateObjects() ); assertTrue( (TestBase.causeMapContains( map, r1, r2 ) ^ TestBase.causeMapContains( map, r2, r1 )) ); if ( !map.isEmpty() ) { fail( "More incompatibilities than was expected." ); } } public void testLiteralRestrictionsIncompatibilityImpossibleRange() throws Exception { StatelessSession session = getStatelessSession( this.getClass().getResourceAsStream( "Restrictions.drl" ) ); session.setAgendaFilter( new RuleNameMatchesAgendaFilter( "Incompatible LiteralRestrictions with ranges in pattern possibility, impossible range" ) ); Collection<Object> data = new ArrayList<Object>(); Pattern pattern1 = VerifierComponentMockFactory.createPattern1(); Pattern pattern2 = VerifierComponentMockFactory.createPattern2(); /* * Working pair */ LiteralRestriction r1 = LiteralRestriction.createRestriction( pattern1, "10" ); r1.setOperator( Operator.GREATER ); r1.setFieldPath( "0" ); r1.setOrderNumber( 0 ); LiteralRestriction r2 = LiteralRestriction.createRestriction( pattern1, "10" ); r2.setOperator( Operator.LESS ); r2.setFieldPath( "0" ); r2.setOrderNumber( 1 ); /* * Pair that doesn't work. */ LiteralRestriction r3 = LiteralRestriction.createRestriction( pattern2, "1" ); r3.setOperator( Operator.GREATER_OR_EQUAL ); r3.setFieldPath( "1" ); r3.setOrderNumber( 0 ); LiteralRestriction r4 = LiteralRestriction.createRestriction( pattern2, "" ); r4.setOperator( Operator.EQUAL ); r4.setFieldPath( "1" ); r4.setOrderNumber( 1 ); data.add( r1 ); data.add( r2 ); data.add( r3 ); data.add( r4 ); StatelessSessionResult sessionResult = session.executeWithResults( data ); Map<Cause, Set<Cause>> map = createIncompatibilityMap( VerifierComponentType.RESTRICTION, sessionResult.iterateObjects() ); assertTrue( (TestBase.causeMapContains( map, r1, r2 ) ^ TestBase.causeMapContains( map, r2, r1 )) ); if ( !map.isEmpty() ) { fail( "More incompatibilities than was expected." ); } } public void testVariableRestrictionsIncompatibilityImpossibleRange() throws Exception { StatelessSession session = getStatelessSession( this.getClass().getResourceAsStream( "Restrictions.drl" ) ); session.setAgendaFilter( new RuleNameMatchesAgendaFilter( "Incoherent VariableRestrictions in pattern possibility, impossible range" ) ); Collection<Object> data = new ArrayList<Object>(); VerifierRule rule = VerifierComponentMockFactory.createRule1(); ObjectType objectType = new ObjectType(); objectType.setFullName( "org.test.Person" ); Pattern pattern1 = VerifierComponentMockFactory.createPattern1(); Pattern pattern2 = VerifierComponentMockFactory.createPattern2(); /* * Working pair */ Variable variable1 = new Variable( rule ); variable1.setObjectTypePath( "0" ); variable1.setObjectTypeType( VerifierComponentType.FIELD.getType() ); variable1.setOrderNumber( 11 ); VariableRestriction r1 = new VariableRestriction( pattern1 ); r1.setOperator( Operator.GREATER ); r1.setFieldPath( "0" ); r1.setVariable( variable1 ); r1.setOrderNumber( 0 ); VariableRestriction r2 = new VariableRestriction( pattern1 ); r2.setOperator( Operator.LESS ); r2.setFieldPath( "0" ); r2.setVariable( variable1 ); r2.setOrderNumber( 1 ); /* * Pair that doesn't work. */ Variable variable2 = new Variable( rule ); variable2.setObjectTypePath( "1" ); variable2.setObjectTypeType( VerifierComponentType.FIELD.getType() ); variable2.setOrderNumber( 10 ); VariableRestriction r3 = new VariableRestriction( pattern2 ); r3.setOperator( Operator.GREATER_OR_EQUAL ); r3.setFieldPath( "1" ); r3.setVariable( variable2 ); r3.setOrderNumber( 0 ); VariableRestriction r4 = new VariableRestriction( pattern2 ); r4.setOperator( Operator.EQUAL ); r4.setFieldPath( "1" ); r4.setVariable( variable2 ); r4.setOrderNumber( 1 ); data.add( r1 ); data.add( r2 ); data.add( r3 ); data.add( r4 ); StatelessSessionResult sessionResult = session.executeWithResults( data ); Map<Cause, Set<Cause>> map = createIncompatibilityMap( VerifierComponentType.RESTRICTION, sessionResult.iterateObjects() ); assertTrue( (TestBase.causeMapContains( map, r1, r2 ) ^ TestBase.causeMapContains( map, r2, r1 )) ); if ( !map.isEmpty() ) { fail( "More incompatibilities than was expected." ); } } }