/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* 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.testcoverage.functional;
import org.assertj.core.api.Assertions;
import org.drools.testcoverage.common.listener.TrackingAgendaEventListener;
import org.drools.testcoverage.common.model.Address;
import org.drools.testcoverage.common.model.Person;
import org.drools.testcoverage.common.util.KieBaseUtil;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieSession;
public class GuidedDecisionTableTest {
private Address barcelonaCityCenter;
private Person johnFromBarcelona;
private Person elizabeth35Years;
private Person william25Years;
private Person oldPeter;
private KieSession kSession;
private TrackingAgendaEventListener rulesFired;
@Before
public void setUp() throws Exception {
barcelonaCityCenter = new Address("City Center",
1,
"Barcelona");
johnFromBarcelona = new Person("John",
18);
oldPeter = new Person("Peter",
70);
johnFromBarcelona.setAddress(barcelonaCityCenter);
elizabeth35Years = new Person("Elizabeth",
35);
william25Years = new Person("William",
25);
}
/**
* Even when there are multiple matching rules, only one is fired.
*/
@Test
public void testUniqueHitPolicy() throws Exception {
initKieSession("uniqueHitPolicy.gdst");
kSession.insert(johnFromBarcelona);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 2 uniqueHitPolicy")).isTrue();
kSession.dispose();
}
/**
* Even when there are multiple matching rules, only one is fired.
* However not the first one, but the one with the highest salience.
*/
@Test
public void testUniqueHitPolicyWithSalience() throws Exception {
initKieSession("uniqueHitPolicyWithSalience.gdst");
kSession.insert(johnFromBarcelona);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 4 uniqueHitPolicyWithSalience")).isTrue();
kSession.dispose();
}
@Test
public void testFirstHitPolicyMatchAll() throws Exception {
initKieSession("firstHitPolicy.gdst");
kSession.insert(elizabeth35Years);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 1 firstHitPolicy")).isTrue();
kSession.dispose();
}
@Test
public void testFirstHitPolicyMatchTwoOfThree() throws Exception {
initKieSession("firstHitPolicy.gdst");
kSession.insert(william25Years);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 2 firstHitPolicy")).isTrue();
kSession.dispose();
}
@Test
public void testResolvedHitPolicy() throws Exception {
initKieSession("resolvedHitPolicy.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 2 resolvedHitPolicy")).isTrue();
kSession.dispose();
}
@Test
public void testResolvedHitPolicyPossibleMatchOnTwoRows() throws Exception {
initKieSession("resolvedHitPolicyPossibleMatchOnTwoRows.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 6 resolvedHitPolicyPossibleMatchOnTwoRows")).isTrue();
kSession.dispose();
}
@Test
public void testResolvedHitPolicyPrioritiesOverSameRow() throws Exception {
initKieSession("resolvedHitPolicyPrioritiesOverSameRow.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 3 resolvedHitPolicyPrioritiesOverSameRow")).isTrue();
kSession.dispose();
}
@Test
public void testResolvedHitPolicyPrioritiesOverSameRowMatchTwoRows() throws Exception {
initKieSession("resolvedHitPolicyPrioritiesOverSameRowMatchTwoRows.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 5 resolvedHitPolicyPrioritiesOverSameRowMatchTwoRows")).isTrue();
kSession.dispose();
}
@Test
public void testResolvedHitPolicyTransitivePriorities() throws Exception {
initKieSession("resolvedHitPolicyTransitivePriorities.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 4 resolvedHitPolicyTransitivePriorities")).isTrue();
kSession.dispose();
}
@Test
public void testResolvedHitPolicyTransitivePrioritiesMatchTwoRows() throws Exception {
initKieSession("resolvedHitPolicyTransitivePrioritiesMatchTwoRows.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(1);
Assertions.assertThat(rulesFired.isRuleFired("Row 3 resolvedHitPolicyTransitivePrioritiesMatchTwoRows")).isTrue();
kSession.dispose();
}
@Test
public void testRuleOrderHitPolicy() throws Exception {
initKieSession("ruleOrderHitPolicy.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(4);
Assertions.assertThat(rulesFired.getRulesFiredOrder()).containsSequence("Row 1 ruleOrderHitPolicy",
"Row 2 ruleOrderHitPolicy",
"Row 3 ruleOrderHitPolicy",
"Row 4 ruleOrderHitPolicy");
kSession.dispose();
}
@Test
public void testRuleOrderHitPolicyTwoOfFour() throws Exception {
initKieSession("ruleOrderHitPolicy.gdst");
kSession.insert(johnFromBarcelona);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(2);
Assertions.assertThat(rulesFired.getRulesFiredOrder()).containsSequence("Row 1 ruleOrderHitPolicy",
"Row 3 ruleOrderHitPolicy");
kSession.dispose();
}
@Test
public void testRuleOrderHitPolicyActivationGroupBeginning() throws Exception {
initKieSession("ruleOrderHitPolicyActivationGroupBeginning.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(3);
Assertions.assertThat(rulesFired.getRulesFiredOrder()).containsSequence("Row 1 ruleOrderHitPolicyActivationGroupBeginning",
"Row 3 ruleOrderHitPolicyActivationGroupBeginning",
"Row 4 ruleOrderHitPolicyActivationGroupBeginning");
kSession.dispose();
}
@Test
public void testRuleOrderHitPolicyActivationGroupEnd() throws Exception {
initKieSession("ruleOrderHitPolicyActivationGroupEnd.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(3);
Assertions.assertThat(rulesFired.getRulesFiredOrder()).containsSequence("Row 1 ruleOrderHitPolicyActivationGroupEnd",
"Row 2 ruleOrderHitPolicyActivationGroupEnd",
"Row 3 ruleOrderHitPolicyActivationGroupEnd");
kSession.dispose();
}
@Test
public void testRuleOrderHitPolicyTwoActivationGroups() throws Exception {
initKieSession("ruleOrderHitPolicyTwoActivationGroups.gdst");
kSession.insert(oldPeter);
kSession.fireAllRules();
Assertions.assertThat(rulesFired.getFiredRules().size()).isEqualTo(4);
Assertions.assertThat(rulesFired.getRulesFiredOrder()).containsSequence("Row 1 ruleOrderHitPolicyTwoActivationGroups",
"Row 3 ruleOrderHitPolicyTwoActivationGroups",
"Row 4 ruleOrderHitPolicyTwoActivationGroups",
"Row 5 ruleOrderHitPolicyTwoActivationGroups");
kSession.dispose();
}
private void initKieSession(String gdstName) {
final Resource resource = KieServices.Factory.get().getResources().newClassPathResource(gdstName,
GuidedDecisionTableTest.class);
final KieBase kBase = KieBaseUtil.getKieBaseFromResources(true,
resource);
kSession = kBase.newKieSession();
rulesFired = new TrackingAgendaEventListener();
kSession.addEventListener(rulesFired);
rulesFired.clear();
}
}